Compare commits

..

1 Commits

Author SHA1 Message Date
Matthias
4f1e249574 Merge pull request #12452 from freqtrade/new_release
New release 2025.10
2025-10-31 16:53:02 +01:00
160 changed files with 8924 additions and 11204 deletions

View File

@@ -2,7 +2,7 @@ version: 2
updates: updates:
- package-ecosystem: docker - package-ecosystem: docker
cooldown: cooldown:
default-days: 7 default-days: 4
directories: directories:
- "/" - "/"
- "/docker" - "/docker"
@@ -16,7 +16,7 @@ updates:
- package-ecosystem: devcontainers - package-ecosystem: devcontainers
directory: "/" directory: "/"
cooldown: cooldown:
default-days: 7 default-days: 4
schedule: schedule:
interval: daily interval: daily
open-pull-requests-limit: 10 open-pull-requests-limit: 10
@@ -24,7 +24,7 @@ updates:
- package-ecosystem: pip - package-ecosystem: pip
directory: "/" directory: "/"
cooldown: cooldown:
default-days: 7 default-days: 4
exclude: exclude:
- ccxt - ccxt
schedule: schedule:
@@ -51,7 +51,7 @@ updates:
- package-ecosystem: "github-actions" - package-ecosystem: "github-actions"
directory: "/" directory: "/"
cooldown: cooldown:
default-days: 7 default-days: 4
schedule: schedule:
interval: "weekly" interval: "weekly"
open-pull-requests-limit: 10 open-pull-requests-limit: 10

View File

@@ -15,7 +15,7 @@ jobs:
environment: environment:
name: develop name: develop
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
@@ -34,7 +34,7 @@ jobs:
run: python build_helpers/binance_update_lev_tiers.py run: python build_helpers/binance_update_lev_tiers.py
- uses: peter-evans/create-pull-request@84ae59a2cdc2258d6fa0732dd66352dddae2a412 # v7.0.9 - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with: with:
token: ${{ secrets.REPO_SCOPED_TOKEN }} token: ${{ secrets.REPO_SCOPED_TOKEN }}
add-paths: freqtrade/exchange/binance_leverage_tiers.json add-paths: freqtrade/exchange/binance_leverage_tiers.json

View File

@@ -28,7 +28,7 @@ jobs:
python-version: ["3.11", "3.12", "3.13"] python-version: ["3.11", "3.12", "3.13"]
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
@@ -38,7 +38,7 @@ jobs:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4 uses: astral-sh/setup-uv@3259c6206f993105e3a61b142c2d97bf4b9ef83d # v7.1.0
with: with:
activate-environment: true activate-environment: true
enable-cache: true enable-cache: true
@@ -74,17 +74,15 @@ jobs:
run: | run: |
pytest --random-order --cov=freqtrade --cov=freqtrade_client --cov-config=.coveragerc pytest --random-order --cov=freqtrade --cov=freqtrade_client --cov-config=.coveragerc
- uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1 - name: Coveralls
if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04')
with:
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}
- name: Cleanup codecov dirty state files
if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04') if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04')
env:
# Coveralls token. Not used as secret due to github not providing secrets to forked repositories
COVERALLS_REPO_TOKEN: 6D1m0xupS3FgutfuGao8keFf9Hc0FpIXu
run: | run: |
# See https://github.com/codecov/codecov-action/issues/1851 # Allow failure for coveralls
rm -rf codecov codecov.SHA256SUM codecov.SHA256SUM.sig uv pip install coveralls
coveralls || true
- name: Run json schema extract - name: Run json schema extract
# This should be kept before the repository check to ensure that the schema is up-to-date # This should be kept before the repository check to ensure that the schema is up-to-date
@@ -93,12 +91,12 @@ jobs:
- name: Run command docs partials extract - name: Run command docs partials extract
# This should be kept before the repository check to ensure that the docs are up-to-date # This should be kept before the repository check to ensure that the docs are up-to-date
if: ${{ (matrix.python-version == '3.13') }}
run: | run: |
python build_helpers/create_command_partials.py python build_helpers/create_command_partials.py
- name: Check for repository changes - *nix - name: Check for repository changes - *nix
if: ${{ (runner.os != 'Windows') }} # TODO: python 3.13 slightly changed the output of argparse.
if: ${{ (matrix.python-version != '3.13') && (runner.os != 'Windows') }}
run: | run: |
if [ -n "$(git status --porcelain)" ]; then if [ -n "$(git status --porcelain)" ]; then
echo "Repository is dirty, changes detected:" echo "Repository is dirty, changes detected:"
@@ -177,7 +175,7 @@ jobs:
name: "Mypy Version Check" name: "Mypy Version Check"
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
@@ -195,7 +193,7 @@ jobs:
name: "Pre-commit checks" name: "Pre-commit checks"
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
@@ -208,7 +206,7 @@ jobs:
name: "Documentation build" name: "Documentation build"
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
@@ -240,7 +238,7 @@ jobs:
name: "Tests and Linting - Online tests" name: "Tests and Linting - Online tests"
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
@@ -250,7 +248,7 @@ jobs:
python-version: "3.12" python-version: "3.12"
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4 uses: astral-sh/setup-uv@3259c6206f993105e3a61b142c2d97bf4b9ef83d # v7.1.0
with: with:
activate-environment: true activate-environment: true
enable-cache: true enable-cache: true
@@ -275,7 +273,10 @@ jobs:
# Notify only once - when CI completes (and after deploy) in case it's successful # Notify only once - when CI completes (and after deploy) in case it's successful
notify-complete: notify-complete:
needs: [ needs: [
build, tests,
docs-check,
mypy-version-check,
pre-commit,
build-linux-online build-linux-online
] ]
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
@@ -303,24 +304,12 @@ jobs:
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }} webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
build: build:
if: always()
name: "Build" name: "Build"
needs: [ needs: [ tests, docs-check, mypy-version-check, pre-commit ]
tests,
docs-check,
mypy-version-check,
pre-commit,
]
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v5
- name: Decide whether the needed jobs succeeded or failed
uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
with:
jobs: ${{ toJSON(needs) }}
- uses: actions/checkout@v6.0.0
with: with:
persist-credentials: false persist-credentials: false
@@ -335,7 +324,7 @@ jobs:
python -m build --sdist --wheel python -m build --sdist --wheel
- name: Upload artifacts 📦 - name: Upload artifacts 📦
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v4
with: with:
name: freqtrade-build name: freqtrade-build
path: | path: |
@@ -348,7 +337,7 @@ jobs:
python -m build --sdist --wheel ft_client python -m build --sdist --wheel ft_client
- name: Upload artifacts 📦 - name: Upload artifacts 📦
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v4
with: with:
name: freqtrade-client-build name: freqtrade-client-build
path: | path: |
@@ -367,12 +356,12 @@ jobs:
id-token: write id-token: write
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
- name: Download artifact 📦 - name: Download artifact 📦
uses: actions/download-artifact@v6 uses: actions/download-artifact@v5
with: with:
pattern: freqtrade*-build pattern: freqtrade*-build
path: dist path: dist
@@ -396,12 +385,12 @@ jobs:
id-token: write id-token: write
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
- name: Download artifact 📦 - name: Download artifact 📦
uses: actions/download-artifact@v6 uses: actions/download-artifact@v5
with: with:
pattern: freqtrade*-build pattern: freqtrade*-build
path: dist path: dist
@@ -414,7 +403,10 @@ jobs:
docker-build: docker-build:
name: "Docker Build and Deploy" name: "Docker Build and Deploy"
needs: [ needs: [
build, 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' if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'release') && github.repository == 'freqtrade/freqtrade'
uses: ./.github/workflows/docker-build.yml uses: ./.github/workflows/docker-build.yml

View File

@@ -19,7 +19,7 @@ jobs:
name: Deploy Docs through mike name: Deploy Docs through mike
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: true persist-credentials: true

View File

@@ -24,7 +24,7 @@ jobs:
packages: write packages: write
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry

View File

@@ -33,7 +33,7 @@ jobs:
if: github.repository == 'freqtrade/freqtrade' if: github.repository == 'freqtrade/freqtrade'
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
@@ -48,7 +48,7 @@ jobs:
password: ${{ secrets.DOCKER_PASSWORD }} password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
with: with:
cache-image: false cache-image: false
@@ -152,7 +152,7 @@ jobs:
if: github.repository == 'freqtrade/freqtrade' if: github.repository == 'freqtrade/freqtrade'
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -11,7 +11,7 @@ jobs:
dockerHubDescription: dockerHubDescription:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -13,7 +13,7 @@ jobs:
auto-update: auto-update:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6.0.0 - uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
@@ -28,7 +28,7 @@ jobs:
- name: Run auto-update - name: Run auto-update
run: pre-commit autoupdate run: pre-commit autoupdate
- uses: peter-evans/create-pull-request@84ae59a2cdc2258d6fa0732dd66352dddae2a412 # v7.0.9 - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with: with:
token: ${{ secrets.REPO_SCOPED_TOKEN }} token: ${{ secrets.REPO_SCOPED_TOKEN }}
add-paths: .pre-commit-config.yaml add-paths: .pre-commit-config.yaml

View File

@@ -14,7 +14,6 @@ permissions: {}
jobs: jobs:
zizmor: zizmor:
name: Run zizmor 🌈
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
security-events: write security-events: write
@@ -22,9 +21,9 @@ jobs:
# actions: read # only needed for private repos # actions: read # only needed for private repos
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v6.0.0 uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Run zizmor 🌈 - name: Run zizmor 🌈
uses: zizmorcore/zizmor-action@e639db99335bc9038abc0e066dfcd72e23d26fb4 # v0.3.0 uses: zizmorcore/zizmor-action@e673c3917a1aef3c65c972347ed84ccd013ecda4 # v0.2.0

View File

@@ -21,7 +21,7 @@ repos:
# stages: [push] # stages: [push]
- repo: https://github.com/pre-commit/mirrors-mypy - repo: https://github.com/pre-commit/mirrors-mypy
rev: "v1.19.0" rev: "v1.18.2"
hooks: hooks:
- id: mypy - id: mypy
exclude: build_helpers exclude: build_helpers
@@ -30,8 +30,8 @@ repos:
- types-filelock==3.2.7 - types-filelock==3.2.7
- types-requests==2.32.4.20250913 - types-requests==2.32.4.20250913
- types-tabulate==0.9.0.20241207 - types-tabulate==0.9.0.20241207
- types-python-dateutil==2.9.0.20251115 - types-python-dateutil==2.9.0.20251008
- scipy-stubs==1.16.3.1 - scipy-stubs==1.16.2.4
- SQLAlchemy==2.0.44 - SQLAlchemy==2.0.44
# stages: [push] # stages: [push]
@@ -44,7 +44,7 @@ repos:
- repo: https://github.com/charliermarsh/ruff-pre-commit - repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version. # Ruff version.
rev: 'v0.14.7' rev: 'v0.14.2'
hooks: hooks:
- id: ruff - id: ruff
- id: ruff-format - id: ruff-format
@@ -83,6 +83,6 @@ repos:
# Ensure github actions remain safe # Ensure github actions remain safe
- repo: https://github.com/woodruffw/zizmor-pre-commit - repo: https://github.com/woodruffw/zizmor-pre-commit
rev: v1.18.0 rev: v1.16.0
hooks: hooks:
- id: zizmor - id: zizmor

View File

@@ -1,6 +1,6 @@
# ![freqtrade](https://raw.githubusercontent.com/freqtrade/freqtrade/develop/docs/assets/freqtrade_poweredby.svg) # ![freqtrade](https://raw.githubusercontent.com/freqtrade/freqtrade/develop/docs/assets/freqtrade_poweredby.svg)
[![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml) [![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/)
[![DOI](https://joss.theoj.org/papers/10.21105/joss.04864/status.svg)](https://doi.org/10.21105/joss.04864) [![DOI](https://joss.theoj.org/papers/10.21105/joss.04864/status.svg)](https://doi.org/10.21105/joss.04864)
[![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop) [![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop)
[![Documentation](https://readthedocs.org/projects/freqtrade/badge/)](https://www.freqtrade.io) [![Documentation](https://readthedocs.org/projects/freqtrade/badge/)](https://www.freqtrade.io)

View File

@@ -1,71 +1,53 @@
import subprocess # noqa: S404, RUF100 import subprocess # noqa: S404, RUF100
import sys
from pathlib import Path from pathlib import Path
def _write_partial_file(filename: str, content: str): subcommands = [
with Path(filename).open("w") as f: "trade",
f.write(f"``` output\n{content}\n```\n") "create-userdir",
"new-config",
"show-config",
"new-strategy",
"download-data",
"convert-data",
"convert-trade-data",
"trades-to-ohlcv",
"list-data",
"backtesting",
"backtesting-show",
"backtesting-analysis",
"edge",
"hyperopt",
"hyperopt-list",
"hyperopt-show",
"list-exchanges",
"list-markets",
"list-pairs",
"list-strategies",
"list-hyperoptloss",
"list-freqaimodels",
"list-timeframes",
"show-trades",
"test-pairlist",
"convert-db",
"install-ui",
"plot-dataframe",
"plot-profit",
"webserver",
"strategy-updater",
"lookahead-analysis",
"recursive-analysis",
]
result = subprocess.run(["freqtrade", "--help"], capture_output=True, text=True)
with Path("docs/commands/main.md").open("w") as f:
f.write(f"```\n{result.stdout}\n```\n")
def extract_command_partials(): for command in subcommands:
subcommands = [ print(f"Running for {command}")
"trade", result = subprocess.run(["freqtrade", command, "--help"], capture_output=True, text=True)
"create-userdir",
"new-config",
"show-config",
"new-strategy",
"download-data",
"convert-data",
"convert-trade-data",
"trades-to-ohlcv",
"list-data",
"backtesting",
"backtesting-show",
"backtesting-analysis",
"edge",
"hyperopt",
"hyperopt-list",
"hyperopt-show",
"list-exchanges",
"list-markets",
"list-pairs",
"list-strategies",
"list-hyperoptloss",
"list-freqaimodels",
"list-timeframes",
"show-trades",
"test-pairlist",
"convert-db",
"install-ui",
"plot-dataframe",
"plot-profit",
"webserver",
"strategy-updater",
"lookahead-analysis",
"recursive-analysis",
]
result = subprocess.run(["freqtrade", "--help"], capture_output=True, text=True) with Path(f"docs/commands/{command}.md").open("w") as f:
f.write(f"```\n{result.stdout}\n```\n")
_write_partial_file("docs/commands/main.md", result.stdout)
for command in subcommands:
print(f"Running for {command}")
result = subprocess.run(["freqtrade", command, "--help"], capture_output=True, text=True)
_write_partial_file(f"docs/commands/{command}.md", result.stdout)
print("Running for freqtrade-client")
result_client = subprocess.run(["freqtrade-client", "--show"], capture_output=True, text=True)
_write_partial_file("docs/commands/freqtrade-client.md", result_client.stdout)
if __name__ == "__main__":
if sys.version_info < (3, 13): # pragma: no cover
sys.exit(
"argparse output changed in Python 3.13+. "
"To keep command partials up to date, please run this script with Python 3.13+."
)
extract_command_partials()

View File

@@ -273,68 +273,6 @@
] ]
} }
}, },
"backtest_cache": {
"description": "Load a cached backtest result no older than specified age.",
"type": "string",
"enum": [
"none",
"day",
"week",
"month"
]
},
"hyperopt_path": {
"description": "Specify additional lookup path for Hyperopt Loss functions.",
"type": "string"
},
"epochs": {
"description": "Number of training epochs for Hyperopt.",
"type": "integer",
"minimum": 1
},
"early_stop": {
"description": "Early stop hyperopt if no improvement after <epochs>. Set to 0 to disable.",
"type": "integer",
"minimum": 0
},
"spaces": {
"description": "Hyperopt parameter spaces to optimize. Default is the default set andincludes all spaces except for 'trailing', 'protection', and 'trades'.",
"type": "array",
"items": {
"type": "string"
},
"default": [
"default"
]
},
"analyze_per_epoch": {
"description": "Perform analysis after each epoch in Hyperopt.",
"type": "boolean"
},
"print_all": {
"description": "Print all hyperopt trials, not just the best ones.",
"type": "boolean",
"default": false
},
"hyperopt_jobs": {
"description": "The number of concurrently running jobs for hyperoptimization (hyperopt worker processes). If -1 (default), all CPUs are used, for -2, all CPUs but one are used, etc. If 1 is given, no parallel computing is used.",
"type": "integer",
"default": -1
},
"hyperopt_random_state": {
"description": "Random state for hyperopt trials.",
"type": "integer",
"minimum": 0
},
"hyperopt_min_trades": {
"description": "Minimum number of trades per epoch for hyperopt.",
"type": "integer",
"minimum": 0
},
"hyperopt_loss": {
"description": "The class name of the hyperopt loss function class (IHyperOptLoss). Different functions can generate completely different results, since the target for optimization is different. Built-in Hyperopt-loss-functions are: ShortTradeDurHyperOptLoss, OnlyProfitHyperOptLoss, SharpeHyperOptLoss, SharpeHyperOptLossDaily, SortinoHyperOptLoss, SortinoHyperOptLossDaily, CalmarHyperOptLoss, MaxDrawDownHyperOptLoss, MaxDrawDownRelativeHyperOptLoss, MaxDrawDownPerPairHyperOptLoss, ProfitDrawDownHyperOptLoss, MultiMetricHyperOptLoss",
"type": "string"
},
"bot_name": { "bot_name": {
"description": "Name of the trading bot. Passed via API to a client.", "description": "Name of the trading bot. Passed via API to a client.",
"type": "string" "type": "string"

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade backtesting-analysis [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade backtesting-analysis [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [-V] [-c PATH] [-d PATH]
[--userdir PATH] [--userdir PATH]
@@ -15,13 +15,13 @@ usage: freqtrade backtesting-analysis [-h] [-v] [--no-color] [--logfile FILE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--backtest-filename, --export-filename PATH --backtest-filename PATH, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
Assumes either `user_data/backtest_results/` or Assumes either `user_data/backtest_results/` or
`--export-directory` as base directory. `--export-directory` as base directory.
--backtest-directory, --export-directory PATH --backtest-directory PATH, --export-directory PATH
Directory to use for backtest results. Example: Directory to use for backtest results. Example:
`--export-directory=user_data/backtest_results/`. `--export-directory=user_data/backtest_results/`.
--analysis-groups {0,1,2,3,4,5} [{0,1,2,3,4,5} ...] --analysis-groups {0,1,2,3,4,5} [{0,1,2,3,4,5} ...]
@@ -54,20 +54,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade backtesting-show [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade backtesting-show [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--backtest-filename PATH] [--backtest-filename PATH]
@@ -8,13 +8,13 @@ usage: freqtrade backtesting-show [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--backtest-filename, --export-filename PATH --backtest-filename PATH, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
Assumes either `user_data/backtest_results/` or Assumes either `user_data/backtest_results/` or
`--export-directory` as base directory. `--export-directory` as base directory.
--backtest-directory, --export-directory PATH --backtest-directory PATH, --export-directory PATH
Directory to use for backtest results. Example: Directory to use for backtest results. Example:
`--export-directory=user_data/backtest_results/`. `--export-directory=user_data/backtest_results/`.
--show-pair-list Show backtesting pairlist sorted by profit. --show-pair-list Show backtesting pairlist sorted by profit.
@@ -26,20 +26,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade backtesting [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade backtesting [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-s NAME] [-c PATH] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--strategy-path PATH]
@@ -23,7 +23,7 @@ usage: freqtrade backtesting [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i, --timeframe TIMEFRAME -i TIMEFRAME, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
@@ -38,7 +38,7 @@ options:
setting. setting.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
entry and exit). entry and exit).
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--eps, --enable-position-stacking --eps, --enable-position-stacking
@@ -53,7 +53,7 @@ options:
pairlist will be generated for each new candle if pairlist will be generated for each new candle if
you're using a pairlist handler that supports this you're using a pairlist handler that supports this
feature, for example, ShuffleFilter. feature, for example, ShuffleFilter.
--dry-run-wallet, --starting-balance DRY_RUN_WALLET --dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET
Starting balance, used for backtesting / hyperopt and Starting balance, used for backtesting / hyperopt and
dry-runs. dry-runs.
--timeframe-detail TIMEFRAME_DETAIL --timeframe-detail TIMEFRAME_DETAIL
@@ -68,13 +68,13 @@ options:
becomes `backtest-data-SampleStrategy.json` becomes `backtest-data-SampleStrategy.json`
--export {none,trades,signals} --export {none,trades,signals}
Export backtest results (default: trades). Export backtest results (default: trades).
--backtest-filename, --export-filename PATH --backtest-filename PATH, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
Assumes either `user_data/backtest_results/` or Assumes either `user_data/backtest_results/` or
`--export-directory` as base directory. `--export-directory` as base directory.
--backtest-directory, --export-directory PATH --backtest-directory PATH, --export-directory PATH
Directory to use for backtest results. Example: Directory to use for backtest results. Example:
`--export-directory=user_data/backtest_results/`. `--export-directory=user_data/backtest_results/`.
--breakdown {day,week,month,year,weekday} [{day,week,month,year,weekday} ...] --breakdown {day,week,month,year,weekday} [{day,week,month,year,weekday} ...]
@@ -91,24 +91,26 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s, --strategy NAME Specify strategy class name which will be used by the -s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,17 +1,17 @@
``` output ```
usage: freqtrade convert-data [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade convert-data [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] [-p PAIRS [PAIRS ...]] --format-from
--format-from {json,jsongz,feather,parquet} {json,jsongz,feather,parquet} --format-to
--format-to {json,jsongz,feather,parquet} {json,jsongz,feather,parquet} [--erase]
[--erase] [--exchange EXCHANGE] [--exchange EXCHANGE]
[-t TIMEFRAMES [TIMEFRAMES ...]] [-t TIMEFRAMES [TIMEFRAMES ...]]
[--trading-mode {spot,margin,futures}] [--trading-mode {spot,margin,futures}]
[--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]] [--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--format-from {json,jsongz,feather,parquet} --format-from {json,jsongz,feather,parquet}
@@ -21,10 +21,10 @@ options:
--erase Clean all existing data for the selected --erase Clean all existing data for the selected
exchange/pairs/timeframes. exchange/pairs/timeframes.
--exchange EXCHANGE Exchange name. Only valid if no config is provided. --exchange EXCHANGE Exchange name. Only valid if no config is provided.
-t, --timeframes TIMEFRAMES [TIMEFRAMES ...] -t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated Specify which tickers to download. Space-separated
list. Default: `1m 5m`. list. Default: `1m 5m`.
--trading-mode, --tradingmode {spot,margin,futures} --trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...] --candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]
Select candle type to convert. Defaults to all Select candle type to convert. Defaults to all
@@ -34,20 +34,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade convert-db [-h] [--db-url PATH] [--db-url-from PATH] usage: freqtrade convert-db [-h] [--db-url PATH] [--db-url-from PATH]
options: options:

View File

@@ -1,14 +1,14 @@
``` output ```
usage: freqtrade convert-trade-data [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade convert-trade-data [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] [-p PAIRS [PAIRS ...]] --format-from
--format-from {json,jsongz,feather,parquet,kraken_csv} {json,jsongz,feather,parquet,kraken_csv}
--format-to {json,jsongz,feather,parquet} --format-to {json,jsongz,feather,parquet}
[--erase] [--exchange EXCHANGE] [--erase] [--exchange EXCHANGE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--format-from {json,jsongz,feather,parquet,kraken_csv} --format-from {json,jsongz,feather,parquet,kraken_csv}
@@ -23,20 +23,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,9 +1,9 @@
``` output ```
usage: freqtrade create-userdir [-h] [--userdir PATH] [--reset] usage: freqtrade create-userdir [-h] [--userdir PATH] [--reset]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
--reset Reset sample files to their original state. --reset Reset sample files to their original state.

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade download-data [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade download-data [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] [--pairs-file FILE] [-p PAIRS [PAIRS ...]] [--pairs-file FILE]
@@ -11,12 +11,11 @@ usage: freqtrade download-data [-h] [-v] [--no-color] [--logfile FILE] [-V]
[--data-format-ohlcv {json,jsongz,feather,parquet}] [--data-format-ohlcv {json,jsongz,feather,parquet}]
[--data-format-trades {json,jsongz,feather,parquet}] [--data-format-trades {json,jsongz,feather,parquet}]
[--trading-mode {spot,margin,futures}] [--trading-mode {spot,margin,futures}]
[--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]]
[--prepend] [--prepend]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--pairs-file FILE File containing a list of pairs. Takes precedence over --pairs-file FILE File containing a list of pairs. Takes precedence over
@@ -38,7 +37,7 @@ options:
OHLCV (e.g. Kraken). If not provided, use `trades-to- OHLCV (e.g. Kraken). If not provided, use `trades-to-
ohlcv` to convert trades data to OHLCV data. ohlcv` to convert trades data to OHLCV data.
--exchange EXCHANGE Exchange name. Only valid if no config is provided. --exchange EXCHANGE Exchange name. Only valid if no config is provided.
-t, --timeframes TIMEFRAMES [TIMEFRAMES ...] -t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated Specify which tickers to download. Space-separated
list. Default: `1m 5m`. list. Default: `1m 5m`.
--erase Clean all existing data for the selected --erase Clean all existing data for the selected
@@ -49,33 +48,29 @@ options:
--data-format-trades {json,jsongz,feather,parquet} --data-format-trades {json,jsongz,feather,parquet}
Storage format for downloaded trades data. (default: Storage format for downloaded trades data. (default:
`feather`). `feather`).
--trading-mode, --tradingmode {spot,margin,futures} --trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]
Select candle type to download. Defaults to the
necessary candles for the selected trading mode (e.g.
'spot' or ('futures', 'funding_rate' and 'mark') for
futures).
--prepend Allow data prepending. (Data-appending is disabled) --prepend Allow data prepending. (Data-appending is disabled)
Common arguments: Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade edge [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH] usage: freqtrade edge [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH] [-s NAME] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--recursive-strategy-search] [--strategy-path PATH] [--recursive-strategy-search]
@@ -10,7 +10,7 @@ usage: freqtrade edge [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i, --timeframe TIMEFRAME -i TIMEFRAME, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
@@ -25,7 +25,7 @@ options:
setting. setting.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
entry and exit). entry and exit).
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
@@ -33,24 +33,26 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s, --strategy NAME Specify strategy class name which will be used by the -s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,197 +0,0 @@
``` output
Possible commands:
available_pairs
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 stake currency.
balance
Get the account balance.
blacklist
Show the current blacklist.
:param add: List of coins to add (example: "BNB/BTC")
cancel_open_order
Cancel open order for trade.
:param trade_id: Cancels open orders for this trade.
count
Return the amount of open trades.
daily
Return the profits for each day, and amount of trades.
delete_lock
Delete (disable) lock from the database.
:param lock_id: ID for the lock to delete
delete_trade
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.
entries
Returns List of dicts containing all Trades, based on buy tag performance
Can either be average for all pairs or a specific pair provided
exits
Returns List of dicts containing all Trades, based on exit reason performance
Can either be average for all pairs or a specific pair provided
forcebuy
Buy an asset.
:param pair: Pair to buy (ETH/BTC)
:param price: Optional - price to buy
forceenter
Force entering a trade
:param pair: Pair to buy (ETH/BTC)
:param side: 'long' or 'short'
:param price: Optional - price to buy
:param order_type: Optional keyword argument - 'limit' or 'market'
:param stake_amount: Optional keyword argument - stake amount (as float)
:param leverage: Optional keyword argument - leverage (as float)
:param enter_tag: Optional keyword argument - entry tag (as string, default: 'force_enter')
forceexit
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.
list_custom_data
List custom-data of the running bot for a specific trade.
:param trade_id: ID of the trade
:param key: str, optional - Key of the custom-data
list_open_trades_custom_data
List open trades custom-data of the running bot.
:param key: str, optional - Key of the custom-data
:param limit: limit of trades
:param offset: trades offset for pagination
lock_add
Lock pair
:param pair: Pair to lock
:param until: Lock until this date (format "2024-03-30 16:00:00Z")
:param side: Side to lock (long, short, *)
:param reason: Reason for the lock
locks
Return current locks
logs
Show latest logs.
:param limit: Limits log messages to the last <limit> logs. No limit to get the entire log.
mix_tags
Returns List of dicts containing all Trades, based on entry_tag + exit_reason performance
Can either be average for all pairs or a specific pair provided
monthly
Return the profits for each month, and amount of trades.
pair_candles
Return live dataframe for <pair><timeframe>.
:param pair: Pair to get data for
:param timeframe: Only pairs with this timeframe available.
:param limit: Limit result to the last n candles.
:param columns: List of dataframe columns to return. Empty list will return OHLCV.
pair_history
Return historic, analyzed dataframe
:param pair: Pair to get data for
:param timeframe: Only pairs with this timeframe available.
:param strategy: Strategy to analyze and get values for
:param freqaimodel: FreqAI model to use for analysis
:param timerange: Timerange to get data for (same format than --timerange endpoints)
pairlists_available
Lists available pairlist providers
performance
Return the performance of the different coins.
ping
simple ping
plot_config
Return plot configuration if the strategy defines one.
profit
Return the profit summary.
reload_config
Reload configuration.
show_config
Returns part of the configuration, relevant for trading operations.
start
Start the bot if it's in the stopped state.
stats
Return the stats report (durations, sell-reasons).
status
Get the status of open trades.
stop
Stop the bot. Use `start` to restart.
stopbuy
Stop buying (but handle sells gracefully). Use `reload_config` to reset.
strategies
Lists available strategies
strategy
Get strategy details
:param strategy: Strategy class name
sysinfo
Provides system information (CPU, RAM usage)
trade
Return specific trade
:param trade_id: Specify which trade to get.
trades
Return trades history, sorted by id (or by latest timestamp if order_by_id=False)
:param limit: Limits trades to the X last trades. Max 500 trades.
:param offset: Offset by this amount of trades.
:param order_by_id: Sort trades by id (default: True). If False, sorts by latest timestamp.
version
Return the version of the bot.
weekly
Return the profits for each week, and amount of trades.
whitelist
Show the current whitelist.
```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade hyperopt-list [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade hyperopt-list [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [--best] [-c PATH] [-d PATH] [--userdir PATH] [--best]
[--profitable] [--min-trades INT] [--profitable] [--min-trades INT]
@@ -44,20 +44,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade hyperopt-show [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade hyperopt-show [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [--best] [-c PATH] [-d PATH] [--userdir PATH] [--best]
[--profitable] [-n INT] [--print-json] [--profitable] [-n INT] [--print-json]
@@ -10,7 +10,7 @@ options:
-h, --help show this help message and exit -h, --help show this help message and exit
--best Select only best epochs. --best Select only best epochs.
--profitable Select only profitable epochs. --profitable Select only profitable epochs.
-n, --index INT Specify the index of the epoch to print details for. -n INT, --index INT Specify the index of the epoch to print details for.
--print-json Print output in JSON format. --print-json Print output in JSON format.
--hyperopt-filename FILENAME --hyperopt-filename FILENAME
Hyperopt result filename.Example: `--hyperopt- Hyperopt result filename.Example: `--hyperopt-
@@ -26,20 +26,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade hyperopt [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade hyperopt [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-s NAME] [-c PATH] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--recursive-strategy-search] [--strategy-path PATH] [--recursive-strategy-search]
@@ -11,15 +11,16 @@ usage: freqtrade hyperopt [-h] [-v] [--no-color] [--logfile FILE] [-V]
[--eps] [--enable-protections] [--eps] [--enable-protections]
[--dry-run-wallet DRY_RUN_WALLET] [--dry-run-wallet DRY_RUN_WALLET]
[--timeframe-detail TIMEFRAME_DETAIL] [-e INT] [--timeframe-detail TIMEFRAME_DETAIL] [-e INT]
[--spaces SPACES [SPACES ...]] [--print-all] [--spaces {all,buy,sell,roi,stoploss,trailing,protection,trades,default} [{all,buy,sell,roi,stoploss,trailing,protection,trades,default} ...]]
[--print-json] [-j JOBS] [--random-state INT] [--print-all] [--print-json] [-j JOBS]
[--min-trades INT] [--hyperopt-loss NAME] [--random-state INT] [--min-trades INT]
[--disable-param-export] [--ignore-missing-spaces] [--hyperopt-loss NAME] [--disable-param-export]
[--analyze-per-epoch] [--early-stop INT] [--ignore-missing-spaces] [--analyze-per-epoch]
[--early-stop INT]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i, --timeframe TIMEFRAME -i TIMEFRAME, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
@@ -34,7 +35,7 @@ options:
setting. setting.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
entry and exit). entry and exit).
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--hyperopt-path PATH Specify additional lookup path for Hyperopt Loss --hyperopt-path PATH Specify additional lookup path for Hyperopt Loss
@@ -46,23 +47,19 @@ options:
Enable protections for backtesting. Will slow Enable protections for backtesting. Will slow
backtesting down by a considerable amount, but will backtesting down by a considerable amount, but will
include configured protections include configured protections
--dry-run-wallet, --starting-balance DRY_RUN_WALLET --dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET
Starting balance, used for backtesting / hyperopt and Starting balance, used for backtesting / hyperopt and
dry-runs. dry-runs.
--timeframe-detail TIMEFRAME_DETAIL --timeframe-detail TIMEFRAME_DETAIL
Specify detail timeframe for backtesting (`1m`, `5m`, Specify detail timeframe for backtesting (`1m`, `5m`,
`30m`, `1h`, `1d`). `30m`, `1h`, `1d`).
-e, --epochs INT Specify number of epochs (default: 100). -e INT, --epochs INT Specify number of epochs (default: 100).
--spaces SPACES [SPACES ...] --spaces {all,buy,sell,roi,stoploss,trailing,protection,trades,default} [{all,buy,sell,roi,stoploss,trailing,protection,trades,default} ...]
Specify which parameters to hyperopt. Space-separated Specify which parameters to hyperopt. Space-separated
list. Available builtin options (custom spaces will list.
not be listed here): default, all, buy, sell, enter,
exit, roi, stoploss, trailing, protection, trades.
Default: `default` - which includes all spaces except
for 'trailing', 'protection', and 'trades'.
--print-all Print all results, not only the best ones. --print-all Print all results, not only the best ones.
--print-json Print output in JSON format. --print-json Print output in JSON format.
-j, --job-workers JOBS -j JOBS, --job-workers JOBS
The number of concurrently running jobs for The number of concurrently running jobs for
hyperoptimization (hyperopt worker processes). If -1 hyperoptimization (hyperopt worker processes). If -1
(default), all CPUs are used, for -2, all CPUs but one (default), all CPUs are used, for -2, all CPUs but one
@@ -72,7 +69,7 @@ options:
reproducible hyperopt results. reproducible hyperopt results.
--min-trades INT Set minimal desired number of trades for evaluations --min-trades INT Set minimal desired number of trades for evaluations
in the hyperopt optimization path (default: 1). in the hyperopt optimization path (default: 1).
--hyperopt-loss, --hyperoptloss NAME --hyperopt-loss NAME, --hyperoptloss NAME
Specify the class name of the hyperopt loss function Specify the class name of the hyperopt loss function
class (IHyperOptLoss). Different functions can class (IHyperOptLoss). Different functions can
generate completely different results, since the generate completely different results, since the
@@ -98,24 +95,26 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s, --strategy NAME Specify strategy class name which will be used by the -s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade install-ui [-h] [--erase] [--prerelease] usage: freqtrade install-ui [-h] [--erase] [--prerelease]
[--ui-version UI_VERSION] [--ui-version UI_VERSION]

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade list-data [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-data [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--exchange EXCHANGE] [--exchange EXCHANGE]
@@ -18,10 +18,10 @@ options:
Storage format for downloaded trades data. (default: Storage format for downloaded trades data. (default:
`feather`). `feather`).
--trades Work on trades data instead of OHLCV data. --trades Work on trades data instead of OHLCV data.
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--trading-mode, --tradingmode {spot,margin,futures} --trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
--show-timerange Show timerange available for available data. (May take --show-timerange Show timerange available for available data. (May take
a while to calculate). a while to calculate).
@@ -30,20 +30,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade list-exchanges [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-exchanges [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-1] [-a] [-c PATH] [-d PATH] [--userdir PATH] [-1] [-a]
[--trading-mode {spot,margin,futures}] [--trading-mode {spot,margin,futures}]
@@ -8,7 +8,7 @@ options:
-h, --help show this help message and exit -h, --help show this help message and exit
-1, --one-column Print output in one column. -1, --one-column Print output in one column.
-a, --all Print all exchanges known to the ccxt library. -a, --all Print all exchanges known to the ccxt library.
--trading-mode, --tradingmode {spot,margin,futures} --trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
--dex-exchanges Print only DEX exchanges. --dex-exchanges Print only DEX exchanges.
@@ -16,20 +16,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade list-freqaimodels [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade list-freqaimodels [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[--freqaimodel-path PATH] [-1] [--freqaimodel-path PATH] [-1]
@@ -13,20 +13,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade list-hyperoptloss [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade list-hyperoptloss [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[--hyperopt-path PATH] [-1] [--hyperopt-path PATH] [-1]
@@ -13,20 +13,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade list-markets [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-markets [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--exchange EXCHANGE] [--print-list] [--exchange EXCHANGE] [--print-list]
@@ -21,27 +21,28 @@ options:
Specify quote currency(-ies). Space-separated list. Specify quote currency(-ies). Space-separated list.
-a, --all Print all pairs or market symbols. By default only -a, --all Print all pairs or market symbols. By default only
active ones are shown. active ones are shown.
--trading-mode, --tradingmode {spot,margin,futures} --trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
Common arguments: Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade list-pairs [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-pairs [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--exchange EXCHANGE] [--print-list] [--exchange EXCHANGE] [--print-list]
@@ -21,27 +21,28 @@ options:
Specify quote currency(-ies). Space-separated list. Specify quote currency(-ies). Space-separated list.
-a, --all Print all pairs or market symbols. By default only -a, --all Print all pairs or market symbols. By default only
active ones are shown. active ones are shown.
--trading-mode, --tradingmode {spot,margin,futures} --trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
Common arguments: Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade list-strategies [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-strategies [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--strategy-path PATH] [-1] [--strategy-path PATH] [-1]
@@ -16,20 +16,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,34 +1,32 @@
``` output ```
usage: freqtrade list-timeframes [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-timeframes [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--exchange EXCHANGE] [-1] [--exchange EXCHANGE] [-1]
[--trading-mode {spot,margin,futures}]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--exchange EXCHANGE Exchange name. Only valid if no config is provided. --exchange EXCHANGE Exchange name. Only valid if no config is provided.
-1, --one-column Print output in one column. -1, --one-column Print output in one column.
--trading-mode, --tradingmode {spot,margin,futures}
Select Trading mode
Common arguments: Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade lookahead-analysis [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade lookahead-analysis [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[-s NAME] [--strategy-path PATH] [-s NAME] [--strategy-path PATH]
@@ -26,7 +26,7 @@ usage: freqtrade lookahead-analysis [-h] [-v] [--no-color] [--logfile FILE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i, --timeframe TIMEFRAME -i TIMEFRAME, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
@@ -41,7 +41,7 @@ options:
setting. setting.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
entry and exit). entry and exit).
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--enable-protections, --enableprotections --enable-protections, --enableprotections
@@ -53,7 +53,7 @@ options:
pairlist will be generated for each new candle if pairlist will be generated for each new candle if
you're using a pairlist handler that supports this you're using a pairlist handler that supports this
feature, for example, ShuffleFilter. feature, for example, ShuffleFilter.
--dry-run-wallet, --starting-balance DRY_RUN_WALLET --dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET
Starting balance, used for backtesting / hyperopt and Starting balance, used for backtesting / hyperopt and
dry-runs. dry-runs.
--timeframe-detail TIMEFRAME_DETAIL --timeframe-detail TIMEFRAME_DETAIL
@@ -68,13 +68,13 @@ options:
becomes `backtest-data-SampleStrategy.json` becomes `backtest-data-SampleStrategy.json`
--export {none,trades,signals} --export {none,trades,signals}
Export backtest results (default: trades). Export backtest results (default: trades).
--backtest-filename, --export-filename PATH --backtest-filename PATH, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
Assumes either `user_data/backtest_results/` or Assumes either `user_data/backtest_results/` or
`--export-directory` as base directory. `--export-directory` as base directory.
--backtest-directory, --export-directory PATH --backtest-directory PATH, --export-directory PATH
Directory to use for backtest results. Example: Directory to use for backtest results. Example:
`--export-directory=user_data/backtest_results/`. `--export-directory=user_data/backtest_results/`.
--freqai-backtest-live-models --freqai-backtest-live-models
@@ -93,24 +93,26 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s, --strategy NAME Specify strategy class name which will be used by the -s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,6 +1,7 @@
``` output ```
usage: freqtrade [-h] [-V] usage: freqtrade [-h] [-V]
{trade,create-userdir,new-config,show-config,new-strategy,download-data,convert-data,convert-trade-data,trades-to-ohlcv,list-data,backtesting,backtesting-show,backtesting-analysis,edge,hyperopt,hyperopt-list,hyperopt-show,list-exchanges,list-markets,list-pairs,list-strategies,list-hyperoptloss,list-freqaimodels,list-timeframes,show-trades,test-pairlist,convert-db,install-ui,plot-dataframe,plot-profit,webserver,strategy-updater,lookahead-analysis,recursive-analysis} ... {trade,create-userdir,new-config,show-config,new-strategy,download-data,convert-data,convert-trade-data,trades-to-ohlcv,list-data,backtesting,backtesting-show,backtesting-analysis,edge,hyperopt,hyperopt-list,hyperopt-show,list-exchanges,list-markets,list-pairs,list-strategies,list-hyperoptloss,list-freqaimodels,list-timeframes,show-trades,test-pairlist,convert-db,install-ui,plot-dataframe,plot-profit,webserver,strategy-updater,lookahead-analysis,recursive-analysis}
...
Free, open source crypto trading bot Free, open source crypto trading bot

View File

@@ -1,11 +1,12 @@
``` output ```
usage: freqtrade new-config [-h] [-c PATH] usage: freqtrade new-config [-h] [-c PATH]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
`userdir/config.json` or `config.json` whichever exists). Specify configuration file (default:
Multiple --config options may be used. Can be set to `-` `userdir/config.json` or `config.json` whichever
to read config from stdin. exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
``` ```

View File

@@ -1,13 +1,14 @@
``` output ```
usage: freqtrade new-strategy [-h] [--userdir PATH] [-s NAME] usage: freqtrade new-strategy [-h] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--strategy-path PATH]
[--template {full,minimal,advanced}] [--template {full,minimal,advanced}]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
-s, --strategy NAME Specify strategy class name which will be used by the -s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--template {full,minimal,advanced} --template {full,minimal,advanced}

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade plot-dataframe [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade plot-dataframe [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-s NAME] [-c PATH] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--strategy-path PATH]
@@ -16,7 +16,7 @@ usage: freqtrade plot-dataframe [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--indicators1 INDICATORS1 [INDICATORS1 ...] --indicators1 INDICATORS1 [INDICATORS1 ...]
@@ -38,7 +38,7 @@ options:
(backtest file)) Default: file (backtest file)) Default: file
--export {none,trades,signals} --export {none,trades,signals}
Export backtest results (default: trades). Export backtest results (default: trades).
--backtest-filename, --export-filename PATH --backtest-filename PATH, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
@@ -46,7 +46,7 @@ options:
`--export-directory` as base directory. `--export-directory` as base directory.
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
-i, --timeframe TIMEFRAME -i TIMEFRAME, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--no-trades Skip using trades from backtesting file and DB. --no-trades Skip using trades from backtesting file and DB.
@@ -54,24 +54,26 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s, --strategy NAME Specify strategy class name which will be used by the -s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade plot-profit [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade plot-profit [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-s NAME] [-c PATH] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--strategy-path PATH]
@@ -12,14 +12,14 @@ usage: freqtrade plot-profit [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
--export {none,trades,signals} --export {none,trades,signals}
Export backtest results (default: trades). Export backtest results (default: trades).
--backtest-filename, --export-filename PATH --backtest-filename PATH, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
@@ -32,7 +32,7 @@ options:
--trade-source {DB,file} --trade-source {DB,file}
Specify the source for trades (Can be DB or file Specify the source for trades (Can be DB or file
(backtest file)) Default: file (backtest file)) Default: file
-i, --timeframe TIMEFRAME -i TIMEFRAME, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--auto-open Automatically open generated plot. --auto-open Automatically open generated plot.
@@ -40,24 +40,26 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s, --strategy NAME Specify strategy class name which will be used by the -s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade recursive-analysis [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade recursive-analysis [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[-s NAME] [--strategy-path PATH] [-s NAME] [--strategy-path PATH]
@@ -12,14 +12,14 @@ usage: freqtrade recursive-analysis [-h] [-v] [--no-color] [--logfile FILE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i, --timeframe TIMEFRAME -i TIMEFRAME, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
--data-format-ohlcv {json,jsongz,feather,parquet} --data-format-ohlcv {json,jsongz,feather,parquet}
Storage format for downloaded candle (OHLCV) data. Storage format for downloaded candle (OHLCV) data.
(default: `feather`). (default: `feather`).
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--startup-candle STARTUP_CANDLE [STARTUP_CANDLE ...] --startup-candle STARTUP_CANDLE [STARTUP_CANDLE ...]
@@ -30,24 +30,26 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s, --strategy NAME Specify strategy class name which will be used by the -s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,12 +1,13 @@
``` output ```
usage: freqtrade show-config [-h] [--userdir PATH] [-c PATH] usage: freqtrade show-config [-h] [--userdir PATH] [-c PATH]
[--show-sensitive] [--show-sensitive]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade show-trades [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade show-trades [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--db-url PATH] [--db-url PATH]
@@ -19,20 +19,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade strategy-updater [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade strategy-updater [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]] [--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]]
@@ -23,20 +23,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,14 +1,15 @@
``` output ```
usage: freqtrade test-pairlist [-h] [--userdir PATH] [-v] [-c PATH] usage: freqtrade test-pairlist [-h] [--userdir PATH] [-v] [-c PATH]
[--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]] [--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]]
[-1] [--print-json] [--exchange EXCHANGE] [-1] [--print-json] [--exchange EXCHANGE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade trade [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH] usage: freqtrade trade [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH] [-s NAME] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--recursive-strategy-search] [--strategy-path PATH] [--recursive-strategy-search]
@@ -15,7 +15,7 @@ options:
--sd-notify Notify systemd service manager. --sd-notify Notify systemd service manager.
--dry-run Enforce dry-run for trading (removes Exchange secrets --dry-run Enforce dry-run for trading (removes Exchange secrets
and simulates trades). and simulates trades).
--dry-run-wallet, --starting-balance DRY_RUN_WALLET --dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET
Starting balance, used for backtesting / hyperopt and Starting balance, used for backtesting / hyperopt and
dry-runs. dry-runs.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
@@ -25,24 +25,26 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s, --strategy NAME Specify strategy class name which will be used by the -s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade trades-to-ohlcv [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade trades-to-ohlcv [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] [-p PAIRS [PAIRS ...]]
@@ -10,10 +10,10 @@ usage: freqtrade trades-to-ohlcv [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p, --pairs PAIRS [PAIRS ...] -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
-t, --timeframes TIMEFRAMES [TIMEFRAMES ...] -t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated Specify which tickers to download. Space-separated
list. Default: `1m 5m`. list. Default: `1m 5m`.
--exchange EXCHANGE Exchange name. Only valid if no config is provided. --exchange EXCHANGE Exchange name. Only valid if no config is provided.
@@ -23,27 +23,28 @@ options:
--data-format-trades {json,jsongz,feather,parquet} --data-format-trades {json,jsongz,feather,parquet}
Storage format for downloaded trades data. (default: Storage format for downloaded trades data. (default:
`feather`). `feather`).
--trading-mode, --tradingmode {spot,margin,futures} --trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
Common arguments: Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` output ```
usage: freqtrade webserver [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade webserver [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
@@ -9,20 +9,21 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile, --log-file FILE --logfile FILE, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default: -c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH -d PATH, --datadir PATH, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir, --user-data-dir PATH --userdir PATH, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -675,7 +675,7 @@ Should you experience problems you suspect are caused by websockets, you can dis
Should you be required to use a proxy, please refer to the [proxy section](#using-a-proxy-with-freqtrade) for more information. Should you be required to use a proxy, please refer to the [proxy section](#using-a-proxy-with-freqtrade) for more information.
!!! Info "Rollout" !!! Info "Rollout"
We're rolling this out slowly, ensuring stability of your bots. We're implementing this out slowly, ensuring stability of your bots.
Currently, usage is limited to ohlcv data streams. Currently, usage is limited to ohlcv data streams.
It's also limited to a few exchanges, with new exchanges being added on an ongoing basis. It's also limited to a few exchanges, with new exchanges being added on an ongoing basis.

View File

@@ -60,7 +60,6 @@ freqtrade download-data --exchange binance --pairs ".*/USDT"
* Given starting points are ignored if data is already available, downloading only missing data up to today. * Given starting points are ignored if data is already available, downloading only missing data up to today.
* Use `--timeframes` to specify what timeframe download the historical candle (OHLCV) data for. Default is `--timeframes 1m 5m` which will download 1-minute and 5-minute data. * Use `--timeframes` to specify what timeframe download the historical candle (OHLCV) data for. Default is `--timeframes 1m 5m` which will download 1-minute and 5-minute data.
* To use exchange, timeframe and list of pairs as defined in your configuration file, use the `-c/--config` option. With this, the script uses the whitelist defined in the config as the list of currency pairs to download data for and does not require the pairs.json file. You can combine `-c/--config` with most other options. * To use exchange, timeframe and list of pairs as defined in your configuration file, use the `-c/--config` option. With this, the script uses the whitelist defined in the config as the list of currency pairs to download data for and does not require the pairs.json file. You can combine `-c/--config` with most other options.
* When downloading futures data (`--trading-mode futures` or a configuration specifying futures mode), freqtrade will automatically download the necessary candle types (e.g. `mark` and `funding_rate` candles) unless specified otherwise via `--candle-types`.
??? Note "Permission denied errors" ??? Note "Permission denied errors"
If your configuration directory `user_data` was made by docker, you may get the following error: If your configuration directory `user_data` was made by docker, you may get the following error:

View File

@@ -98,33 +98,3 @@ Please use configuration based [log setup](advanced-setup.md#advanced-logging) i
The edge module has been deprecated in 2023.9 and removed in 2025.6. The edge module has been deprecated in 2023.9 and removed in 2025.6.
All functionalities of edge have been removed, and having edge configured will result in an error. All functionalities of edge have been removed, and having edge configured will result in an error.
## Adjustment to dynamic funding rate handling
With version 2025.12, the handling of dynamic funding rates has been adjusted to also support dynamic funding rates down to 1h funding intervals.
As a consequence, the mark and funding rate timeframes have been changed to 1h for every supported futures exchange.
As the timeframe for both mark and funding_fee candles has changed (usually from 8h to 1h) - already downloaded data will have to be adjusted or partially re-downloaded.
You can either re-download everything (`freqtrade download-data [...] --erase` - :warning: can take a long time) - or download the updated data selectively.
### Selective data re-download
The script below should serve as an example - you may need to adjust the timeframe and exchange to your needs!
``` bash
# Cleanup no longer needed data
rm user_data/data/<exchange>/futures/*-mark-*
rm user_data/data/<exchange>/futures/*-funding_rate-*
# download new data (only required once to fix the mark and funding fee data)
freqtrade download-data -t 1h --trading-mode futures --candle-types funding_rate mark [...] --timerange <full timerange you've got other data for>
```
The result of the above will be that your funding_rates and mark data will have the 1h timeframe.
you can verify this with `freqtrade list-data --exchange <yourexchange> --show`.
!!! Note "Additional arguments"
Additional arguments to the above commands may be necessary, like configuration files or explicit user_data if they deviate from the default.
**Hyperliquid** is a special case now - which will no longer require 1h mark data - but will use regular candles instead (this data never existed and is identical to 1h futures candles). As we don't support download-data for hyperliquid (they don't provide historic data) - there won't be actions necessary for hyperliquid users.

View File

@@ -26,19 +26,10 @@ Alternatively (e.g. if your system is not supported by the setup.sh script), fol
This will install all required tools for development, including `pytest`, `ruff`, `mypy`, and `coveralls`. This will install all required tools for development, including `pytest`, `ruff`, `mypy`, and `coveralls`.
Run the following command to install the git hook scripts: Then install the git hook scripts by running `pre-commit install`, so your changes will be verified locally before committing.
This avoids a lot of waiting for CI already, as some basic formatting checks are done locally on your machine.
``` bash Before opening a pull request, please familiarize yourself with our [Contributing Guidelines](https://github.com/freqtrade/freqtrade/blob/develop/CONTRIBUTING.md).
pre-commit install
```
These pre-commit scripts check your changes automatically before each commit.
If any formatting issues are found, the commit will fail and will prompt for fixes.
This reduces unnecessary CI failures, reduces maintenance burden, and improves code quality.
You can run the checks manually when necessary with `pre-commit run -a`.
Before opening a pull request, please also familiarize yourself with our [Contributing Guidelines](https://github.com/freqtrade/freqtrade/blob/develop/CONTRIBUTING.md).
### Devcontainer setup ### Devcontainer setup

View File

@@ -407,12 +407,11 @@ To use these with Freqtrade, you will need to use the following configuration pa
``` json ``` json
"exchange": { "exchange": {
"name": "hyperliquid", "name": "hyperliquid",
"walletAddress": "your_master_wallet_address", // Your master wallet address (not the API wallet address and not the vault/subaccount address). "walletAddress": "your_vault_address", // Vault or subaccount address
"privateKey": "your_api_private_key", // API wallet private key (see https://app.hyperliquid.xyz/API). You'll only need the private key. "privateKey": "your_api_private_key",
"ccxt_config": { "ccxt_config": {
"options": { "options": {
"vaultAddress": "your_vault_address", // Optional, only if you want to use a vault ... "vaultAddress": "your_vault_address" // Optional, only if you want to use a vault or subaccount
"subAccountAddress": "your_subaccount_address" // OR optional, only if you want to use a subaccount
} }
}, },
// ... // ...
@@ -421,9 +420,6 @@ To use these with Freqtrade, you will need to use the following configuration pa
Your balance and trades will now be used from your vault / subaccount - and no longer from your main account. Your balance and trades will now be used from your vault / subaccount - and no longer from your main account.
!!! Note
You can only use either a vault or a subaccount - not both at the same time.
### Historic Hyperliquid data ### Historic Hyperliquid data
The Hyperliquid API does not provide historic data beyond the single call to fetch current data, so downloading data is not possible, as the downloaded data would not constitute proper historic data. The Hyperliquid API does not provide historic data beyond the single call to fetch current data, so downloading data is not possible, as the downloaded data would not constitute proper historic data.

View File

@@ -46,17 +46,10 @@ Depending on the space you want to optimize, only some of the below are required
* define parameters with `space='buy'` - for entry signal optimization * define parameters with `space='buy'` - for entry signal optimization
* define parameters with `space='sell'` - for exit signal optimization * define parameters with `space='sell'` - for exit signal optimization
* define parameters with `space='enter'` - for entry signal optimization
* define parameters with `space='exit'` - for exit signal optimization
* define parameters with `space='protection'` - for protection optimization
* define parameters with `space='random_spacename'` - for better control over which parameters are optimized together
Pick the space name that suits the parameter best. We recommend to use either `buy` / `sell` or `enter` / `exit` for clarity (however there's no technical limitation in this regard).
!!! Note !!! Note
`populate_indicators` needs to create all indicators any of the spaces may use, otherwise hyperopt will not work. `populate_indicators` needs to create all indicators any of the spaces may use, otherwise hyperopt will not work.
Rarely you may also need to create a [nested class](advanced-hyperopt.md#overriding-pre-defined-spaces) named `HyperOpt` and implement Rarely you may also need to create a [nested class](advanced-hyperopt.md#overriding-pre-defined-spaces) named `HyperOpt` and implement
* `roi_space` - for custom ROI optimization (if you need the ranges for the ROI parameters in the optimization hyperspace that differ from default) * `roi_space` - for custom ROI optimization (if you need the ranges for the ROI parameters in the optimization hyperspace that differ from default)
@@ -86,15 +79,15 @@ Based on the loss function result, hyperopt will determine the next set of param
### Configure your Guards and Triggers ### Configure your Guards and Triggers
There are two places you need to change in your strategy file to add a new hyperopt parameter for optimization: There are two places you need to change in your strategy file to add a new buy hyperopt for testing:
* Define the parameters at the class level hyperopt shall be optimizing. * Define the parameters at the class level hyperopt shall be optimizing.
* Within `populate_entry_trend()` - use defined parameter values instead of raw constants. * Within `populate_entry_trend()` - use defined parameter values instead of raw constants.
There you have two different types of indicators: 1. `guards` and 2. `triggers`. There you have two different types of indicators: 1. `guards` and 2. `triggers`.
1. Guards are conditions like "never enter if ADX < 10", or never enter if current price is over EMA10. 1. Guards are conditions like "never buy if ADX < 10", or never buy if current price is over EMA10.
2. Triggers are ones that actually trigger entry in specific moment, like "enter when EMA5 crosses over EMA10" or "enter when close price touches lower Bollinger band". 2. Triggers are ones that actually trigger buy in specific moment, like "buy when EMA5 crosses over EMA10" or "buy when close price touches lower Bollinger band".
!!! Hint "Guards and Triggers" !!! Hint "Guards and Triggers"
Technically, there is no difference between Guards and Triggers. Technically, there is no difference between Guards and Triggers.
@@ -167,11 +160,9 @@ We use these to either enable or disable the ADX and RSI guards.
The last one we call `trigger` and use it to decide which buy trigger we want to use. The last one we call `trigger` and use it to decide which buy trigger we want to use.
!!! Note "Parameter space assignment" !!! Note "Parameter space assignment"
- Parameters must either be assigned to a variable named `buy_*`, `sell_*`, `enter_*` or `exit_*` or `protection_*` - or contain have a space assigned explicitly via parameter (`space='buy'`, `space='sell'`, `space='protection'`). Parameters must either be assigned to a variable named `buy_*` or `sell_*` - or contain `space='buy'` | `space='sell'` to be assigned to a space correctly.
- Parameters with conflicting assignments (e.g. `buy_adx = IntParameter(4, 24, default=14, space='sell')`) will use the explicit space assignment. If no parameter is available for a space, you'll receive the error that no space was found when running hyperopt.
- If no parameter is available for a space, you'll receive the error that no space was found when running hyperopt.
Parameters with unclear space (e.g. `adx_period = IntParameter(4, 24, default=14)` - no explicit nor implicit space) will not be detected and will therefore be ignored. Parameters with unclear space (e.g. `adx_period = IntParameter(4, 24, default=14)` - no explicit nor implicit space) will not be detected and will therefore be ignored.
Spaces can also be custom named (e.g. `space='my_custom_space'`), with the only limitation that the space name cannot be `all`, `default` - and must result in a valid python identifier.
So let's write the buy strategy using these values: So let's write the buy strategy using these values:
@@ -529,24 +520,21 @@ freqtrade hyperopt --strategy <strategyname> --timerange 20210101-20210201
### Running Hyperopt with Smaller Search Space ### Running Hyperopt with Smaller Search Space
Use the `--spaces` option to limit the search space used by hyperopt. Use the `--spaces` option to limit the search space used by hyperopt.
Letting Hyperopt optimize everything is often a huuuuge search space. Letting Hyperopt optimize everything is a huuuuge search space.
Often it might make more sense to start by just searching for initial entry algorithm. Often it might make more sense to start by just searching for initial buy algorithm.
Or maybe you just want to optimize your stoploss or roi table for that awesome new strategy you have. Or maybe you just want to optimize your stoploss or roi table for that awesome new buy strategy you have.
Legal values are: Legal values are:
* `all`: optimize everything (including custom spaces) * `all`: optimize everything
* `buy`: just search for a new buy strategy * `buy`: just search for a new buy strategy
* `sell`: just search for a new sell strategy * `sell`: just search for a new sell strategy
* `enter`: just search for a new entry logic
* `exit`: just search for a new entry logic
* `roi`: just optimize the minimal profit table for your strategy * `roi`: just optimize the minimal profit table for your strategy
* `stoploss`: search for the best stoploss value * `stoploss`: search for the best stoploss value
* `trailing`: search for the best trailing stop values * `trailing`: search for the best trailing stop values
* `trades`: search for the best max open trades values * `trades`: search for the best max open trades values
* `protection`: search for the best protection parameters (read the [protections section](#optimizing-protections) on how to properly define these) * `protection`: search for the best protection parameters (read the [protections section](#optimizing-protections) on how to properly define these)
* `default`: `all` except `trailing`, `trades` and `protection` * `default`: `all` except `trailing`, `trades` and `protection`
* `custom_space_name`: any custom space used by any parameter in your strategy
* space-separated list of any of the above values for example `--spaces roi stoploss` * space-separated list of any of the above values for example `--spaces roi stoploss`
The default Hyperopt Search Space, used when no `--space` command line option is specified, does not include the `trailing` hyperspace. We recommend you to run optimization for the `trailing` hyperspace separately, when the best parameters for other hyperspaces were found, validated and pasted into your custom strategy. The default Hyperopt Search Space, used when no `--space` command line option is specified, does not include the `trailing` hyperspace. We recommend you to run optimization for the `trailing` hyperspace separately, when the best parameters for other hyperspaces were found, validated and pasted into your custom strategy.

View File

@@ -367,7 +367,7 @@ The optional `bearer_token` will be included in the requests Authorization Heade
#### MarketCapPairList #### MarketCapPairList
`MarketCapPairList` employs sorting/filtering of pairs by their marketcap rank based of CoinGecko. The returned pairlist will be sorted based of their marketcap ranks if used in whitelist `mode`. `MarketCapPairList` employs sorting/filtering of pairs by their marketcap rank based of CoinGecko. The returned pairlist will be sorted based of their marketcap ranks.
```json ```json
"pairlists": [ "pairlists": [
@@ -376,21 +376,16 @@ The optional `bearer_token` will be included in the requests Authorization Heade
"number_assets": 20, "number_assets": 20,
"max_rank": 50, "max_rank": 50,
"refresh_period": 86400, "refresh_period": 86400,
"mode": "whitelist",
"categories": ["layer-1"] "categories": ["layer-1"]
} }
] ]
``` ```
`number_assets` defines the maximum number of pairs returned by the pairlist if used in whitelist `mode`. In blacklist `mode`, this setting will be ignored. `number_assets` defines the maximum number of pairs returned by the pairlist. `max_rank` will determine the maximum rank used in creating/filtering the pairlist. It's expected that some coins within the top `max_rank` marketcap will not be included in the resulting pairlist since not all pairs will have active trading pairs in your preferred market/stake/exchange combination.
`max_rank` will determine the maximum rank used in creating/filtering the pairlist. It's expected that some coins within the top `max_rank` marketcap will not be included in the resulting pairlist since not all pairs will have active trading pairs in your preferred market/stake/exchange combination.
While using a `max_rank` bigger than 250 is supported, it's not recommended, as it'll cause multiple API calls to CoinGecko, which can lead to rate limit issues. While using a `max_rank` bigger than 250 is supported, it's not recommended, as it'll cause multiple API calls to CoinGecko, which can lead to rate limit issues.
The `refresh_period` setting defines the interval (in seconds) at which the marketcap rank data will be refreshed. The default is 86,400 seconds (1 day). The pairlist cache (`refresh_period`) applies to both generating pairlists (when in the first position in the list) and filtering instances (when not in the first position in the list). The `refresh_period` setting defines the interval (in seconds) at which the marketcap rank data will be refreshed. The default is 86,400 seconds (1 day). The pairlist cache (`refresh_period`) applies to both generating pairlists (when in the first position in the list) and filtering instances (when not in the first position in the list).
The `mode` setting defines whether the plugin will filters in (whitelist `mode`) or filters out (blacklist `mode`) top marketcap ranked coins. By default, the plugin will be in whitelist mode.
The `categories` setting specifies the [coingecko categories](https://www.coingecko.com/en/categories) from which to select coins from. The default is an empty list `[]`, meaning no category filtering is applied. The `categories` setting specifies the [coingecko categories](https://www.coingecko.com/en/categories) from which to select coins from. The default is an empty list `[]`, meaning no category filtering is applied.
If an incorrect category string is chosen, the plugin will print the available categories from CoinGecko and fail. The category should be the ID of the category, for example, for `https://www.coingecko.com/en/categories/layer-1`, the category ID would be `layer-1`. You can pass multiple categories such as `["layer-1", "meme-token"]` to select from several categories. If an incorrect category string is chosen, the plugin will print the available categories from CoinGecko and fail. The category should be the ID of the category, for example, for `https://www.coingecko.com/en/categories/layer-1`, the category ID would be `layer-1`. You can pass multiple categories such as `["layer-1", "meme-token"]` to select from several categories.
@@ -417,7 +412,7 @@ This filter allows freqtrade to ignore pairs until they have been listed for at
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: 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" !!! Note "Available exchanges"
Delist filter is available on Bybit Futures, Bitget Futures and Binance, where Binance Futures will work for both dry and live modes, while Binance Spot is limited to live mode (for technical reasons). 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" !!! Warning "Backtesting"
`DelistFilter` does not support backtesting mode. `DelistFilter` does not support backtesting mode.

View File

@@ -1,6 +1,6 @@
![freqtrade](assets/freqtrade_poweredby.svg) ![freqtrade](assets/freqtrade_poweredby.svg)
[![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml) [![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/)
[![DOI](https://joss.theoj.org/papers/10.21105/joss.04864/status.svg)](https://doi.org/10.21105/joss.04864) [![DOI](https://joss.theoj.org/papers/10.21105/joss.04864/status.svg)](https://doi.org/10.21105/joss.04864)
[![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop) [![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop)

View File

@@ -1,7 +1,7 @@
markdown==3.10 markdown==3.9
mkdocs==1.6.1 mkdocs==1.6.1
mkdocs-material==9.7.0 mkdocs-material==9.6.22
mdx_truly_sane_lists==1.3 mdx_truly_sane_lists==1.3
pymdown-extensions==10.17.2 pymdown-extensions==10.16.1
jinja2==3.1.6 jinja2==3.1.6
mike==2.1.3 mike==2.1.3

View File

@@ -150,16 +150,184 @@ This method will work for all arguments - check the "show" command for a list of
For a full list of available commands, please refer to the list below. For a full list of available commands, please refer to the list below.
#### Freqtrade client- available commands
Possible commands can be listed from the rest-client script using the `help` command. Possible commands can be listed from the rest-client script using the `help` command.
``` bash ``` bash
freqtrade-client help freqtrade-client help
``` ```
--8<-- "commands/freqtrade-client.md" ``` output
Possible commands:
available_pairs
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.
blacklist
Show the current blacklist.
:param add: List of coins to add (example: "BNB/BTC")
cancel_open_order
Cancel open order for trade.
:param trade_id: Cancels open orders for this trade.
count
Return the amount of open trades.
daily
Return the profits for each day, and amount of trades.
delete_lock
Delete (disable) lock from the database.
:param lock_id: ID for the lock to delete
delete_trade
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.
:param pair: Pair to buy (ETH/BTC)
:param price: Optional - price to buy
forceenter
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.
: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.
lock_add
Manually lock a specific pair
:param pair: Pair to lock
:param until: Lock until this date (format "2024-03-30 16:00:00Z")
:param side: Side to lock (long, short, *)
:param reason: Reason for the lock
locks
Return current locks
logs
Show latest logs.
:param limit: Limits log messages to the last <limit> logs. No limit to get the entire log.
pair_candles
Return live dataframe for <pair><timeframe>.
: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
:param pair: Pair to get data for
:param timeframe: Only pairs with this timeframe available.
:param strategy: Strategy to analyze and get values for
:param timerange: Timerange to get data for (same format than --timerange endpoints)
performance
Return the performance of the different coins.
ping
simple ping
plot_config
Return plot configuration if the strategy defines one.
profit
Return the profit summary.
reload_config
Reload configuration.
show_config
Returns part of the configuration, relevant for trading operations.
start
Start the bot if it's in the stopped state.
pause
Pause the bot if it's in the running state. If triggered on stopped state will handle open positions.
stats
Return the stats report (durations, sell-reasons).
status
Get the status of open trades.
stop
Stop the bot. Use `start` to restart.
stopbuy
Stop buying (but handle sells gracefully). Use `reload_config` to reset.
strategies
Lists available strategies
strategy
Get strategy details
:param strategy: Strategy class name
sysinfo
Provides system information (CPU, RAM usage)
trade
Return specific trade
:param trade_id: Specify which trade to get.
trades
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.
list_open_trades_custom_data
Return a dict containing open trades custom-datas
:param key: str, optional - Key of the custom-data
:param limit: Limits trades to X trades.
:param offset: Offset by this amount of trades.
list_custom_data
Return a dict containing custom-datas of a specified trade
:param trade_id: int - ID of the trade
:param key: str, optional - Key of the custom-data
version
Return the version of the bot.
whitelist
Show the current whitelist.
```
### Available endpoints ### Available endpoints
@@ -191,7 +359,7 @@ All endpoints in the below table need to be prefixed with the base URL of the AP
| `/locks/<lockid>` | DELETE | Deletes (disables) the lock by id.<br/>*Params:*<br/>- `lockid` (`int`) | `/locks/<lockid>` | DELETE | Deletes (disables) the lock by id.<br/>*Params:*<br/>- `lockid` (`int`)
| `/profit` | GET | Display a summary of your profit/loss from close trades and some stats about your performance. | `/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.<br/>*Params:*<br/>- `<tradeid>` (`int` or `str`)<br/>- `<ordertype>` (`str`)<br/>- `[amount]` (`float`) | `/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.<br/>*Params:*<br/>- `<tradeid>` (`int` or `str`)<br/>- `<ordertype>` (`str`)<br/>- `[amount]` (`float`)
| `/forceenter` | POST | Instantly enters the given pair. Side is optional and is either `long` or `short` (default is `long`). Price, stake amount, entry tag and leverage are optional. Order type is optional and is either `market` or `long` (default using the value set in config). (`force_entry_enable` must be set to True)<br/>*Params:*<br/>- `<pair>` (`str`)<br/>- `<side>` (`str`)<br/>- `[price]` (`float`)<br/>- `[ordertype]` (`str`)<br/>- `[stakeamount]` (`float`)<br/>- `[entry_tag]` (`str`)<br/>- `[leverage]` (`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)<br/>*Params:*<br/>- `<pair>` (`str`)<br/>- `<side>` (`str`)<br/>- `[rate]` (`float`)
| `/performance` | GET | Show performance of each finished trade grouped by pair. | `/performance` | GET | Show performance of each finished trade grouped by pair.
| `/balance` | GET | Show account balance per currency. | `/balance` | GET | Show account balance per currency.
| `/daily` | GET | Shows profit or loss per day, over the last n days (n defaults to 7).<br/>*Params:*<br/>- `timescale` (`int`) | `/daily` | GET | Shows profit or loss per day, over the last n days (n defaults to 7).<br/>*Params:*<br/>- `timescale` (`int`)

View File

@@ -634,7 +634,7 @@ class AwesomeStrategy(IStrategy):
## Custom order price rules ## Custom order price rules
By default, freqtrade use the orderbook to automatically set an order price ([Relevant documentation](configuration.md#prices-used-for-orders)), you also have the option to create custom order prices based on your strategy. By default, freqtrade use the orderbook to automatically set an order price([Relevant documentation](configuration.md#prices-used-for-orders)), you also have the option to create custom order prices based on your strategy.
You can use this feature by creating a `custom_entry_price()` function in your strategy file to customize entry prices and `custom_exit_price()` for exits. You can use this feature by creating a `custom_entry_price()` function in your strategy file to customize entry prices and `custom_exit_price()` for exits.

View File

@@ -1,6 +1,6 @@
"""Freqtrade bot""" """Freqtrade bot"""
__version__ = "2025.12-dev" __version__ = "2025.10"
if "dev" in __version__: if "dev" in __version__:
from pathlib import Path from pathlib import Path

View File

@@ -3,7 +3,6 @@ This module contains the argument manager class
""" """
from argparse import ArgumentParser, Namespace, _ArgumentGroup from argparse import ArgumentParser, Namespace, _ArgumentGroup
from copy import deepcopy
from functools import partial from functools import partial
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
@@ -105,7 +104,7 @@ ARGS_BACKTEST_SHOW = [
ARGS_LIST_EXCHANGES = ["print_one_column", "list_exchanges_all", "trading_mode", "dex_exchanges"] ARGS_LIST_EXCHANGES = ["print_one_column", "list_exchanges_all", "trading_mode", "dex_exchanges"]
ARGS_LIST_TIMEFRAMES = ["exchange", "print_one_column", "trading_mode"] ARGS_LIST_TIMEFRAMES = ["exchange", "print_one_column"]
ARGS_LIST_PAIRS = [ ARGS_LIST_PAIRS = [
"exchange", "exchange",
@@ -175,7 +174,6 @@ ARGS_DOWNLOAD_DATA = [
"dataformat_ohlcv", "dataformat_ohlcv",
"dataformat_trades", "dataformat_trades",
"trading_mode", "trading_mode",
"candle_types",
"prepend_data", "prepend_data",
] ]
@@ -350,11 +348,7 @@ class Arguments:
def _build_args(self, optionlist: list[str], parser: ArgumentParser | _ArgumentGroup) -> None: def _build_args(self, optionlist: list[str], parser: ArgumentParser | _ArgumentGroup) -> None:
for val in optionlist: for val in optionlist:
opt = AVAILABLE_CLI_OPTIONS[val] opt = AVAILABLE_CLI_OPTIONS[val]
options = deepcopy(opt.kwargs) parser.add_argument(*opt.cli, dest=val, **opt.kwargs)
help_text = options.pop("help", None)
if opt.fthelp and isinstance(opt.fthelp, dict) and hasattr(parser, "prog"):
help_text = opt.fthelp.get(parser.prog, help_text)
parser.add_argument(*opt.cli, dest=val, help=help_text, **options)
def _build_subcommands(self) -> None: def _build_subcommands(self) -> None:
""" """

View File

@@ -5,10 +5,7 @@ Definition of cli arguments used in arguments.py
from argparse import ArgumentTypeError from argparse import ArgumentTypeError
from freqtrade import constants from freqtrade import constants
from freqtrade.constants import ( from freqtrade.constants import HYPEROPT_LOSS_BUILTIN
HYPEROPT_BUILTIN_SPACE_OPTIONS,
HYPEROPT_LOSS_BUILTIN,
)
from freqtrade.enums import CandleType from freqtrade.enums import CandleType
@@ -38,14 +35,8 @@ def check_int_nonzero(value: str) -> int:
class Arg: class Arg:
# Optional CLI arguments # Optional CLI arguments
def __init__(self, *args, fthelp: dict[str, str] | None = None, **kwargs): def __init__(self, *args, **kwargs):
"""
CLI Arguments - used to build subcommand parsers consistently.
:param fthelp: dict - fthelp per command - should be "freqtrade <command>": help_text
If not provided or not found, 'help' from kwargs is used instead.
"""
self.cli = args self.cli = args
self.fthelp = fthelp
self.kwargs = kwargs self.kwargs = kwargs
@@ -287,18 +278,26 @@ AVAILABLE_CLI_OPTIONS = {
), ),
"spaces": Arg( "spaces": Arg(
"--spaces", "--spaces",
help=( help="Specify which parameters to hyperopt. Space-separated list.",
"Specify which parameters to hyperopt. Space-separated list. " choices=[
"Available builtin options (custom spaces will not be listed here): " "all",
f"{', '.join(HYPEROPT_BUILTIN_SPACE_OPTIONS)}. Default: `default` - " "buy",
"which includes all spaces except for 'trailing', 'protection', and 'trades'." "sell",
), "roi",
"stoploss",
"trailing",
"protection",
"trades",
"default",
],
nargs="+", nargs="+",
default="default",
), ),
"analyze_per_epoch": Arg( "analyze_per_epoch": Arg(
"--analyze-per-epoch", "--analyze-per-epoch",
help="Run populate_indicators once per epoch.", help="Run populate_indicators once per epoch.",
action="store_true", action="store_true",
default=False,
), ),
"print_all": Arg( "print_all": Arg(
"--print-all", "--print-all",
@@ -428,14 +427,6 @@ AVAILABLE_CLI_OPTIONS = {
), ),
"candle_types": Arg( "candle_types": Arg(
"--candle-types", "--candle-types",
fthelp={
"freqtrade download-data": (
"Select candle type to download. "
"Defaults to the necessary candles for the selected trading mode "
"(e.g. 'spot' or ('futures', 'funding_rate' and 'mark') for futures)."
),
"_": "Select candle type to convert. Defaults to all available types.",
},
help="Select candle type to convert. Defaults to all available types.", help="Select candle type to convert. Defaults to all available types.",
choices=[c.value for c in CandleType], choices=[c.value for c in CandleType],
nargs="+", nargs="+",

View File

@@ -101,7 +101,7 @@ def _print_objs_tabular(objs: list, print_colorized: bool) -> None:
names = [s["name"] for s in objs] names = [s["name"] for s in objs]
objs_to_print: list[dict[str, Text | str]] = [ objs_to_print: list[dict[str, Text | str]] = [
{ {
"Strategy name": Text(s["name"] if s["name"] else "--"), "name": Text(s["name"] if s["name"] else "--"),
"location": s["location_rel"], "location": s["location_rel"],
"status": ( "status": (
Text("LOAD FAILED", style="bold red") Text("LOAD FAILED", style="bold red")
@@ -115,19 +115,11 @@ def _print_objs_tabular(objs: list, print_colorized: bool) -> None:
] ]
for idx, s in enumerate(objs): for idx, s in enumerate(objs):
if "hyperoptable" in s: if "hyperoptable" in s:
custom_params = [
f"{space}: {len(params)}"
for space, params in s["hyperoptable"].items()
if space not in ["buy", "sell", "protection"]
]
hyp = s["hyperoptable"]
objs_to_print[idx].update( objs_to_print[idx].update(
{ {
"hyperoptable": "Yes" if len(hyp) > 0 else "No", "hyperoptable": "Yes" if s["hyperoptable"]["count"] > 0 else "No",
"buy-Params": str(len(hyp.get("buy", []))), "buy-Params": str(len(s["hyperoptable"].get("buy", []))),
"sell-Params": str(len(hyp.get("sell", []))), "sell-Params": str(len(s["hyperoptable"].get("sell", []))),
"protection-Params": str(len(hyp.get("protection", []))),
"custom-Params": ", ".join(custom_params) if custom_params else "",
} }
) )
table = Table() table = Table()
@@ -148,7 +140,6 @@ def start_list_strategies(args: dict[str, Any]) -> None:
""" """
from freqtrade.configuration import setup_utils_configuration from freqtrade.configuration import setup_utils_configuration
from freqtrade.resolvers import StrategyResolver from freqtrade.resolvers import StrategyResolver
from freqtrade.strategy.hyper import detect_all_parameters
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE) config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
@@ -162,9 +153,9 @@ def start_list_strategies(args: dict[str, Any]) -> None:
strategy_objs = sorted(strategy_objs, key=lambda x: x["name"]) strategy_objs = sorted(strategy_objs, key=lambda x: x["name"])
for obj in strategy_objs: for obj in strategy_objs:
if obj["class"]: if obj["class"]:
obj["hyperoptable"] = detect_all_parameters(obj["class"]) obj["hyperoptable"] = obj["class"].detect_all_parameters()
else: else:
obj["hyperoptable"] = {} obj["hyperoptable"] = {"count": 0}
if args["print_one_column"]: if args["print_one_column"]:
print("\n".join([s["name"] for s in strategy_objs])) print("\n".join([s["name"] for s in strategy_objs]))

View File

@@ -1,14 +1,11 @@
# Required json-schema for user specified config # Required json-schema for user specified config
from freqtrade.constants import ( from freqtrade.constants import (
AVAILABLE_DATAHANDLERS, AVAILABLE_DATAHANDLERS,
AVAILABLE_PAIRLISTS, AVAILABLE_PAIRLISTS,
BACKTEST_BREAKDOWNS, BACKTEST_BREAKDOWNS,
BACKTEST_CACHE_AGE,
DRY_RUN_WALLET, DRY_RUN_WALLET,
EXPORT_OPTIONS, EXPORT_OPTIONS,
HYPEROPT_LOSS_BUILTIN,
MARGIN_MODES, MARGIN_MODES,
ORDERTIF_POSSIBILITIES, ORDERTIF_POSSIBILITIES,
ORDERTYPE_POSSIBILITIES, ORDERTYPE_POSSIBILITIES,
@@ -231,76 +228,6 @@ CONF_SCHEMA = {
"type": "array", "type": "array",
"items": {"type": "string", "enum": BACKTEST_BREAKDOWNS}, "items": {"type": "string", "enum": BACKTEST_BREAKDOWNS},
}, },
"backtest_cache": {
"description": "Load a cached backtest result no older than specified age.",
"type": "string",
"enum": BACKTEST_CACHE_AGE,
},
# Hyperopt
"hyperopt_path": {
"description": "Specify additional lookup path for Hyperopt Loss functions.",
"type": "string",
},
"epochs": {
"description": "Number of training epochs for Hyperopt.",
"type": "integer",
"minimum": 1,
},
"early_stop": {
"description": (
"Early stop hyperopt if no improvement after <epochs>. Set to 0 to disable."
),
"type": "integer",
"minimum": 0,
},
"spaces": {
"description": (
"Hyperopt parameter spaces to optimize. Default is the default set and"
"includes all spaces except for 'trailing', 'protection', and 'trades'."
),
"type": "array",
"items": {"type": "string"},
"default": ["default"],
},
"analyze_per_epoch": {
"description": "Perform analysis after each epoch in Hyperopt.",
"type": "boolean",
},
"print_all": {
"description": "Print all hyperopt trials, not just the best ones.",
"type": "boolean",
"default": False,
},
"hyperopt_jobs": {
"description": (
"The number of concurrently running jobs for hyperoptimization "
"(hyperopt worker processes). "
"If -1 (default), all CPUs are used, for -2, all CPUs but one are used, etc. "
"If 1 is given, no parallel computing is used."
),
"type": "integer",
"default": -1,
},
"hyperopt_random_state": {
"description": "Random state for hyperopt trials.",
"type": "integer",
"minimum": 0,
},
"hyperopt_min_trades": {
"description": "Minimum number of trades per epoch for hyperopt.",
"type": "integer",
"minimum": 0,
},
"hyperopt_loss": {
"description": (
"The class name of the hyperopt loss function class (IHyperOptLoss). "
"Different functions can generate completely different results, "
"since the target for optimization is different. "
f"Built-in Hyperopt-loss-functions are: {', '.join(HYPEROPT_LOSS_BUILTIN)}"
),
"type": "string",
},
# end hyperopt
"bot_name": { "bot_name": {
"description": "Name of the trading bot. Passed via API to a client.", "description": "Name of the trading bot. Passed via API to a client.",
"type": "string", "type": "string",

View File

@@ -41,19 +41,6 @@ HYPEROPT_LOSS_BUILTIN = [
"ProfitDrawDownHyperOptLoss", "ProfitDrawDownHyperOptLoss",
"MultiMetricHyperOptLoss", "MultiMetricHyperOptLoss",
] ]
HYPEROPT_BUILTIN_SPACES = [
"buy",
"sell",
"enter",
"exit",
"roi",
"stoploss",
"trailing",
"protection",
"trades",
]
HYPEROPT_BUILTIN_SPACE_OPTIONS = ["default", "all"] + HYPEROPT_BUILTIN_SPACES
AVAILABLE_PAIRLISTS = [ AVAILABLE_PAIRLISTS = [
"StaticPairList", "StaticPairList",
"VolumePairList", "VolumePairList",

View File

@@ -38,8 +38,7 @@ def ohlcv_to_dataframe(
cols = DEFAULT_DATAFRAME_COLUMNS cols = DEFAULT_DATAFRAME_COLUMNS
df = DataFrame(ohlcv, columns=cols) df = DataFrame(ohlcv, columns=cols)
# Floor date to seconds to account for exchange imprecisions df["date"] = to_datetime(df["date"], unit="ms", utc=True)
df["date"] = to_datetime(df["date"], unit="ms", utc=True).dt.floor("s")
# Some exchanges return int values for Volume and even for OHLC. # Some exchanges return int values for Volume and even for OHLC.
# Convert them since TA-LIB indicators used in the strategy assume floats # Convert them since TA-LIB indicators used in the strategy assume floats

View File

@@ -348,22 +348,6 @@ class DataProvider:
) )
return total_candles return total_candles
def __fix_funding_rate_timeframe(
self, pair: str, timeframe: str | None, candle_type: str
) -> str | None:
if (
candle_type == CandleType.FUNDING_RATE
and (ff_tf := self.get_funding_rate_timeframe()) != timeframe
):
# TODO: does this message make sense? might be pointless as funding fees don't
# have a timeframe
logger.warning(
f"{pair}, {timeframe} requested - funding rate timeframe not matching {ff_tf}."
)
return ff_tf
return timeframe
def get_pair_dataframe( def get_pair_dataframe(
self, pair: str, timeframe: str | None = None, candle_type: str = "" self, pair: str, timeframe: str | None = None, candle_type: str = ""
) -> DataFrame: ) -> DataFrame:
@@ -377,7 +361,6 @@ class DataProvider:
:return: Dataframe for this pair :return: Dataframe for this pair
:param candle_type: '', mark, index, premiumIndex, or funding_rate :param candle_type: '', mark, index, premiumIndex, or funding_rate
""" """
timeframe = self.__fix_funding_rate_timeframe(pair, timeframe, candle_type)
if self.runmode in (RunMode.DRY_RUN, RunMode.LIVE): if self.runmode in (RunMode.DRY_RUN, RunMode.LIVE):
# Get live OHLCV data. # Get live OHLCV data.
data = self.ohlcv(pair=pair, timeframe=timeframe, candle_type=candle_type) data = self.ohlcv(pair=pair, timeframe=timeframe, candle_type=candle_type)
@@ -637,12 +620,3 @@ class DataProvider:
except ExchangeError: except ExchangeError:
logger.warning(f"Could not fetch market data for {pair}. Assuming no delisting.") logger.warning(f"Could not fetch market data for {pair}. Assuming no delisting.")
return None return None
def get_funding_rate_timeframe(self) -> str:
"""
Get the funding rate timeframe from exchange options
:return: Timeframe string
"""
if self._exchange is None:
raise OperationalException(NO_EXCHANGE_EXCEPTION)
return self._exchange.get_option("funding_fee_timeframe")

View File

@@ -397,9 +397,6 @@ class IDataHandler(ABC):
pairdf = self._ohlcv_load( pairdf = self._ohlcv_load(
pair, timeframe, timerange=timerange_startup, candle_type=candle_type pair, timeframe, timerange=timerange_startup, candle_type=candle_type
) )
if not pairdf.empty and candle_type == CandleType.FUNDING_RATE:
# Funding rate data is sometimes off by a couple of ms - floor to seconds
pairdf["date"] = pairdf["date"].dt.floor("s")
if self._check_empty_df(pairdf, pair, timeframe, candle_type, warn_no_data): if self._check_empty_df(pairdf, pair, timeframe, candle_type, warn_no_data):
return pairdf return pairdf
else: else:
@@ -511,15 +508,8 @@ class IDataHandler(ABC):
Applies to bybit and okx, where funding-fee and mark candles have different timeframes. Applies to bybit and okx, where funding-fee and mark candles have different timeframes.
""" """
paircombs = self.ohlcv_get_available_data(self._datadir, TradingMode.FUTURES) paircombs = self.ohlcv_get_available_data(self._datadir, TradingMode.FUTURES)
ff_timeframe_s = timeframe_to_seconds(ff_timeframe)
funding_rate_combs = [ funding_rate_combs = [
f f for f in paircombs if f[2] == CandleType.FUNDING_RATE and f[1] != ff_timeframe
for f in paircombs
if f[2] == CandleType.FUNDING_RATE
and f[1] != ff_timeframe
# Only allow smaller timeframes to move from smaller to larger timeframes
and timeframe_to_seconds(f[1]) < ff_timeframe_s
] ]
if funding_rate_combs: if funding_rate_combs:

View File

@@ -308,15 +308,11 @@ def _download_pair_history(
candle_type=candle_type, candle_type=candle_type,
until_ms=until_ms if until_ms else None, until_ms=until_ms if until_ms else None,
) )
logger.info( logger.info(f"Downloaded data for {pair} with length {len(new_dataframe)}.")
f"Downloaded data for {pair}, {timeframe}, {candle_type} with length "
f"{len(new_dataframe)}."
)
else: else:
new_dataframe = pair_candles new_dataframe = pair_candles
logger.info( logger.info(
f"Downloaded data for {pair}, {timeframe}, {candle_type} with length " f"Downloaded data for {pair} with length {len(new_dataframe)}. Parallel Method."
f"{len(new_dataframe)}. Parallel Method."
) )
if data.empty: if data.empty:
@@ -353,7 +349,6 @@ def _download_pair_history(
def refresh_backtest_ohlcv_data( def refresh_backtest_ohlcv_data(
exchange: Exchange, exchange: Exchange,
*,
pairs: list[str], pairs: list[str],
timeframes: list[str], timeframes: list[str],
datadir: Path, datadir: Path,
@@ -364,7 +359,6 @@ def refresh_backtest_ohlcv_data(
data_format: str | None = None, data_format: str | None = None,
prepend: bool = False, prepend: bool = False,
progress_tracker: CustomProgress | None = None, progress_tracker: CustomProgress | None = None,
candle_types: list[CandleType] | None = None,
no_parallel_download: bool = False, no_parallel_download: bool = False,
) -> list[str]: ) -> list[str]:
""" """
@@ -377,44 +371,10 @@ def refresh_backtest_ohlcv_data(
pairs_not_available = [] pairs_not_available = []
fast_candles: dict[PairWithTimeframe, DataFrame] = {} fast_candles: dict[PairWithTimeframe, DataFrame] = {}
data_handler = get_datahandler(datadir, data_format) data_handler = get_datahandler(datadir, data_format)
def_candletype = CandleType.SPOT if trading_mode != "futures" else CandleType.FUTURES candle_type = CandleType.get_default(trading_mode)
if trading_mode != "futures":
# Ignore user passed candle types for non-futures trading
timeframes_with_candletype = [(tf, def_candletype) for tf in timeframes]
else:
# Filter out SPOT candle type for futures trading
candle_types = (
[ct for ct in candle_types if ct != CandleType.SPOT] if candle_types else None
)
fr_candle_type = CandleType.from_string(exchange.get_option("mark_ohlcv_price"))
tf_funding_rate = exchange.get_option("funding_fee_timeframe")
tf_mark = exchange.get_option("mark_ohlcv_timeframe")
if candle_types:
for ct in candle_types:
exchange.verify_candle_type_support(ct)
timeframes_with_candletype = [
(tf, ct)
for ct in candle_types
for tf in timeframes
if ct != CandleType.FUNDING_RATE
]
else:
# Default behavior
timeframes_with_candletype = [(tf, def_candletype) for tf in timeframes]
timeframes_with_candletype.append((tf_mark, fr_candle_type))
if not candle_types or CandleType.FUNDING_RATE in candle_types:
# All exchanges need FundingRate for futures trading.
# The timeframe is aligned to the mark-price timeframe.
timeframes_with_candletype.append((tf_funding_rate, CandleType.FUNDING_RATE))
# Deduplicate list ...
timeframes_with_candletype = list(dict.fromkeys(timeframes_with_candletype))
logger.debug(
"Downloading %s.", ", ".join(f'"{tf} {ct}"' for tf, ct in timeframes_with_candletype)
)
with progress_tracker as progress: with progress_tracker as progress:
timeframe_task = progress.add_task("Timeframe", total=len(timeframes_with_candletype)) tf_length = len(timeframes) if trading_mode != "futures" else len(timeframes) + 2
timeframe_task = progress.add_task("Timeframe", total=tf_length)
pair_task = progress.add_task("Downloading data...", total=len(pairs)) pair_task = progress.add_task("Downloading data...", total=len(pairs))
for pair in pairs: for pair in pairs:
@@ -425,13 +385,11 @@ def refresh_backtest_ohlcv_data(
pairs_not_available.append(f"{pair}: Pair not available on exchange.") pairs_not_available.append(f"{pair}: Pair not available on exchange.")
logger.info(f"Skipping pair {pair}...") logger.info(f"Skipping pair {pair}...")
continue continue
for timeframe, candle_type in timeframes_with_candletype: for timeframe in timeframes:
# Get fast candles via parallel method on first loop through per timeframe # 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. # and candle type. Downloads all the pairs in the list and stores them.
# Also skips if only 1 pair/timeframe combination is scheduled for download.
if ( if (
not no_parallel_download not no_parallel_download
and (len(pairs) + len(timeframes)) > 2
and exchange.get_option("download_data_parallel_quick", True) and exchange.get_option("download_data_parallel_quick", True)
and ( and (
((pair, timeframe, candle_type) not in fast_candles) ((pair, timeframe, candle_type) not in fast_candles)
@@ -452,7 +410,7 @@ def refresh_backtest_ohlcv_data(
# get the already downloaded pair candles if they exist # get the already downloaded pair candles if they exist
pair_candles = fast_candles.pop((pair, timeframe, candle_type), None) pair_candles = fast_candles.pop((pair, timeframe, candle_type), None)
progress.update(timeframe_task, description=f"Timeframe {timeframe} {candle_type}") progress.update(timeframe_task, description=f"Timeframe {timeframe}")
logger.debug(f"Downloading pair {pair}, {candle_type}, interval {timeframe}.") logger.debug(f"Downloading pair {pair}, {candle_type}, interval {timeframe}.")
_download_pair_history( _download_pair_history(
pair=pair, pair=pair,
@@ -468,6 +426,33 @@ def refresh_backtest_ohlcv_data(
pair_candles=pair_candles, # optional pass of dataframe of parallel candles pair_candles=pair_candles, # optional pass of dataframe of parallel candles
) )
progress.update(timeframe_task, advance=1) progress.update(timeframe_task, advance=1)
if trading_mode == "futures":
# Predefined candletype (and timeframe) depending on exchange
# Downloads what is necessary to backtest based on futures data.
tf_mark = exchange.get_option("mark_ohlcv_timeframe")
tf_funding_rate = exchange.get_option("funding_fee_timeframe")
fr_candle_type = CandleType.from_string(exchange.get_option("mark_ohlcv_price"))
# All exchanges need FundingRate for futures trading.
# The timeframe is aligned to the mark-price timeframe.
combs = ((CandleType.FUNDING_RATE, tf_funding_rate), (fr_candle_type, tf_mark))
for candle_type_f, tf in combs:
logger.debug(f"Downloading pair {pair}, {candle_type_f}, interval {tf}.")
_download_pair_history(
pair=pair,
datadir=datadir,
exchange=exchange,
timerange=timerange,
data_handler=data_handler,
timeframe=str(tf),
new_pairs_days=new_pairs_days,
candle_type=candle_type_f,
erase=erase,
prepend=prepend,
)
progress.update(
timeframe_task, advance=1, description=f"Timeframe {candle_type_f}, {tf}"
)
progress.update(pair_task, advance=1) progress.update(pair_task, advance=1)
progress.update(timeframe_task, description="Timeframe") progress.update(timeframe_task, description="Timeframe")
@@ -489,7 +474,7 @@ def _download_all_pairs_history_parallel(
:return: Candle pairs with timeframes :return: Candle pairs with timeframes
""" """
candles: dict[PairWithTimeframe, DataFrame] = {} candles: dict[PairWithTimeframe, DataFrame] = {}
since: int | None = None since = 0
if timerange: if timerange:
if timerange.starttype == "date": if timerange.starttype == "date":
since = timerange.startts * 1000 since = timerange.startts * 1000
@@ -497,12 +482,10 @@ def _download_all_pairs_history_parallel(
candle_limit = exchange.ohlcv_candle_limit(timeframe, candle_type) candle_limit = exchange.ohlcv_candle_limit(timeframe, candle_type)
one_call_min_time_dt = dt_ts(date_minus_candles(timeframe, candle_limit)) 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 # check if we can get all candles in one go, if so then we can download them in parallel
if since is None or since > one_call_min_time_dt: if since > one_call_min_time_dt:
logger.info( logger.info(
f"Downloading parallel candles for {timeframe} for all pairs" f"Downloading parallel candles for {timeframe} for all pairs "
f" since {format_ms_time(since)}" f"since {format_ms_time(since)}"
if since
else "."
) )
needed_pairs: ListPairsWithTimeframes = [ needed_pairs: ListPairsWithTimeframes = [
(p, timeframe, candle_type) for p in [p for p in pairs] (p, timeframe, candle_type) for p in [p for p in pairs]
@@ -710,9 +693,6 @@ def download_data(
""" """
Download data function. Used from both cli and API. Download data function. Used from both cli and API.
""" """
exchange.validate_trading_mode_and_margin_mode(
config.get("trading_mode", TradingMode.SPOT), None, allow_none_margin_mode=True
)
timerange = TimeRange() timerange = TimeRange()
if "days" in config and config["days"] is not None: if "days" in config and config["days"] is not None:
time_since = (datetime.now() - timedelta(days=config["days"])).strftime("%Y%m%d") time_since = (datetime.now() - timedelta(days=config["days"])).strftime("%Y%m%d")
@@ -813,7 +793,6 @@ def download_data(
trading_mode=config.get("trading_mode", "spot"), trading_mode=config.get("trading_mode", "spot"),
prepend=config.get("prepend_data", False), prepend=config.get("prepend_data", False),
progress_tracker=progress_tracker, progress_tracker=progress_tracker,
candle_types=config.get("candle_types"),
no_parallel_download=config.get("no_parallel_download", False), no_parallel_download=config.get("no_parallel_download", False),
) )
finally: finally:

View File

@@ -74,10 +74,9 @@ def combined_dataframes_with_rel_mean(
df_comb = combine_dataframes_by_column(data, column) df_comb = combine_dataframes_by_column(data, column)
# Trim dataframes to the given timeframe # Trim dataframes to the given timeframe
df_comb = df_comb.iloc[(df_comb.index >= fromdt) & (df_comb.index < todt)] df_comb = df_comb.iloc[(df_comb.index >= fromdt) & (df_comb.index < todt)]
rel_mean = df_comb.pct_change().mean(axis=1).fillna(0).cumsum()
df_comb["count"] = df_comb.count(axis=1) df_comb["count"] = df_comb.count(axis=1)
df_comb["mean"] = df_comb.mean(axis=1) df_comb["mean"] = df_comb.mean(axis=1)
df_comb["rel_mean"] = rel_mean df_comb["rel_mean"] = df_comb["mean"].pct_change().fillna(0).cumsum()
return df_comb[["mean", "rel_mean", "count"]] return df_comb[["mean", "rel_mean", "count"]]
@@ -144,20 +143,6 @@ def _calc_drawdown_series(
max_drawdown_df["drawdown_relative"] = ( max_drawdown_df["drawdown_relative"] = (
max_drawdown_df["high_value"] - max_drawdown_df["cumulative"] max_drawdown_df["high_value"] - max_drawdown_df["cumulative"]
) / max_drawdown_df["high_value"] ) / max_drawdown_df["high_value"]
# Add zero row at start to account for edge-cases with no winning / losing trades - so high/low
# will be 0.0 in such cases.
zero_row = pd.DataFrame(
{
"cumulative": [0.0],
"high_value": [0.0],
"drawdown": [0.0],
"drawdown_relative": [0.0],
"date": [profit_results.loc[0, date_col]],
}
)
max_drawdown_df = pd.concat([zero_row, max_drawdown_df], ignore_index=True)
return max_drawdown_df return max_drawdown_df
@@ -230,7 +215,6 @@ def calculate_max_drawdown(
max_drawdown_df = _calc_drawdown_series( max_drawdown_df = _calc_drawdown_series(
profit_results, date_col=date_col, value_col=value_col, starting_balance=starting_balance profit_results, date_col=date_col, value_col=value_col, starting_balance=starting_balance
) )
# max_drawdown_df has an extra zero row at the start
# Calculate maximum drawdown # Calculate maximum drawdown
idxmin = ( idxmin = (
@@ -239,15 +223,15 @@ def calculate_max_drawdown(
else max_drawdown_df["drawdown"].idxmin() else max_drawdown_df["drawdown"].idxmin()
) )
high_idx = max_drawdown_df.iloc[: idxmin + 1]["high_value"].idxmax() high_idx = max_drawdown_df.iloc[: idxmin + 1]["high_value"].idxmax()
high_date = profit_results.at[max(high_idx - 1, 0), date_col] high_date = profit_results.loc[high_idx, date_col]
low_date = profit_results.at[max(idxmin - 1, 0), date_col] low_date = profit_results.loc[idxmin, date_col]
high_val = max_drawdown_df.at[high_idx, "cumulative"] high_val = max_drawdown_df.loc[high_idx, "cumulative"]
low_val = max_drawdown_df.at[idxmin, "cumulative"] low_val = max_drawdown_df.loc[idxmin, "cumulative"]
max_drawdown_rel = max_drawdown_df.at[idxmin, "drawdown_relative"] max_drawdown_rel = max_drawdown_df.loc[idxmin, "drawdown_relative"]
# Calculate current drawdown # Calculate current drawdown
current_high_idx = max_drawdown_df["high_value"].iloc[:-1].idxmax() current_high_idx = max_drawdown_df["high_value"].iloc[:-1].idxmax()
current_high_date = profit_results.at[max(current_high_idx - 1, 0), date_col] current_high_date = profit_results.loc[current_high_idx, date_col]
current_high_value = max_drawdown_df.iloc[-1]["high_value"] current_high_value = max_drawdown_df.iloc[-1]["high_value"]
current_cumulative = max_drawdown_df.iloc[-1]["cumulative"] current_cumulative = max_drawdown_df.iloc[-1]["cumulative"]
current_drawdown_abs = current_high_value - current_cumulative current_drawdown_abs = current_high_value - current_cumulative

View File

@@ -5,6 +5,7 @@ from datetime import UTC, datetime
from pathlib import Path from pathlib import Path
import ccxt import ccxt
from cachetools import TTLCache
from pandas import DataFrame from pandas import DataFrame
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS
@@ -20,7 +21,6 @@ from freqtrade.exchange.common import retrier
from freqtrade.exchange.exchange_types import FtHas, Tickers from freqtrade.exchange.exchange_types import FtHas, Tickers
from freqtrade.exchange.exchange_utils_timeframe import timeframe_to_msecs from freqtrade.exchange.exchange_utils_timeframe import timeframe_to_msecs
from freqtrade.misc import deep_merge_dicts, json_load from freqtrade.misc import deep_merge_dicts, json_load
from freqtrade.util import FtTTLCache
from freqtrade.util.datetime_helpers import dt_from_ts, dt_ts from freqtrade.util.datetime_helpers import dt_from_ts, dt_ts
@@ -76,7 +76,7 @@ class Binance(Exchange):
def __init__(self, *args, **kwargs) -> None: def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self._spot_delist_schedule_cache: FtTTLCache = FtTTLCache(maxsize=100, ttl=300) self._spot_delist_schedule_cache: TTLCache = TTLCache(maxsize=100, ttl=300)
def get_proxy_coin(self) -> str: def get_proxy_coin(self) -> str:
""" """

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
import logging import logging
from datetime import datetime, timedelta from datetime import timedelta
import ccxt import ccxt
from freqtrade.constants import BuySell from freqtrade.constants import BuySell
from freqtrade.enums import OPTIMIZE_MODES, CandleType, MarginMode, TradingMode from freqtrade.enums import CandleType, MarginMode, TradingMode
from freqtrade.exceptions import ( from freqtrade.exceptions import (
DDosProtection, DDosProtection,
OperationalException, OperationalException,
@@ -14,7 +14,7 @@ from freqtrade.exceptions import (
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.common import API_RETRY_COUNT, retrier from freqtrade.exchange.common import API_RETRY_COUNT, retrier
from freqtrade.exchange.exchange_types import CcxtOrder, FtHas from freqtrade.exchange.exchange_types import CcxtOrder, FtHas
from freqtrade.util import dt_from_ts, dt_now, dt_ts from freqtrade.util.datetime_helpers import dt_now, dt_ts
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -35,8 +35,8 @@ class Bitget(Exchange):
"order_time_in_force": ["GTC", "FOK", "IOC", "PO"], "order_time_in_force": ["GTC", "FOK", "IOC", "PO"],
} }
_ft_has_futures: FtHas = { _ft_has_futures: FtHas = {
"mark_ohlcv_timeframe": "4h",
"funding_fee_candle_limit": 100, "funding_fee_candle_limit": 100,
"has_delisting": True,
} }
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
@@ -236,35 +236,3 @@ class Bitget(Exchange):
raise OperationalException( raise OperationalException(
"Freqtrade currently only supports isolated futures for bitget" "Freqtrade currently only supports isolated futures for bitget"
) )
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"] in OPTIMIZE_MODES:
return None
if self.trading_mode == TradingMode.FUTURES:
return self._check_delisting_futures(pair)
return None
def _check_delisting_futures(self, pair: str) -> datetime | None:
delivery_time = self.markets.get(pair, {}).get("info", {}).get("limitOpenTime", None)
if delivery_time:
if isinstance(delivery_time, str) and (delivery_time != ""):
delivery_time = int(delivery_time)
if not isinstance(delivery_time, int) or delivery_time <= 0:
return None
max_delivery = dt_ts() + (
14 * 24 * 60 * 60 * 1000
) # Assume exchange don't announce delisting more than 14 days in advance
if delivery_time < max_delivery:
return dt_from_ts(delivery_time)
return None

View File

@@ -4,13 +4,12 @@ from datetime import datetime, timedelta
import ccxt import ccxt
from freqtrade.constants import BuySell from freqtrade.constants import BuySell
from freqtrade.enums import OPTIMIZE_MODES, MarginMode, PriceType, TradingMode from freqtrade.enums import MarginMode, PriceType, TradingMode
from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.common import retrier from freqtrade.exchange.common import retrier
from freqtrade.exchange.exchange_types import CcxtOrder, FtHas from freqtrade.exchange.exchange_types import CcxtOrder, FtHas
from freqtrade.misc import deep_merge_dicts from freqtrade.misc import deep_merge_dicts
from freqtrade.util import dt_from_ts, dt_ts
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -38,6 +37,8 @@ class Bybit(Exchange):
} }
_ft_has_futures: FtHas = { _ft_has_futures: FtHas = {
"ohlcv_has_history": True, "ohlcv_has_history": True,
"mark_ohlcv_timeframe": "4h",
"funding_fee_timeframe": "8h",
"funding_fee_candle_limit": 200, "funding_fee_candle_limit": 200,
"stoploss_on_exchange": True, "stoploss_on_exchange": True,
"stoploss_order_types": {"limit": "limit", "market": "market"}, "stoploss_order_types": {"limit": "limit", "market": "market"},
@@ -53,7 +54,6 @@ class Bybit(Exchange):
"exchange_has_overrides": { "exchange_has_overrides": {
"fetchOrder": True, "fetchOrder": True,
}, },
"has_delisting": True,
} }
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
@@ -294,35 +294,3 @@ class Bybit(Exchange):
self.cache_leverage_tiers(tiers, self._config["stake_currency"]) self.cache_leverage_tiers(tiers, self._config["stake_currency"])
return tiers return tiers
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"] in OPTIMIZE_MODES:
return None
if self.trading_mode == TradingMode.FUTURES:
return self._check_delisting_futures(pair)
return None
def _check_delisting_futures(self, pair: str) -> datetime | None:
delivery_time = self.markets.get(pair, {}).get("info", {}).get("deliveryTime", 0)
if delivery_time:
if isinstance(delivery_time, str) and (delivery_time != ""):
delivery_time = int(delivery_time)
if not isinstance(delivery_time, int) or delivery_time <= 0:
return None
max_delivery = dt_ts() + (
14 * 24 * 60 * 60 * 1000
) # Assume exchange don't announce delisting more than 14 days in advance
if delivery_time < max_delivery:
return dt_from_ts(delivery_time)
return None

View File

@@ -97,9 +97,6 @@ EXCHANGE_HAS_OPTIONAL = [
# 'fetchLeverageTiers', # Futures initialization # 'fetchLeverageTiers', # Futures initialization
# 'fetchMarketLeverageTiers', # Futures initialization # 'fetchMarketLeverageTiers', # Futures initialization
# 'fetchOpenOrders', 'fetchClosedOrders', # 'fetchOrders', # Refinding balance... # 'fetchOpenOrders', 'fetchClosedOrders', # 'fetchOrders', # Refinding balance...
# "fetchPremiumIndexOHLCV", # Futures additional data
# "fetchMarkOHLCV", # Futures additional data
# "fetchIndexOHLCV", # Futures additional data
# ccxt.pro # ccxt.pro
"watchOHLCV", "watchOHLCV",
] ]

View File

@@ -16,6 +16,7 @@ from typing import Any, Literal, TypeGuard, TypeVar
import ccxt import ccxt
import ccxt.pro as ccxt_pro import ccxt.pro as ccxt_pro
from cachetools import TTLCache
from ccxt import TICK_SIZE from ccxt import TICK_SIZE
from dateutil import parser from dateutil import parser
from pandas import DataFrame, concat from pandas import DataFrame, concat
@@ -104,11 +105,11 @@ from freqtrade.misc import (
deep_merge_dicts, deep_merge_dicts,
file_dump_json, file_dump_json,
file_load_json, file_load_json,
safe_value_fallback,
safe_value_fallback2, safe_value_fallback2,
) )
from freqtrade.util import FtTTLCache, PeriodicCache, dt_from_ts, dt_now from freqtrade.util import dt_from_ts, dt_now
from freqtrade.util.datetime_helpers import dt_humanize_delta, dt_ts, format_ms_time from freqtrade.util.datetime_helpers import dt_humanize_delta, dt_ts, format_ms_time
from freqtrade.util.periodic_cache import PeriodicCache
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -153,8 +154,8 @@ class Exchange:
"l2_limit_range_required": True, # Allow Empty L2 limit (kucoin) "l2_limit_range_required": True, # Allow Empty L2 limit (kucoin)
"l2_limit_upper": None, # Upper limit for L2 limit "l2_limit_upper": None, # Upper limit for L2 limit
"mark_ohlcv_price": "mark", "mark_ohlcv_price": "mark",
"mark_ohlcv_timeframe": "1h", "mark_ohlcv_timeframe": "8h",
"funding_fee_timeframe": "1h", "funding_fee_timeframe": "8h",
"ccxt_futures_name": "swap", "ccxt_futures_name": "swap",
"needs_trading_fees": False, # use fetch_trading_fees to cache fees "needs_trading_fees": False, # use fetch_trading_fees to cache fees
"order_props_in_contracts": ["amount", "filled", "remaining"], "order_props_in_contracts": ["amount", "filled", "remaining"],
@@ -229,13 +230,13 @@ class Exchange:
self._cache_lock = Lock() self._cache_lock = Lock()
# Cache for 10 minutes ... # Cache for 10 minutes ...
self._fetch_tickers_cache: FtTTLCache = FtTTLCache(maxsize=4, ttl=60 * 10) self._fetch_tickers_cache: TTLCache = TTLCache(maxsize=4, ttl=60 * 10)
# Cache values for 300 to avoid frequent polling of the exchange for prices # Cache values for 300 to avoid frequent polling of the exchange for prices
# Caching only applies to RPC methods, so prices for open trades are still # Caching only applies to RPC methods, so prices for open trades are still
# refreshed once every iteration. # refreshed once every iteration.
# Shouldn't be too high either, as it'll freeze UI updates in case of open orders. # Shouldn't be too high either, as it'll freeze UI updates in case of open orders.
self._exit_rate_cache: FtTTLCache = FtTTLCache(maxsize=100, ttl=300) self._exit_rate_cache: TTLCache = TTLCache(maxsize=100, ttl=300)
self._entry_rate_cache: FtTTLCache = FtTTLCache(maxsize=100, ttl=300) self._entry_rate_cache: TTLCache = TTLCache(maxsize=100, ttl=300)
# Holds candles # Holds candles
self._klines: dict[PairWithTimeframe, DataFrame] = {} self._klines: dict[PairWithTimeframe, DataFrame] = {}
@@ -429,15 +430,7 @@ class Exchange:
@property @property
def timeframes(self) -> list[str]: def timeframes(self) -> list[str]:
market_type = ( return list((self._api.timeframes or {}).keys())
"spot"
if self.trading_mode != TradingMode.FUTURES
else self._ft_has["ccxt_futures_name"]
)
timeframes = self._api.options.get("timeframes", {}).get(market_type)
if timeframes is None:
timeframes = self._api.timeframes
return list((timeframes or {}).keys())
@property @property
def markets(self) -> dict[str, Any]: def markets(self) -> dict[str, Any]:
@@ -898,7 +891,6 @@ class Exchange:
self, self,
trading_mode: TradingMode, trading_mode: TradingMode,
margin_mode: MarginMode | None, # Only None when trading_mode = TradingMode.SPOT margin_mode: MarginMode | None, # Only None when trading_mode = TradingMode.SPOT
allow_none_margin_mode: bool = False,
): ):
""" """
Checks if freqtrade can perform trades using the configured Checks if freqtrade can perform trades using the configured
@@ -906,18 +898,7 @@ class Exchange:
Throws OperationalException: Throws OperationalException:
If the trading_mode/margin_mode type are not supported by freqtrade on this exchange If the trading_mode/margin_mode type are not supported by freqtrade on this exchange
""" """
if trading_mode == TradingMode.SPOT: if trading_mode != TradingMode.SPOT and (
return
if allow_none_margin_mode and margin_mode is None:
# Verify trading mode independent of margin mode
if not any(
trading_mode == pair[0] for pair in self._supported_trading_mode_margin_pairs
):
raise ConfigurationError(
f"Freqtrade does not support '{trading_mode}' on {self.name}."
)
if not allow_none_margin_mode and (
(trading_mode, margin_mode) not in self._supported_trading_mode_margin_pairs (trading_mode, margin_mode) not in self._supported_trading_mode_margin_pairs
): ):
mm_value = margin_mode and margin_mode.value mm_value = margin_mode and margin_mode.value
@@ -1120,7 +1101,6 @@ class Exchange:
leverage: float, leverage: float,
params: dict | None = None, params: dict | None = None,
stop_loss: bool = False, stop_loss: bool = False,
stop_price: float | None = None,
) -> CcxtOrder: ) -> CcxtOrder:
now = dt_now() now = dt_now()
order_id = f"dry_run_{side}_{pair}_{now.timestamp()}" order_id = f"dry_run_{side}_{pair}_{now.timestamp()}"
@@ -1147,7 +1127,7 @@ class Exchange:
} }
if stop_loss: if stop_loss:
dry_order["info"] = {"stopPrice": dry_order["price"]} dry_order["info"] = {"stopPrice": dry_order["price"]}
dry_order[self._ft_has["stop_price_prop"]] = stop_price or dry_order["price"] dry_order[self._ft_has["stop_price_prop"]] = dry_order["price"]
# Workaround to avoid filling stoploss orders immediately # Workaround to avoid filling stoploss orders immediately
dry_order["ft_order_type"] = "stoploss" dry_order["ft_order_type"] = "stoploss"
orderbook: OrderBook | None = None orderbook: OrderBook | None = None
@@ -1165,11 +1145,7 @@ class Exchange:
if dry_order["type"] == "market" and not dry_order.get("ft_order_type"): if dry_order["type"] == "market" and not dry_order.get("ft_order_type"):
# Update market order pricing # Update market order pricing
slippage = 0.05 average = self.get_dry_market_fill_price(pair, side, amount, rate, orderbook)
worst_rate = rate * ((1 + slippage) if side == "buy" else (1 - slippage))
average = self.get_dry_market_fill_price(
pair, side, amount, rate, worst_rate, orderbook
)
dry_order.update( dry_order.update(
{ {
"average": average, "average": average,
@@ -1209,13 +1185,7 @@ class Exchange:
return dry_order return dry_order
def get_dry_market_fill_price( def get_dry_market_fill_price(
self, self, pair: str, side: str, amount: float, rate: float, orderbook: OrderBook | None
pair: str,
side: str,
amount: float,
rate: float,
worst_rate: float,
orderbook: OrderBook | None,
) -> float: ) -> float:
""" """
Get the market order fill price based on orderbook interpolation Get the market order fill price based on orderbook interpolation
@@ -1224,6 +1194,8 @@ class Exchange:
if not orderbook: if not orderbook:
orderbook = self.fetch_l2_order_book(pair, 20) orderbook = self.fetch_l2_order_book(pair, 20)
ob_type: OBLiteral = "asks" if side == "buy" else "bids" ob_type: OBLiteral = "asks" if side == "buy" else "bids"
slippage = 0.05
max_slippage_val = rate * ((1 + slippage) if side == "buy" else (1 - slippage))
remaining_amount = amount remaining_amount = amount
filled_value = 0.0 filled_value = 0.0
@@ -1247,10 +1219,11 @@ class Exchange:
forecast_avg_filled_price = max(filled_value, 0) / amount forecast_avg_filled_price = max(filled_value, 0) / amount
# Limit max. slippage to specified value # Limit max. slippage to specified value
if side == "buy": if side == "buy":
forecast_avg_filled_price = min(forecast_avg_filled_price, worst_rate) forecast_avg_filled_price = min(forecast_avg_filled_price, max_slippage_val)
else: else:
forecast_avg_filled_price = max(forecast_avg_filled_price, worst_rate) forecast_avg_filled_price = max(forecast_avg_filled_price, max_slippage_val)
return self.price_to_precision(pair, forecast_avg_filled_price) return self.price_to_precision(pair, forecast_avg_filled_price)
return rate return rate
@@ -1262,15 +1235,13 @@ class Exchange:
limit: float, limit: float,
orderbook: OrderBook | None = None, orderbook: OrderBook | None = None,
offset: float = 0.0, offset: float = 0.0,
is_stop: bool = False,
) -> bool: ) -> bool:
if not self.exchange_has("fetchL2OrderBook"): if not self.exchange_has("fetchL2OrderBook"):
# True unless checking a stoploss order return True
return not is_stop
if not orderbook: if not orderbook:
orderbook = self.fetch_l2_order_book(pair, 1) orderbook = self.fetch_l2_order_book(pair, 1)
try: try:
if (side == "buy" and not is_stop) or (side == "sell" and is_stop): if side == "buy":
price = orderbook["asks"][0][0] price = orderbook["asks"][0][0]
if limit * (1 - offset) >= price: if limit * (1 - offset) >= price:
return True return True
@@ -1289,38 +1260,6 @@ class Exchange:
""" """
Check dry-run limit order fill and update fee (if it filled). Check dry-run limit order fill and update fee (if it filled).
""" """
if order["status"] != "closed" and order.get("ft_order_type") == "stoploss":
pair = order["symbol"]
if not orderbook and self.exchange_has("fetchL2OrderBook"):
orderbook = self.fetch_l2_order_book(pair, 20)
price = safe_value_fallback(order, self._ft_has["stop_price_prop"], "price")
crossed = self._dry_is_price_crossed(
pair, order["side"], price, orderbook, is_stop=True
)
if crossed:
average = self.get_dry_market_fill_price(
pair,
order["side"],
order["amount"],
price,
worst_rate=order["price"],
orderbook=orderbook,
)
order.update(
{
"status": "closed",
"filled": order["amount"],
"remaining": 0,
"average": average,
"cost": order["amount"] * average,
}
)
self.add_dry_order_fee(
pair,
order,
"taker" if immediate else "maker",
)
return order
if ( if (
order["status"] != "closed" order["status"] != "closed"
and order["type"] in ["limit"] and order["type"] in ["limit"]
@@ -1344,7 +1283,7 @@ class Exchange:
return order return order
def fetch_dry_run_order(self, order_id: str) -> CcxtOrder: def fetch_dry_run_order(self, order_id) -> CcxtOrder:
""" """
Return dry-run order Return dry-run order
Only call if running in dry-run mode. Only call if running in dry-run mode.
@@ -1356,12 +1295,11 @@ class Exchange:
except KeyError as e: except KeyError as e:
from freqtrade.persistence import Order from freqtrade.persistence import Order
order_obj = Order.order_by_id(order_id) order = Order.order_by_id(order_id)
if order_obj: if order:
order = order_obj.to_ccxt_object(self._ft_has["stop_price_prop"]) ccxt_order = order.to_ccxt_object(self._ft_has["stop_price_prop"])
order = self.check_dry_limit_order_filled(order) self._dry_run_open_orders[order_id] = ccxt_order
self._dry_run_open_orders[order_id] = order return ccxt_order
return order
# Gracefully handle errors with dry-run orders. # Gracefully handle errors with dry-run orders.
raise InvalidOrderException( raise InvalidOrderException(
f"Tried to get an invalid dry-run-order (id: {order_id}). Message: {e}" f"Tried to get an invalid dry-run-order (id: {order_id}). Message: {e}"
@@ -1560,9 +1498,8 @@ class Exchange:
ordertype, ordertype,
side, side,
amount, amount,
limit_rate or stop_price_norm, stop_price_norm,
stop_loss=True, stop_loss=True,
stop_price=stop_price_norm,
leverage=leverage, leverage=leverage,
) )
return dry_order return dry_order
@@ -1813,7 +1750,7 @@ class Exchange:
balances.pop("total", None) balances.pop("total", None)
balances.pop("used", None) balances.pop("used", None)
self._log_exchange_response("fetch_balance", balances) self._log_exchange_response("fetch_balances", balances)
return balances return balances
except ccxt.DDoSProtection as e: except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e raise DDosProtection(e) from e
@@ -2206,9 +2143,7 @@ class Exchange:
name = side.capitalize() name = side.capitalize()
strat_name = "entry_pricing" if side == "entry" else "exit_pricing" strat_name = "entry_pricing" if side == "entry" else "exit_pricing"
cache_rate: FtTTLCache = ( cache_rate: TTLCache = self._entry_rate_cache if side == "entry" else self._exit_rate_cache
self._entry_rate_cache if side == "entry" else self._exit_rate_cache
)
if not refresh: if not refresh:
with self._cache_lock: with self._cache_lock:
rate = cache_rate.get(pair) rate = cache_rate.get(pair)
@@ -2690,25 +2625,24 @@ class Exchange:
input_coroutines: list[Coroutine[Any, Any, OHLCVResponse]] = [] input_coroutines: list[Coroutine[Any, Any, OHLCVResponse]] = []
cached_pairs = [] cached_pairs = []
for pair, timeframe, candle_type in set(pair_list): for pair, timeframe, candle_type in set(pair_list):
if candle_type == CandleType.FUNDING_RATE and timeframe != ( invalid_funding = (
ff_tf := self.get_option("funding_fee_timeframe") candle_type == CandleType.FUNDING_RATE
): and timeframe != self.get_option("funding_fee_timeframe")
# TODO: does this message make sense? would docs be better? )
# if any, this should be cached to avoid log spam!
logger.warning(
f"Wrong funding rate timeframe {timeframe} for pair {pair}, "
f"downloading {ff_tf} instead."
)
timeframe = ff_tf
invalid_timeframe = timeframe not in self.timeframes and candle_type in ( invalid_timeframe = timeframe not in self.timeframes and candle_type in (
CandleType.SPOT, CandleType.SPOT,
CandleType.FUTURES, CandleType.FUTURES,
) )
if invalid_timeframe: 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( logger.warning(
f"Cannot download ({pair}, {timeframe}, {candle_type}) combination as this " f"Cannot download ({pair}, {timeframe}, {candle_type}) combination as this "
f"timeframe is not available on {self.name}. Available timeframes are " f"timeframe is not available on {self.name}. Available timeframes are "
f"{', '.join(self.timeframes)}." f"{timeframes_}."
) )
continue continue
@@ -2745,11 +2679,7 @@ class Exchange:
has_cache = cache and (pair, timeframe, c_type) in self._klines has_cache = cache and (pair, timeframe, c_type) in self._klines
# in case of existing cache, fill_missing happens after concatenation # in case of existing cache, fill_missing happens after concatenation
ohlcv_df = ohlcv_to_dataframe( ohlcv_df = ohlcv_to_dataframe(
ticks, ticks, timeframe, pair=pair, fill_missing=not has_cache, drop_incomplete=drop_incomplete
timeframe,
pair=pair,
fill_missing=not has_cache and c_type != CandleType.FUNDING_RATE,
drop_incomplete=drop_incomplete,
) )
# keeping parsed dataframe in cache # keeping parsed dataframe in cache
if cache: if cache:
@@ -2760,7 +2690,7 @@ class Exchange:
concat([old, ohlcv_df], axis=0), concat([old, ohlcv_df], axis=0),
timeframe, timeframe,
pair, pair,
fill_missing=c_type != CandleType.FUNDING_RATE, fill_missing=True,
drop_incomplete=False, drop_incomplete=False,
) )
candle_limit = self.ohlcv_candle_limit(timeframe, self._config["candle_type_def"]) candle_limit = self.ohlcv_candle_limit(timeframe, self._config["candle_type_def"])
@@ -2895,10 +2825,9 @@ class Exchange:
timeframe, candle_type=candle_type, since_ms=since_ms timeframe, candle_type=candle_type, since_ms=since_ms
) )
if candle_type and candle_type not in (CandleType.SPOT, CandleType.FUTURES):
params.update({"price": candle_type.value})
if candle_type != CandleType.FUNDING_RATE: if candle_type != CandleType.FUNDING_RATE:
if candle_type and candle_type not in (CandleType.SPOT, CandleType.FUTURES):
self.verify_candle_type_support(candle_type)
params.update({"price": str(candle_type)})
data = await self._api_async.fetch_ohlcv( data = await self._api_async.fetch_ohlcv(
pair, timeframe=timeframe, since=since_ms, limit=candle_limit, params=params pair, timeframe=timeframe, since=since_ms, limit=candle_limit, params=params
) )
@@ -2963,38 +2892,6 @@ class Exchange:
data = [[x["timestamp"], x["fundingRate"], 0, 0, 0, 0] for x in data] data = [[x["timestamp"], x["fundingRate"], 0, 0, 0, 0] for x in data]
return data return data
def check_candle_type_support(self, candle_type: CandleType) -> bool:
"""
Check that the exchange supports the given candle type.
:param candle_type: CandleType to verify
:return: True if supported, False otherwise
"""
if candle_type == CandleType.FUNDING_RATE:
if not self.exchange_has("fetchFundingRateHistory"):
return False
elif candle_type not in (CandleType.SPOT, CandleType.FUTURES):
mapping = {
CandleType.MARK: "fetchMarkOHLCV",
CandleType.INDEX: "fetchIndexOHLCV",
CandleType.PREMIUMINDEX: "fetchPremiumIndexOHLCV",
CandleType.FUNDING_RATE: "fetchFundingRateHistory",
}
_method = mapping.get(candle_type, "fetchOHLCV")
if not self.exchange_has(_method):
return False
return True
def verify_candle_type_support(self, candle_type: CandleType) -> None:
"""
Verify that the exchange supports the given candle type.
:param candle_type: CandleType to verify
:raises OperationalException: if the candle type is not supported
"""
if not self.check_candle_type_support(candle_type):
raise OperationalException(
f"Exchange {self._api.name} does not support fetching {candle_type} candles."
)
# fetch Trade data stuff # fetch Trade data stuff
def needed_candle_for_trades_ms(self, timeframe: str, candle_type: CandleType) -> int: def needed_candle_for_trades_ms(self, timeframe: str, candle_type: CandleType) -> int:
@@ -3822,11 +3719,10 @@ class Exchange:
:param mark_rates: Dataframe containing Mark rates (Type mark_ohlcv_price) :param mark_rates: Dataframe containing Mark rates (Type mark_ohlcv_price)
:param futures_funding_rate: Fake funding rate to use if funding_rates are not available :param futures_funding_rate: Fake funding rate to use if funding_rates are not available
""" """
relevant_cols = ["date", "open_mark", "open_fund"]
if futures_funding_rate is None: if futures_funding_rate is None:
return mark_rates.merge( return mark_rates.merge(
funding_rates, on="date", how="inner", suffixes=["_mark", "_fund"] funding_rates, on="date", how="inner", suffixes=["_mark", "_fund"]
)[relevant_cols] )
else: else:
if len(funding_rates) == 0: if len(funding_rates) == 0:
# No funding rate candles - full fillup with fallback variable # No funding rate candles - full fillup with fallback variable
@@ -3839,23 +3735,15 @@ class Exchange:
"low": "low_mark", "low": "low_mark",
"volume": "volume_mark", "volume": "volume_mark",
} }
)[relevant_cols] )
else: else:
# Fill up missing funding_rate candles with fallback value # Fill up missing funding_rate candles with fallback value
combined = mark_rates.merge( combined = mark_rates.merge(
funding_rates, on="date", how="left", suffixes=["_mark", "_fund"] funding_rates, on="date", how="left", suffixes=["_mark", "_fund"]
) )
# Fill only leading missing funding rates so gaps stay untouched combined["open_fund"] = combined["open_fund"].fillna(futures_funding_rate)
first_valid_idx = combined["open_fund"].first_valid_index() return combined
if first_valid_idx is None:
combined["open_fund"] = futures_funding_rate
else:
is_leading_na = (combined.index <= first_valid_idx) & combined[
"open_fund"
].isna()
combined.loc[is_leading_na, "open_fund"] = futures_funding_rate
return combined[relevant_cols].dropna()
def calculate_funding_fees( def calculate_funding_fees(
self, self,

View File

@@ -3,7 +3,6 @@
import logging import logging
from copy import deepcopy from copy import deepcopy
from datetime import datetime from datetime import datetime
from typing import Any
from freqtrade.constants import BuySell from freqtrade.constants import BuySell
from freqtrade.enums import MarginMode, TradingMode from freqtrade.enums import MarginMode, TradingMode
@@ -37,9 +36,9 @@ class Hyperliquid(Exchange):
"stoploss_order_types": {"limit": "limit"}, "stoploss_order_types": {"limit": "limit"},
"stoploss_blocks_assets": False, "stoploss_blocks_assets": False,
"stop_price_prop": "stopPrice", "stop_price_prop": "stopPrice",
"funding_fee_timeframe": "1h",
"funding_fee_candle_limit": 500, "funding_fee_candle_limit": 500,
"uses_leverage_tiers": False, "uses_leverage_tiers": False,
"mark_ohlcv_price": "futures",
} }
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
@@ -57,13 +56,6 @@ class Hyperliquid(Exchange):
config.update(super()._ccxt_config) config.update(super()._ccxt_config)
return config return config
def market_is_tradable(self, market: dict[str, Any]) -> bool:
parent_check = super().market_is_tradable(market)
# Exclude hip3 markets for now - which have the format XYZ:GOOGL/USDT:USDT -
# and XYZ:GOOGL as base
return parent_check and ":" not in market["base"]
def get_max_leverage(self, pair: str, stake_amount: float | None) -> float: def get_max_leverage(self, pair: str, stake_amount: float | None) -> float:
# There are no leverage tiers # There are no leverage tiers
if self.trading_mode == TradingMode.FUTURES: if self.trading_mode == TradingMode.FUTURES:

View File

@@ -35,6 +35,7 @@ class Kraken(Exchange):
"trades_pagination_arg": "since", "trades_pagination_arg": "since",
"trades_pagination_overlap": False, "trades_pagination_overlap": False,
"trades_has_history": True, "trades_has_history": True,
"mark_ohlcv_timeframe": "4h",
} }
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
@@ -81,7 +82,7 @@ class Kraken(Exchange):
balances.pop("free", None) balances.pop("free", None)
balances.pop("total", None) balances.pop("total", None)
balances.pop("used", None) balances.pop("used", None)
self._log_exchange_response("fetch_balance", balances) self._log_exchange_response("fetch_balances", balances)
# Consolidate balances # Consolidate balances
balances = self.consolidate_balances(balances) balances = self.consolidate_balances(balances)
@@ -103,7 +104,7 @@ class Kraken(Exchange):
balances[bal]["used"] = sum(order[1] for order in order_list if order[0] == bal) balances[bal]["used"] = sum(order[1] for order in order_list if order[0] == bal)
balances[bal]["free"] = balances[bal]["total"] - balances[bal]["used"] balances[bal]["free"] = balances[bal]["total"] - balances[bal]["used"]
self._log_exchange_response("fetch_balance2", balances) self._log_exchange_response("fetch_balances2", balances)
return balances return balances
except ccxt.DDoSProtection as e: except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e raise DDosProtection(e) from e

View File

@@ -29,6 +29,8 @@ class Okx(Exchange):
_ft_has: FtHas = { _ft_has: FtHas = {
"ohlcv_candle_limit": 100, # Warning, special case with data prior to X months "ohlcv_candle_limit": 100, # Warning, special case with data prior to X months
"mark_ohlcv_timeframe": "4h",
"funding_fee_timeframe": "8h",
"stoploss_order_types": {"limit": "limit"}, "stoploss_order_types": {"limit": "limit"},
"stoploss_on_exchange": True, "stoploss_on_exchange": True,
"trades_has_history": False, # Endpoint doesn't have a "since" parameter "trades_has_history": False, # Endpoint doesn't have a "since" parameter
@@ -39,8 +41,8 @@ class Okx(Exchange):
"stop_price_type_field": "slTriggerPxType", "stop_price_type_field": "slTriggerPxType",
"stop_price_type_value_mapping": { "stop_price_type_value_mapping": {
PriceType.LAST: "last", PriceType.LAST: "last",
PriceType.MARK: "mark", PriceType.MARK: "index",
PriceType.INDEX: "index", PriceType.INDEX: "mark",
}, },
"stoploss_blocks_assets": False, "stoploss_blocks_assets": False,
"ws_enabled": True, "ws_enabled": True,

View File

@@ -1,5 +1,5 @@
""" """
Freqtrade is the main module of this bot. It contains the FreqtradeBot class. Freqtrade is the main module of this bot. It contains the class Freqtrade()
""" """
import logging import logging
@@ -63,7 +63,7 @@ from freqtrade.rpc.rpc_types import (
from freqtrade.strategy.interface import IStrategy from freqtrade.strategy.interface import IStrategy
from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper
from freqtrade.util import FtPrecise, MeasureTime, PeriodicCache, dt_from_ts, dt_now from freqtrade.util import FtPrecise, MeasureTime, PeriodicCache, dt_from_ts, dt_now
from freqtrade.util.migrations import migrate_live_content from freqtrade.util.migrations.binance_mig import migrate_binance_futures_names
from freqtrade.wallets import Wallets from freqtrade.wallets import Wallets
@@ -229,7 +229,7 @@ class FreqtradeBot(LoggingMixin):
Called on startup and after reloading the bot - triggers notifications and Called on startup and after reloading the bot - triggers notifications and
performs startup tasks performs startup tasks
""" """
migrate_live_content(self.config, self.exchange) migrate_binance_futures_names(self.config)
set_startup_time() set_startup_time()
self.rpc.startup_messages(self.config, self.pairlists, self.protections) self.rpc.startup_messages(self.config, self.pairlists, self.protections)
@@ -1063,16 +1063,7 @@ class FreqtradeBot(LoggingMixin):
return True return True
def cancel_stoploss_on_exchange(self, trade: Trade, allow_nonblocking: bool = False) -> Trade: def cancel_stoploss_on_exchange(self, trade: Trade) -> Trade:
"""
Cancels on exchange stoploss orders for the given trade.
:param trade: Trade for which to cancel stoploss order
:param allow_nonblocking: If True, will skip cancelling stoploss on exchange
if the exchange supports blocking stoploss orders.
"""
if allow_nonblocking and not self.exchange.get_option("stoploss_blocks_assets", True):
logger.info(f"Skipping cancelling stoploss on exchange for {trade}.")
return trade
# First cancelling stoploss on exchange ... # First cancelling stoploss on exchange ...
for oslo in trade.open_sl_orders: for oslo in trade.open_sl_orders:
try: try:
@@ -2097,7 +2088,7 @@ class FreqtradeBot(LoggingMixin):
limit = self.get_valid_price(custom_exit_price, proposed_limit_rate) limit = self.get_valid_price(custom_exit_price, proposed_limit_rate)
# First cancelling stoploss on exchange ... # First cancelling stoploss on exchange ...
trade = self.cancel_stoploss_on_exchange(trade, allow_nonblocking=True) trade = self.cancel_stoploss_on_exchange(trade)
order_type = ordertype or self.strategy.order_types[exit_type] order_type = ordertype or self.strategy.order_types[exit_type]
if exit_check.exit_type == ExitType.EMERGENCY_EXIT: if exit_check.exit_type == ExitType.EMERGENCY_EXIT:
@@ -2387,8 +2378,6 @@ class FreqtradeBot(LoggingMixin):
self.strategy.ft_stoploss_adjust( self.strategy.ft_stoploss_adjust(
current_rate, trade, datetime.now(UTC), profit, 0, after_fill=True current_rate, trade, datetime.now(UTC), profit, 0, after_fill=True
) )
if not trade.is_open:
self.cancel_stoploss_on_exchange(trade)
# Updating wallets when order is closed # Updating wallets when order is closed
self.wallets.update() self.wallets.update()
return trade return trade

View File

@@ -1,8 +1,6 @@
from collections.abc import Callable from collections.abc import Callable
from cachetools import cached from cachetools import TTLCache, cached
from freqtrade.util import FtTTLCache
class LoggingMixin: class LoggingMixin:
@@ -20,7 +18,7 @@ class LoggingMixin:
""" """
self.logger = logger self.logger = logger
self.refresh_period = refresh_period self.refresh_period = refresh_period
self._log_cache: FtTTLCache = FtTTLCache(maxsize=1024, ttl=self.refresh_period) self._log_cache: TTLCache = TTLCache(maxsize=1024, ttl=self.refresh_period)
def log_once(self, message: str, logmethod: Callable, force_show: bool = False) -> None: def log_once(self, message: str, logmethod: Callable, force_show: bool = False) -> None:
""" """

View File

@@ -39,7 +39,6 @@ class RecursiveAnalysis(BaseAnalysis):
self.dict_recursive: dict[str, Any] = dict() self.dict_recursive: dict[str, Any] = dict()
self.pair_to_used: str | None = None self.pair_to_used: str | None = None
self._strat_scc: int | None = None
# For recursive bias check # For recursive bias check
# analyzes two data frames with processed indicators and shows differences between them. # analyzes two data frames with processed indicators and shows differences between them.
@@ -152,8 +151,7 @@ class RecursiveAnalysis(BaseAnalysis):
backtesting._set_strategy(backtesting.strategylist[0]) backtesting._set_strategy(backtesting.strategylist[0])
strat = backtesting.strategy strat = backtesting.strategy
if self._strat_scc is None: self._strat_scc = strat.startup_candle_count
self._strat_scc = strat.startup_candle_count
if self._strat_scc < 1: if self._strat_scc < 1:
raise ConfigurationError( raise ConfigurationError(

View File

@@ -126,7 +126,6 @@ class Backtesting:
self.config["dry_run"] = True self.config["dry_run"] = True
self.price_pair_prec: dict[str, Series] = {} self.price_pair_prec: dict[str, Series] = {}
self.available_pairs: list[str] = []
self.run_ids: dict[str, str] = {} self.run_ids: dict[str, str] = {}
self.strategylist: list[IStrategy] = [] self.strategylist: list[IStrategy] = []
self.all_bt_content: dict[str, BacktestContentType] = {} self.all_bt_content: dict[str, BacktestContentType] = {}
@@ -177,8 +176,7 @@ class Backtesting:
self._validate_pairlists_for_backtesting() self._validate_pairlists_for_backtesting()
self.dataprovider.add_pairlisthandler(self.pairlists) self.dataprovider.add_pairlisthandler(self.pairlists)
self.dynamic_pairlist: bool = self.config.get("enable_dynamic_pairlist", False) self.pairlists.refresh_pairlist()
self.pairlists.refresh_pairlist(only_first=self.dynamic_pairlist)
if len(self.pairlists.whitelist) == 0: if len(self.pairlists.whitelist) == 0:
raise OperationalException("No pair in whitelist.") raise OperationalException("No pair in whitelist.")
@@ -213,6 +211,7 @@ class Backtesting:
self._can_short = self.trading_mode != TradingMode.SPOT self._can_short = self.trading_mode != TradingMode.SPOT
self._position_stacking: bool = self.config.get("position_stacking", False) self._position_stacking: bool = self.config.get("position_stacking", False)
self.enable_protections: bool = self.config.get("enable_protections", 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) migrate_data(config, self.exchange)
self.init_backtest() self.init_backtest()
@@ -336,12 +335,10 @@ class Backtesting:
self.progress.set_new_value(1) self.progress.set_new_value(1)
self._load_bt_data_detail() self._load_bt_data_detail()
self.price_pair_prec = {} self.price_pair_prec = {}
for pair in self.pairlists.whitelist: for pair in self.pairlists.whitelist:
if pair in data: if pair in data:
# Load price precision logic # Load price precision logic
self.price_pair_prec[pair] = get_tick_size_over_time(data[pair]) self.price_pair_prec[pair] = get_tick_size_over_time(data[pair])
self.available_pairs.append(pair)
return data, self.timerange return data, self.timerange
def _load_bt_data_detail(self) -> None: def _load_bt_data_detail(self) -> None:
@@ -374,7 +371,6 @@ class Backtesting:
timerange=self.timerange, timerange=self.timerange,
startup_candles=0, startup_candles=0,
fail_without_data=True, fail_without_data=True,
fill_up_missing=False,
data_format=self.config["dataformat_ohlcv"], data_format=self.config["dataformat_ohlcv"],
candle_type=CandleType.FUNDING_RATE, candle_type=CandleType.FUNDING_RATE,
) )
@@ -1591,7 +1587,7 @@ class Backtesting:
self.check_abort() self.check_abort()
if self.dynamic_pairlist and self.pairlists: if self.dynamic_pairlist and self.pairlists:
self.pairlists.refresh_pairlist(pairs=self.available_pairs) self.pairlists.refresh_pairlist()
pairs = self.pairlists.whitelist pairs = self.pairlists.whitelist
# Reset open trade count for this candle # Reset open trade count for this candle

View File

@@ -7,7 +7,6 @@ This module implements a convenience auto-hyperopt class, which can be used toge
import logging import logging
from collections.abc import Callable from collections.abc import Callable
from contextlib import suppress from contextlib import suppress
from typing import Literal
from freqtrade.exceptions import OperationalException from freqtrade.exceptions import OperationalException
@@ -38,17 +37,10 @@ def _format_exception_message(space: str, ignore_missing_space: bool) -> None:
class HyperOptAuto(IHyperOpt): class HyperOptAuto(IHyperOpt):
""" """
This class delegates functionality to Strategy(IHyperStrategy) and Strategy.HyperOpt classes. This class delegates functionality to Strategy(IHyperStrategy) and Strategy.HyperOpt classes.
Most of the time Strategy.HyperOpt class would only implement indicator_space and Most of the time Strategy.HyperOpt class would only implement indicator_space and
sell_indicator_space methods, but other hyperopt methods can be overridden as well. sell_indicator_space methods, but other hyperopt methods can be overridden as well.
""" """
def get_available_spaces(self) -> list[str]:
"""
Get list of available spaces defined in strategy.
:return: list of available spaces.
"""
return list(self.strategy._ft_hyper_params)
def _get_func(self, name) -> Callable: def _get_func(self, name) -> Callable:
""" """
Return a function defined in Strategy.HyperOpt class, or one defined in super() class. Return a function defined in Strategy.HyperOpt class, or one defined in super() class.
@@ -62,26 +54,31 @@ class HyperOptAuto(IHyperOpt):
else: else:
return default_func return default_func
def get_indicator_space( def _generate_indicator_space(self, category):
self, space: Literal["buy", "sell", "enter", "exit", "protection"] | str for attr_name, attr in self.strategy.enumerate_parameters(category):
) -> list: if attr.optimize:
""" yield attr.get_space(attr_name)
Get indicator space for a given space.
:param space: parameter space to get. def _get_indicator_space(self, category) -> list:
""" # TODO: is this necessary, or can we call "generate_space" directly?
indicator_space = [ indicator_space = list(self._generate_indicator_space(category))
attr.get_space(attr_name)
for attr_name, attr in self.strategy.enumerate_parameters(space)
if attr.optimize
]
if len(indicator_space) > 0: if len(indicator_space) > 0:
return indicator_space return indicator_space
else: else:
_format_exception_message( _format_exception_message(
space, self.config.get("hyperopt_ignore_missing_space", False) category, self.config.get("hyperopt_ignore_missing_space", False)
) )
return [] return []
def buy_indicator_space(self) -> list["Dimension"]:
return self._get_indicator_space("buy")
def sell_indicator_space(self) -> list["Dimension"]:
return self._get_indicator_space("sell")
def protection_space(self) -> list["Dimension"]:
return self._get_indicator_space("protection")
def generate_roi_table(self, params: dict) -> dict[int, float]: def generate_roi_table(self, params: dict) -> dict[int, float]:
return self._get_func("generate_roi_table")(params) return self._get_func("generate_roi_table")(params)

View File

@@ -70,7 +70,13 @@ class HyperOptimizer:
""" """
def __init__(self, config: Config, data_pickle_file: Path) -> None: def __init__(self, config: Config, data_pickle_file: Path) -> None:
self.spaces: dict[str, list[DimensionProtocol]] = {} self.buy_space: list[DimensionProtocol] = []
self.sell_space: list[DimensionProtocol] = []
self.protection_space: list[DimensionProtocol] = []
self.roi_space: list[DimensionProtocol] = []
self.stoploss_space: list[DimensionProtocol] = []
self.trailing_space: list[DimensionProtocol] = []
self.max_open_trades_space: list[DimensionProtocol] = []
self.dimensions: list[DimensionProtocol] = [] self.dimensions: list[DimensionProtocol] = []
self.o_dimensions: dict = {} self.o_dimensions: dict = {}
@@ -161,39 +167,37 @@ class HyperOptimizer:
""" """
result: dict = {} result: dict = {}
for space in self.spaces.keys(): if HyperoptTools.has_space(self.config, "buy"):
if space == "protection": result["buy"] = round_dict({p.name: params.get(p.name) for p in self.buy_space}, 13)
result["protection"] = round_dict( if HyperoptTools.has_space(self.config, "sell"):
{p.name: params.get(p.name) for p in self.spaces[space]}, 13 result["sell"] = round_dict({p.name: params.get(p.name) for p in self.sell_space}, 13)
) if HyperoptTools.has_space(self.config, "protection"):
elif space == "roi": result["protection"] = round_dict(
result["roi"] = round_dict( {p.name: params.get(p.name) for p in self.protection_space}, 13
{str(k): v for k, v in self.custom_hyperopt.generate_roi_table(params).items()}, )
13, if HyperoptTools.has_space(self.config, "roi"):
) result["roi"] = round_dict(
elif space == "stoploss": {str(k): v for k, v in self.custom_hyperopt.generate_roi_table(params).items()}, 13
result["stoploss"] = round_dict( )
{p.name: params.get(p.name) for p in self.spaces[space]}, 13 if HyperoptTools.has_space(self.config, "stoploss"):
) result["stoploss"] = round_dict(
elif space == "trailing": {p.name: params.get(p.name) for p in self.stoploss_space}, 13
result["trailing"] = round_dict( )
self.custom_hyperopt.generate_trailing_params(params), 13 if HyperoptTools.has_space(self.config, "trailing"):
) result["trailing"] = round_dict(
elif space == "trades": self.custom_hyperopt.generate_trailing_params(params), 13
result["max_open_trades"] = round_dict( )
{ if HyperoptTools.has_space(self.config, "trades"):
"max_open_trades": ( result["max_open_trades"] = round_dict(
self.backtesting.strategy.max_open_trades {
if self.backtesting.strategy.max_open_trades != float("inf") "max_open_trades": (
else -1 self.backtesting.strategy.max_open_trades
) if self.backtesting.strategy.max_open_trades != float("inf")
}, else -1
13, )
) },
else: 13,
result[space] = round_dict( )
{p.name: params.get(p.name) for p in self.spaces[space]}, 13
)
return result return result
@@ -222,39 +226,56 @@ class HyperOptimizer:
""" """
Assign the dimensions in the hyperoptimization space. Assign the dimensions in the hyperoptimization space.
""" """
spaces = ["buy", "sell", "protection", "roi", "stoploss", "trailing", "trades"] if HyperoptTools.has_space(self.config, "protection"):
spaces += [s for s in self.custom_hyperopt.get_available_spaces() if s not in spaces] # Protections can only be optimized when using the Parameter interface
logger.debug("Hyperopt has 'protection' space")
# Enable Protections if protection space is selected.
self.config["enable_protections"] = True
self.backtesting.enable_protections = True
self.protection_space = self.custom_hyperopt.protection_space()
for space in spaces: if HyperoptTools.has_space(self.config, "buy"):
if not HyperoptTools.has_space(self.config, space): logger.debug("Hyperopt has 'buy' space")
continue self.buy_space = self.custom_hyperopt.buy_indicator_space()
logger.debug(f"Hyperopt has '{space}' space")
if space == "protection":
# Protections can only be optimized when using the Parameter interface
# Enable Protections if protection space is selected.
self.config["enable_protections"] = True
self.backtesting.enable_protections = True
self.spaces[space] = self.custom_hyperopt.get_indicator_space(space)
elif space == "roi":
self.spaces[space] = self.custom_hyperopt.roi_space()
elif space == "stoploss":
self.spaces[space] = self.custom_hyperopt.stoploss_space()
elif space == "trailing":
self.spaces[space] = self.custom_hyperopt.trailing_space()
elif space == "trades":
self.spaces[space] = self.custom_hyperopt.max_open_trades_space()
else:
self.spaces[space] = self.custom_hyperopt.get_indicator_space(space)
self.dimensions = [s for space in self.spaces.values() for s in space] if HyperoptTools.has_space(self.config, "sell"):
if len(self.dimensions) == 0: logger.debug("Hyperopt has 'sell' space")
raise OperationalException( self.sell_space = self.custom_hyperopt.sell_indicator_space()
"No hyperopt parameters found to optimize."
f"Available spaces: {', '.join(spaces)}. " if HyperoptTools.has_space(self.config, "roi"):
"Check your strategy's parameter definitions or verify the configured spaces " logger.debug("Hyperopt has 'roi' space")
"in your command." self.roi_space = self.custom_hyperopt.roi_space()
)
self.o_dimensions = self.convert_dimensions_to_optuna_space(self.dimensions) if HyperoptTools.has_space(self.config, "stoploss"):
logger.debug("Hyperopt has 'stoploss' space")
self.stoploss_space = self.custom_hyperopt.stoploss_space()
if HyperoptTools.has_space(self.config, "trailing"):
logger.debug("Hyperopt has 'trailing' space")
self.trailing_space = self.custom_hyperopt.trailing_space()
if HyperoptTools.has_space(self.config, "trades"):
logger.debug("Hyperopt has 'trades' space")
self.max_open_trades_space = self.custom_hyperopt.max_open_trades_space()
self.dimensions = (
self.buy_space
+ self.sell_space
+ self.protection_space
+ self.roi_space
+ self.stoploss_space
+ self.trailing_space
+ self.max_open_trades_space
)
def assign_params(self, params_dict: dict[str, Any], category: str) -> None:
"""
Assign hyperoptable parameters
"""
for attr_name, attr in self.backtesting.strategy.enumerate_parameters(category):
if attr.optimize:
# noinspection PyProtectedMember
attr.value = params_dict[attr_name]
@delayed @delayed
@wrap_non_picklable_objects @wrap_non_picklable_objects
@@ -271,9 +292,15 @@ class HyperOptimizer:
HyperoptStateContainer.set_state(HyperoptState.OPTIMIZE) HyperoptStateContainer.set_state(HyperoptState.OPTIMIZE)
backtest_start_time = datetime.now(UTC) backtest_start_time = datetime.now(UTC)
for attr_name, attr in self.backtesting.strategy.enumerate_parameters(): # Apply parameters
if attr.in_space and attr.optimize: if HyperoptTools.has_space(self.config, "buy"):
attr.value = params_dict[attr_name] self.assign_params(params_dict, "buy")
if HyperoptTools.has_space(self.config, "sell"):
self.assign_params(params_dict, "sell")
if HyperoptTools.has_space(self.config, "protection"):
self.assign_params(params_dict, "protection")
if HyperoptTools.has_space(self.config, "roi"): if HyperoptTools.has_space(self.config, "roi"):
self.backtesting.strategy.minimal_roi = self.custom_hyperopt.generate_roi_table( self.backtesting.strategy.minimal_roi = self.custom_hyperopt.generate_roi_table(
@@ -409,6 +436,7 @@ class HyperOptimizer:
o_sampler = self.custom_hyperopt.generate_estimator( o_sampler = self.custom_hyperopt.generate_estimator(
dimensions=self.dimensions, random_state=random_state dimensions=self.dimensions, random_state=random_state
) )
self.o_dimensions = self.convert_dimensions_to_optuna_space(self.dimensions)
if isinstance(o_sampler, str): if isinstance(o_sampler, str):
if o_sampler not in optuna_samplers_dict.keys(): if o_sampler not in optuna_samplers_dict.keys():

View File

@@ -9,7 +9,7 @@ import numpy as np
import rapidjson import rapidjson
from pandas import isna, json_normalize from pandas import isna, json_normalize
from freqtrade.constants import FTHYPT_FILEVERSION, HYPEROPT_BUILTIN_SPACES, Config from freqtrade.constants import FTHYPT_FILEVERSION, Config
from freqtrade.enums import HyperoptState from freqtrade.enums import HyperoptState
from freqtrade.exceptions import OperationalException from freqtrade.exceptions import OperationalException
from freqtrade.misc import deep_merge_dicts, round_dict, safe_value_fallback2 from freqtrade.misc import deep_merge_dicts, round_dict, safe_value_fallback2
@@ -219,22 +219,21 @@ class HyperoptTools:
print(rapidjson.dumps(result_dict, default=str, number_mode=HYPER_PARAMS_FILE_FORMAT)) print(rapidjson.dumps(result_dict, default=str, number_mode=HYPER_PARAMS_FILE_FORMAT))
else: else:
all_spaces = list(params.keys() | non_optimized.keys()) HyperoptTools._params_pretty_print(
# Explicitly listed to keep original sort order params, "buy", "Buy hyperspace params:", non_optimized
spaces = ["buy", "sell", "protection", "roi", "stoploss", "trailing", "max_open_trades"] )
spaces += [s for s in all_spaces if s not in spaces] HyperoptTools._params_pretty_print(
lookup = { params, "sell", "Sell hyperspace params:", non_optimized
"roi": "ROI", )
"trailing": "Trailing stop", HyperoptTools._params_pretty_print(
} params, "protection", "Protection hyperspace params:", non_optimized
for space in spaces: )
name = lookup.get( HyperoptTools._params_pretty_print(params, "roi", "ROI table:", non_optimized)
space, space.capitalize() if space in HYPEROPT_BUILTIN_SPACES else space HyperoptTools._params_pretty_print(params, "stoploss", "Stoploss:", non_optimized)
) HyperoptTools._params_pretty_print(params, "trailing", "Trailing stop:", non_optimized)
HyperoptTools._params_pretty_print(
HyperoptTools._params_pretty_print( params, "max_open_trades", "Max Open Trades:", non_optimized
params, space, f"{name} parameters:", non_optimized )
)
@staticmethod @staticmethod
def _params_update_for_json(result_dict, params, non_optimized, space: str) -> None: def _params_update_for_json(result_dict, params, non_optimized, space: str) -> None:

View File

@@ -48,7 +48,7 @@ from freqtrade.leverage import interest
from freqtrade.misc import safe_value_fallback from freqtrade.misc import safe_value_fallback
from freqtrade.persistence.base import ModelBase, SessionType from freqtrade.persistence.base import ModelBase, SessionType
from freqtrade.persistence.custom_data import CustomDataWrapper, _CustomData from freqtrade.persistence.custom_data import CustomDataWrapper, _CustomData
from freqtrade.util import FtPrecise, dt_from_ts, dt_now, dt_ts, dt_ts_none, round_value from freqtrade.util import FtPrecise, dt_from_ts, dt_now, dt_ts, dt_ts_none
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -654,10 +654,9 @@ class LocalTrade:
) )
return ( return (
f"Trade(id={self.id}, pair={self.pair}, amount={round_value(self.amount, 8)}, " f"Trade(id={self.id}, pair={self.pair}, amount={self.amount:.8f}, "
f"is_short={self.is_short or False}, " f"is_short={self.is_short or False}, leverage={self.leverage or 1.0}, "
f"leverage={round_value(self.leverage or 1.0, 1)}, " f"open_rate={self.open_rate:.8f}, open_since={open_since})"
f"open_rate={round_value(self.open_rate, 8)}, open_since={open_since})"
) )
def to_json(self, minified: bool = False) -> dict[str, Any]: def to_json(self, minified: bool = False) -> dict[str, Any]:
@@ -756,8 +755,6 @@ class LocalTrade:
"precision_mode": self.precision_mode, "precision_mode": self.precision_mode,
"precision_mode_price": self.precision_mode_price, "precision_mode_price": self.precision_mode_price,
"contract_size": self.contract_size, "contract_size": self.contract_size,
"nr_of_successful_entries": self.nr_of_successful_entries,
"nr_of_successful_exits": self.nr_of_successful_exits,
"has_open_orders": self.has_open_orders, "has_open_orders": self.has_open_orders,
"orders": orders_json, "orders": orders_json,
} }

View File

@@ -75,11 +75,11 @@ def init_plotscript(config, markets: list, startup_candles: int = 0):
) )
no_trades = False no_trades = False
filename = config.get("exportfilename") or config.get("exportdirectory") filename = config.get("exportfilename")
if config.get("no_trades", False): if config.get("no_trades", False):
no_trades = True no_trades = True
elif config["trade_source"] == "file": elif config["trade_source"] == "file":
if not filename or (not filename.is_dir() and not filename.is_file()): if not filename.is_dir() and not filename.is_file():
logger.warning("Backtest file is missing skipping trades.") logger.warning("Backtest file is missing skipping trades.")
no_trades = True no_trades = True
try: try:

View File

@@ -7,10 +7,11 @@ Provides dynamic pair list based on Market Cap
import logging import logging
import math import math
from cachetools import TTLCache
from freqtrade.exceptions import OperationalException from freqtrade.exceptions import OperationalException
from freqtrade.exchange.exchange_types import Tickers from freqtrade.exchange.exchange_types import Tickers
from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting
from freqtrade.util import FtTTLCache
from freqtrade.util.coin_gecko import FtCoinGeckoApi from freqtrade.util.coin_gecko import FtCoinGeckoApi
@@ -24,20 +25,18 @@ class MarketCapPairList(IPairList):
def __init__(self, *args, **kwargs) -> None: def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self._mode = self._pairlistconfig.get("mode", "whitelist") if "number_assets" not in self._pairlistconfig:
if (self._mode == "whitelist") and ("number_assets" not in self._pairlistconfig):
raise OperationalException( raise OperationalException(
"`number_assets` not specified. Please check your configuration " "`number_assets` not specified. Please check your configuration "
'for "pairlist.config.number_assets"' 'for "pairlist.config.number_assets"'
) )
self._stake_currency = self._config["stake_currency"] self._stake_currency = self._config["stake_currency"]
self._number_assets = self._pairlistconfig.get("number_assets", 30) self._number_assets = self._pairlistconfig["number_assets"]
self._max_rank = self._pairlistconfig.get("max_rank", 30) self._max_rank = self._pairlistconfig.get("max_rank", 30)
self._refresh_period = self._pairlistconfig.get("refresh_period", 86400) self._refresh_period = self._pairlistconfig.get("refresh_period", 86400)
self._categories = self._pairlistconfig.get("categories", []) self._categories = self._pairlistconfig.get("categories", [])
self._marketcap_cache: FtTTLCache = FtTTLCache(maxsize=1, ttl=self._refresh_period) self._marketcap_cache: TTLCache = TTLCache(maxsize=1, ttl=self._refresh_period)
_coingecko_config = self._config.get("coingecko", {}) _coingecko_config = self._config.get("coingecko", {})
@@ -79,9 +78,7 @@ class MarketCapPairList(IPairList):
""" """
num = self._number_assets num = self._number_assets
rank = self._max_rank rank = self._max_rank
mode = self._mode msg = f"{self.name} - {num} pairs placed within top {rank} market cap."
pair_text = num if (mode == "whitelist") else "blacklisting"
msg = f"{self.name} - {pair_text} pairs placed within top {rank} market cap."
return msg return msg
@staticmethod @staticmethod
@@ -118,13 +115,6 @@ class MarketCapPairList(IPairList):
"description": "Refresh period", "description": "Refresh period",
"help": "Refresh period in seconds", "help": "Refresh period in seconds",
}, },
"mode": {
"type": "option",
"default": "whitelist",
"options": ["whitelist", "blacklist"],
"description": "Mode of operation",
"help": "Mode of operation (whitelist/blacklist)",
},
} }
def get_markets_exchange(self): def get_markets_exchange(self):
@@ -196,9 +186,6 @@ class MarketCapPairList(IPairList):
:return: new whitelist :return: new whitelist
""" """
marketcap_list = self._marketcap_cache.get("marketcap") marketcap_list = self._marketcap_cache.get("marketcap")
mode = self._mode
is_whitelist_mode = mode == "whitelist"
filtered_pairlist: list[str] = []
default_kwargs = { default_kwargs = {
"vs_currency": "usd", "vs_currency": "usd",
@@ -232,10 +219,12 @@ class MarketCapPairList(IPairList):
self._marketcap_cache["marketcap"] = marketcap_list self._marketcap_cache["marketcap"] = marketcap_list
if marketcap_list: if marketcap_list:
filtered_pairlist: list[str] = []
market = self._exchange._config["trading_mode"] market = self._exchange._config["trading_mode"]
pair_format = f"{self._stake_currency.upper()}" + ( pair_format = f"{self._stake_currency.upper()}"
f":{self._stake_currency.upper()}" if market == "futures" else "" if market == "futures":
) pair_format += f":{self._stake_currency.upper()}"
top_marketcap = marketcap_list[: self._max_rank :] top_marketcap = marketcap_list[: self._max_rank :]
markets = self.get_markets_exchange() markets = self.get_markets_exchange()
@@ -245,16 +234,13 @@ class MarketCapPairList(IPairList):
resolved = self.resolve_marketcap_pair(pair, pairlist, markets, filtered_pairlist) resolved = self.resolve_marketcap_pair(pair, pairlist, markets, filtered_pairlist)
if resolved: if resolved:
if not is_whitelist_mode:
pairlist.remove(resolved)
continue
filtered_pairlist.append(resolved) filtered_pairlist.append(resolved)
if len(filtered_pairlist) == self._number_assets:
break
if not is_whitelist_mode: if len(filtered_pairlist) == self._number_assets:
return pairlist break
if len(filtered_pairlist) > 0:
return filtered_pairlist
# If no pairs are found, return the original pairlist # If no pairs are found, return the original pairlist
return filtered_pairlist return []

View File

@@ -10,6 +10,7 @@ import logging
from datetime import timedelta from datetime import timedelta
from typing import TypedDict from typing import TypedDict
from cachetools import TTLCache
from pandas import DataFrame from pandas import DataFrame
from freqtrade.constants import ListPairsWithTimeframes, PairWithTimeframe from freqtrade.constants import ListPairsWithTimeframes, PairWithTimeframe
@@ -17,7 +18,7 @@ from freqtrade.exceptions import OperationalException
from freqtrade.exchange import timeframe_to_minutes, timeframe_to_prev_date from freqtrade.exchange import timeframe_to_minutes, timeframe_to_prev_date
from freqtrade.exchange.exchange_types import Ticker, Tickers from freqtrade.exchange.exchange_types import Ticker, Tickers
from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting
from freqtrade.util import FtTTLCache, dt_now, format_ms_time from freqtrade.util import dt_now, format_ms_time
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -46,7 +47,7 @@ class PercentChangePairList(IPairList):
self._min_value = self._pairlistconfig.get("min_value", None) self._min_value = self._pairlistconfig.get("min_value", None)
self._max_value = self._pairlistconfig.get("max_value", None) self._max_value = self._pairlistconfig.get("max_value", None)
self._refresh_period = self._pairlistconfig.get("refresh_period", 1800) self._refresh_period = self._pairlistconfig.get("refresh_period", 1800)
self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1, ttl=self._refresh_period) self._pair_cache: TTLCache = TTLCache(maxsize=1, ttl=self._refresh_period)
self._lookback_days = self._pairlistconfig.get("lookback_days", 0) self._lookback_days = self._pairlistconfig.get("lookback_days", 0)
self._lookback_timeframe = self._pairlistconfig.get("lookback_timeframe", "1d") self._lookback_timeframe = self._pairlistconfig.get("lookback_timeframe", "1d")
self._lookback_period = self._pairlistconfig.get("lookback_period", 0) self._lookback_period = self._pairlistconfig.get("lookback_period", 0)

View File

@@ -10,6 +10,7 @@ from typing import Any
import rapidjson import rapidjson
import requests import requests
from cachetools import TTLCache
from freqtrade import __version__ from freqtrade import __version__
from freqtrade.configuration.load_config import CONFIG_PARSE_MODE from freqtrade.configuration.load_config import CONFIG_PARSE_MODE
@@ -17,7 +18,6 @@ from freqtrade.exceptions import OperationalException
from freqtrade.exchange.exchange_types import Tickers from freqtrade.exchange.exchange_types import Tickers
from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting
from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist
from freqtrade.util import FtTTLCache
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -48,7 +48,7 @@ class RemotePairList(IPairList):
self._number_pairs = self._pairlistconfig["number_assets"] self._number_pairs = self._pairlistconfig["number_assets"]
self._refresh_period: int = self._pairlistconfig.get("refresh_period", 1800) self._refresh_period: int = self._pairlistconfig.get("refresh_period", 1800)
self._keep_pairlist_on_failure = self._pairlistconfig.get("keep_pairlist_on_failure", True) self._keep_pairlist_on_failure = self._pairlistconfig.get("keep_pairlist_on_failure", True)
self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1, ttl=self._refresh_period) self._pair_cache: TTLCache = TTLCache(maxsize=1, ttl=self._refresh_period)
self._pairlist_url = self._pairlistconfig.get("pairlist_url", "") self._pairlist_url = self._pairlistconfig.get("pairlist_url", "")
self._read_timeout = self._pairlistconfig.get("read_timeout", 60) self._read_timeout = self._pairlistconfig.get("read_timeout", 60)
self._bearer_token = self._pairlistconfig.get("bearer_token", "") self._bearer_token = self._pairlistconfig.get("bearer_token", "")
@@ -159,7 +159,7 @@ class RemotePairList(IPairList):
) )
self._refresh_period = remote_refresh_period self._refresh_period = remote_refresh_period
self._pair_cache = FtTTLCache(maxsize=1, ttl=remote_refresh_period) self._pair_cache = TTLCache(maxsize=1, ttl=remote_refresh_period)
self._init_done = True self._init_done = True

View File

@@ -7,6 +7,7 @@ import sys
from datetime import timedelta from datetime import timedelta
import numpy as np import numpy as np
from cachetools import TTLCache
from pandas import DataFrame from pandas import DataFrame
from freqtrade.constants import ListPairsWithTimeframes from freqtrade.constants import ListPairsWithTimeframes
@@ -14,7 +15,7 @@ from freqtrade.exceptions import OperationalException
from freqtrade.exchange.exchange_types import Tickers from freqtrade.exchange.exchange_types import Tickers
from freqtrade.misc import plural from freqtrade.misc import plural
from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting
from freqtrade.util import FtTTLCache, dt_floor_day, dt_now, dt_ts from freqtrade.util import dt_floor_day, dt_now, dt_ts
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -37,7 +38,7 @@ class VolatilityFilter(IPairList):
self._def_candletype = self._config["candle_type_def"] self._def_candletype = self._config["candle_type_def"]
self._sort_direction: str | None = self._pairlistconfig.get("sort_direction", None) self._sort_direction: str | None = self._pairlistconfig.get("sort_direction", None)
self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1000, ttl=self._refresh_period) self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period)
candle_limit = self._exchange.ohlcv_candle_limit("1d", self._def_candletype) candle_limit = self._exchange.ohlcv_candle_limit("1d", self._def_candletype)
if self._days < 1: if self._days < 1:

View File

@@ -8,12 +8,14 @@ import logging
from datetime import timedelta from datetime import timedelta
from typing import Any, Literal from typing import Any, Literal
from cachetools import TTLCache
from freqtrade.constants import ListPairsWithTimeframes from freqtrade.constants import ListPairsWithTimeframes
from freqtrade.exceptions import OperationalException from freqtrade.exceptions import OperationalException
from freqtrade.exchange import timeframe_to_minutes, timeframe_to_prev_date from freqtrade.exchange import timeframe_to_minutes, timeframe_to_prev_date
from freqtrade.exchange.exchange_types import Tickers from freqtrade.exchange.exchange_types import Tickers
from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting
from freqtrade.util import FtTTLCache, dt_now, format_ms_time from freqtrade.util import dt_now, format_ms_time
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -41,7 +43,7 @@ class VolumePairList(IPairList):
self._min_value = self._pairlistconfig.get("min_value", 0) self._min_value = self._pairlistconfig.get("min_value", 0)
self._max_value = self._pairlistconfig.get("max_value", None) self._max_value = self._pairlistconfig.get("max_value", None)
self._refresh_period = self._pairlistconfig.get("refresh_period", 1800) self._refresh_period = self._pairlistconfig.get("refresh_period", 1800)
self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1, ttl=self._refresh_period) self._pair_cache: TTLCache = TTLCache(maxsize=1, ttl=self._refresh_period)
self._lookback_days = self._pairlistconfig.get("lookback_days", 0) self._lookback_days = self._pairlistconfig.get("lookback_days", 0)
self._lookback_timeframe = self._pairlistconfig.get("lookback_timeframe", "1d") self._lookback_timeframe = self._pairlistconfig.get("lookback_timeframe", "1d")
self._lookback_period = self._pairlistconfig.get("lookback_period", 0) self._lookback_period = self._pairlistconfig.get("lookback_period", 0)

View File

@@ -5,6 +5,7 @@ Rate of change pairlist filter
import logging import logging
from datetime import timedelta from datetime import timedelta
from cachetools import TTLCache
from pandas import DataFrame from pandas import DataFrame
from freqtrade.constants import ListPairsWithTimeframes from freqtrade.constants import ListPairsWithTimeframes
@@ -12,7 +13,7 @@ from freqtrade.exceptions import OperationalException
from freqtrade.exchange.exchange_types import Tickers from freqtrade.exchange.exchange_types import Tickers
from freqtrade.misc import plural from freqtrade.misc import plural
from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting
from freqtrade.util import FtTTLCache, dt_floor_day, dt_now, dt_ts from freqtrade.util import dt_floor_day, dt_now, dt_ts
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -31,7 +32,7 @@ class RangeStabilityFilter(IPairList):
self._def_candletype = self._config["candle_type_def"] self._def_candletype = self._config["candle_type_def"]
self._sort_direction: str | None = self._pairlistconfig.get("sort_direction", None) self._sort_direction: str | None = self._pairlistconfig.get("sort_direction", None)
self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1000, ttl=self._refresh_period) self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period)
candle_limit = self._exchange.ohlcv_candle_limit("1d", self._def_candletype) candle_limit = self._exchange.ohlcv_candle_limit("1d", self._def_candletype)
if self._days < 1: if self._days < 1:

View File

@@ -5,7 +5,7 @@ PairList manager class
import logging import logging
from functools import partial from functools import partial
from cachetools import LRUCache, cached from cachetools import LRUCache, TTLCache, cached
from freqtrade.constants import Config, ListPairsWithTimeframes from freqtrade.constants import Config, ListPairsWithTimeframes
from freqtrade.data.dataprovider import DataProvider from freqtrade.data.dataprovider import DataProvider
@@ -17,7 +17,6 @@ from freqtrade.mixins import LoggingMixin
from freqtrade.plugins.pairlist.IPairList import IPairList, SupportsBacktesting from freqtrade.plugins.pairlist.IPairList import IPairList, SupportsBacktesting
from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist
from freqtrade.resolvers import PairListResolver from freqtrade.resolvers import PairListResolver
from freqtrade.util import FtTTLCache
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -130,24 +129,12 @@ class PairListManager(LoggingMixin):
"""List of short_desc for each Pairlist Handler""" """List of short_desc for each Pairlist Handler"""
return [{p.name: p.short_desc()} for p in self._pairlist_handlers] return [{p.name: p.short_desc()} for p in self._pairlist_handlers]
@cached(FtTTLCache(maxsize=1, ttl=1800)) @cached(TTLCache(maxsize=1, ttl=1800))
def _get_cached_tickers(self) -> Tickers: def _get_cached_tickers(self) -> Tickers:
return self._exchange.get_tickers() return self._exchange.get_tickers()
def refresh_pairlist(self, only_first: bool = False, pairs: list[str] | None = None) -> None: def refresh_pairlist(self) -> None:
""" """Run pairlist through all configured Pairlist Handlers."""
Run pairlist through all configured Pairlist Handlers.
:param only_first: If True, only run the first PairList handler (the generator)
and skip all subsequent filters. Used during backtesting startup to ensure
historic data is loaded for the complete universe of pairs that the
generator can produce (even if later filters would reduce the list size).
Prevents missing data when a filter returns a variable number of pairs
across refresh cycles.
:param pairs: Optional list of pairs to intersect with the generated pairlist.
Only pairs present both in the generated list and this parameter are kept.
Used in backtesting to filter out pairs with no available data.
"""
# Tickers should be cached to avoid calling the exchange on each call. # Tickers should be cached to avoid calling the exchange on each call.
tickers: dict = {} tickers: dict = {}
if self._tickers_needed: if self._tickers_needed:
@@ -156,15 +143,10 @@ class PairListManager(LoggingMixin):
# Generate the pairlist with first Pairlist Handler in the chain # Generate the pairlist with first Pairlist Handler in the chain
pairlist = self._pairlist_handlers[0].gen_pairlist(tickers) pairlist = self._pairlist_handlers[0].gen_pairlist(tickers)
# Optional intersection with an explicit list of pairs (used in backtesting) # Process all Pairlist Handlers in the chain
if pairs is not None: # except for the first one, which is the generator.
pairlist = [p for p in pairlist if p in pairs] for pairlist_handler in self._pairlist_handlers[1:]:
pairlist = pairlist_handler.filter_pairlist(pairlist, tickers)
if not only_first:
# Process all Pairlist Handlers in the chain
# except for the first one, which is the generator.
for pairlist_handler in self._pairlist_handlers[1:]:
pairlist = pairlist_handler.filter_pairlist(pairlist, tickers)
# Validation against blacklist happens after the chain of Pairlist Handlers # Validation against blacklist happens after the chain of Pairlist Handlers
# to ensure blacklist is respected. # to ensure blacklist is respected.

View File

@@ -148,9 +148,6 @@ class IResolver:
logger.debug("Ignoring broken symlink %s", entry) logger.debug("Ignoring broken symlink %s", entry)
continue continue
module_path = entry.resolve() module_path = entry.resolve()
if entry.read_text().find(f"class {object_name}(") == -1:
logger.debug(f"Skipping {module_path} as it does not contain class {object_name}.")
continue
if obj := next(cls._get_valid_object(module_path, object_name), None): if obj := next(cls._get_valid_object(module_path, object_name), None):
obj[0].__file__ = str(entry) obj[0].__file__ = str(entry)

View File

@@ -340,8 +340,6 @@ class TradeSchema(BaseModel):
min_rate: float | None = None min_rate: float | None = None
max_rate: float | None = None max_rate: float | None = None
nr_of_successful_entries: int
nr_of_successful_exits: int
has_open_orders: bool has_open_orders: bool
orders: list[OrderSchema] orders: list[OrderSchema]

View File

@@ -37,7 +37,7 @@ class ApiBG:
# Generic background jobs # Generic background jobs
# TODO: Change this to FtTTLCache # TODO: Change this to TTLCache
jobs: dict[str, JobsContainer] = {} jobs: dict[str, JobsContainer] = {}
# Pairlist evaluate things # Pairlist evaluate things
pairlist_running: bool = False pairlist_running: bool = False

Some files were not shown because too many files have changed in this diff Show More