diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a9a38e7d8..39f1dbe22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: strategy: matrix: os: [ "ubuntu-20.04", "ubuntu-22.04", "ubuntu-24.04" ] - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 @@ -72,7 +72,7 @@ jobs: pytest --random-order --cov=freqtrade --cov=freqtrade_client --cov-config=.coveragerc - name: Coveralls - if: (runner.os == 'Linux' && matrix.python-version == '3.10' && matrix.os == 'ubuntu-22.04') + if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-22.04') env: # Coveralls token. Not used as secret due to github not providing secrets to forked repositories COVERALLS_REPO_TOKEN: 6D1m0xupS3FgutfuGao8keFf9Hc0FpIXu @@ -139,10 +139,7 @@ jobs: strategy: matrix: os: [ "macos-12", "macos-13", "macos-14" ] - python-version: ["3.9", "3.10", "3.11", "3.12"] - exclude: - - os: "macos-14" - python-version: "3.9" + python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 @@ -263,7 +260,7 @@ jobs: strategy: matrix: os: [ windows-latest ] - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 diff --git a/README.md b/README.md index 317a6cfdf..9f4fc51fb 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Please find the complete documentation on the [freqtrade website](https://www.fr ## Features -- [x] **Based on Python 3.9+**: For botting on any operating system - Windows, macOS and Linux. +- [x] **Based on Python 3.10+**: For botting on any operating system - Windows, macOS and Linux. - [x] **Persistence**: Persistence is achieved through sqlite. - [x] **Dry-run**: Run the bot without paying money. - [x] **Backtesting**: Run a simulation of your buy/sell strategy. @@ -218,7 +218,7 @@ To run this bot we recommend you a cloud instance with a minimum of: ### Software requirements -- [Python >= 3.9](http://docs.python-guide.org/en/latest/starting/installation/) +- [Python >= 3.10](http://docs.python-guide.org/en/latest/starting/installation/) - [pip](https://pip.pypa.io/en/stable/installing/) - [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) - [TA-Lib](https://ta-lib.github.io/ta-lib-python/) diff --git a/build_helpers/TA_Lib-0.4.32-cp39-cp39-linux_armv7l.whl b/build_helpers/TA_Lib-0.4.32-cp39-cp39-linux_armv7l.whl deleted file mode 100644 index 03bc79df8..000000000 Binary files a/build_helpers/TA_Lib-0.4.32-cp39-cp39-linux_armv7l.whl and /dev/null differ diff --git a/build_helpers/TA_Lib-0.4.32-cp39-cp39-win_amd64.whl b/build_helpers/TA_Lib-0.4.32-cp39-cp39-win_amd64.whl deleted file mode 100644 index f0c46dafe..000000000 Binary files a/build_helpers/TA_Lib-0.4.32-cp39-cp39-win_amd64.whl and /dev/null differ diff --git a/docs/index.md b/docs/index.md index f2d1482c9..d6dca4880 100644 --- a/docs/index.md +++ b/docs/index.md @@ -85,7 +85,7 @@ To run this bot we recommend you a linux cloud instance with a minimum of: Alternatively -- Python 3.9+ +- Python 3.10+ - pip (pip3) - git - TA-Lib diff --git a/docs/installation.md b/docs/installation.md index f86043fb3..02cbb7f3e 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -24,7 +24,7 @@ The easiest way to install and run Freqtrade is to clone the bot Github reposito The `stable` branch contains the code of the last release (done usually once per month on an approximately one week old snapshot of the `develop` branch to prevent packaging bugs, so potentially it's more stable). !!! Note - Python3.9 or higher and the corresponding `pip` are assumed to be available. The install-script will warn you and stop if that's not the case. `git` is also needed to clone the Freqtrade repository. + Python3.10 or higher and the corresponding `pip` are assumed to be available. The install-script will warn you and stop if that's not the case. `git` is also needed to clone the Freqtrade repository. Also, python headers (`python-dev` / `python-devel`) must be available for the installation to complete successfully. !!! Warning "Up-to-date clock" @@ -42,7 +42,7 @@ These requirements apply to both [Script Installation](#script-installation) and ### Install guide -* [Python >= 3.9](http://docs.python-guide.org/en/latest/starting/installation/) +* [Python >= 3.10](http://docs.python-guide.org/en/latest/starting/installation/) * [pip](https://pip.pypa.io/en/stable/installing/) * [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) * [virtualenv](https://virtualenv.pypa.io/en/stable/installation.html) (Recommended) @@ -54,7 +54,7 @@ We've included/collected install instructions for Ubuntu, MacOS, and Windows. Th OS Specific steps are listed first, the common section below is necessary for all systems. !!! Note - Python3.9 or higher and the corresponding pip are assumed to be available. + Python3.10 or higher and the corresponding pip are assumed to be available. === "Debian/Ubuntu" #### Install necessary dependencies @@ -69,7 +69,7 @@ OS Specific steps are listed first, the common section below is necessary for al === "RaspberryPi/Raspbian" The following assumes the latest [Raspbian Buster lite image](https://www.raspberrypi.org/downloads/raspbian/). - This image comes with python3.9 preinstalled, making it easy to get freqtrade up and running. + This image comes with python3.11 preinstalled, making it easy to get freqtrade up and running. Tested using a Raspberry Pi 3 with the Raspbian Buster lite image, all updates applied. @@ -169,7 +169,7 @@ You can as well update, configure and reset the codebase of your bot with `./scr ** --install ** With this option, the script will install the bot and most dependencies: -You will need to have git and python3.9+ installed beforehand for this to work. +You will need to have git and python3.10+ installed beforehand for this to work. * Mandatory software as: `ta-lib` * Setup your virtualenv under `.venv/` diff --git a/docs/windows_installation.md b/docs/windows_installation.md index 5e28d98fb..c824ee5de 100644 --- a/docs/windows_installation.md +++ b/docs/windows_installation.md @@ -5,7 +5,7 @@ We **strongly** recommend that Windows users use [Docker](docker_quickstart.md) If that is not possible, try using the Windows Linux subsystem (WSL) - for which the Ubuntu instructions should work. Otherwise, please follow the instructions below. -All instructions assume that python 3.9+ is installed and available. +All instructions assume that python 3.10+ is installed and available. ## Clone the git repository @@ -42,7 +42,7 @@ cd freqtrade Install ta-lib according to the [ta-lib documentation](https://github.com/TA-Lib/ta-lib-python#windows). -As compiling from source on windows has heavy dependencies (requires a partial visual studio installation), Freqtrade provides these dependencies (in the binary wheel format) for the latest 3 Python versions (3.9, 3.10, 3.11 and 3.12) and for 64bit Windows. +As compiling from source on windows has heavy dependencies (requires a partial visual studio installation), Freqtrade provides these dependencies (in the binary wheel format) for the latest 3 Python versions (3.10, 3.11 and 3.12) and for 64bit Windows. These Wheels are also used by CI running on windows, and are therefore tested together with freqtrade. Other versions must be downloaded from the above link. diff --git a/freqtrade/__main__.py b/freqtrade/__main__.py index f39321c83..caa26ce0a 100755 --- a/freqtrade/__main__.py +++ b/freqtrade/__main__.py @@ -3,7 +3,7 @@ __main__.py for Freqtrade To launch Freqtrade as a module -> python -m freqtrade (with Python >= 3.9) +> python -m freqtrade (with Python >= 3.10) """ from freqtrade import main diff --git a/freqtrade/commands/strategy_utils_commands.py b/freqtrade/commands/strategy_utils_commands.py index 761a7262c..7ac0e77e8 100644 --- a/freqtrade/commands/strategy_utils_commands.py +++ b/freqtrade/commands/strategy_utils_commands.py @@ -1,5 +1,4 @@ import logging -import sys import time from pathlib import Path from typing import Any, Dict @@ -20,9 +19,6 @@ def start_strategy_update(args: Dict[str, Any]) -> None: :return: None """ - if sys.version_info == (3, 8): # pragma: no cover - sys.exit("Freqtrade strategy updater requires Python version >= 3.9") - config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE) strategy_objs = StrategyResolver.search_all_objects( diff --git a/freqtrade/main.py b/freqtrade/main.py index 67584c5b7..4e40c36ad 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -10,8 +10,8 @@ from typing import Any, List, Optional # check min. python version -if sys.version_info < (3, 9): # pragma: no cover - sys.exit("Freqtrade requires Python version >= 3.9") +if sys.version_info < (3, 10): # pragma: no cover + sys.exit("Freqtrade requires Python version >= 3.10") from freqtrade import __version__ from freqtrade.commands import Arguments diff --git a/freqtrade/rpc/api_server/web_ui.py b/freqtrade/rpc/api_server/web_ui.py index 6d37ec308..8f9dd7f12 100644 --- a/freqtrade/rpc/api_server/web_ui.py +++ b/freqtrade/rpc/api_server/web_ui.py @@ -31,16 +31,6 @@ async def ui_version(): } -def is_relative_to(path: Path, base: Path) -> bool: - # Helper function simulating behaviour of is_relative_to, which was only added in python 3.9 - try: - path.relative_to(base) - return True - except ValueError: - pass - return False - - @router_ui.get("/{rest_of_path:path}", include_in_schema=False) async def index_html(rest_of_path: str): """ @@ -56,7 +46,7 @@ async def index_html(rest_of_path: str): if filename.suffix == ".js": # Force text/javascript for .js files - Circumvent faulty system configuration media_type = "application/javascript" - if filename.is_file() and is_relative_to(filename, uibase): + if filename.is_file() and filename.is_relative_to(uibase): return FileResponse(str(filename), media_type=media_type) index_file = uibase / "index.html" diff --git a/ft_client/pyproject.toml b/ft_client/pyproject.toml index 919e524f8..a29b3d08c 100644 --- a/ft_client/pyproject.toml +++ b/ft_client/pyproject.toml @@ -13,14 +13,13 @@ authors = [ description = "Freqtrade - Client scripts" readme = "README.md" -requires-python = ">=3.9" +requires-python = ">=3.10" license = {text = "GPLv3"} # license = "GPLv3" classifiers = [ "Environment :: Console", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", diff --git a/pyproject.toml b/pyproject.toml index bd36d15c6..ad1c02928 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,14 +13,12 @@ authors = [ description = "Freqtrade - Crypto Trading Bot" readme = "README.md" -requires-python = ">=3.9" +requires-python = ">=3.10" license = {text = "GPLv3"} -# license = "GPLv3" classifiers = [ "Environment :: Console", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", @@ -125,7 +123,6 @@ extend-exclude = [".env", ".venv"] target-version = "py38" [tool.ruff.lint] -# Exclude UP036 as it's causing the "exit if < 3.9" to fail. extend-select = [ "C90", # mccabe "B", # bugbear diff --git a/requirements-hyperopt.txt b/requirements-hyperopt.txt index 41afe6d58..7f60c8299 100644 --- a/requirements-hyperopt.txt +++ b/requirements-hyperopt.txt @@ -2,8 +2,7 @@ -r requirements.txt # Required for hyperopt -scipy==1.14.1; python_version >= "3.10" -scipy==1.13.1; python_version < "3.10" +scipy==1.14.1 scikit-learn==1.5.2 ft-scikit-optimize==0.9.2 filelock==3.16.1 diff --git a/requirements.txt b/requirements.txt index 0934eef3a..4233d90ec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,9 +22,7 @@ technical==1.4.4 tabulate==0.9.0 pycoingecko==3.1.0 jinja2==3.1.4 -# Tables 3.10 dropped support for Python 3.9 -tables==3.9.1; python_version < "3.10" -tables==3.10.1; python_version >= "3.10" +tables==3.10.1 joblib==1.4.2 rich==13.8.1 pyarrow==17.0.0; platform_machine != 'armv7l' diff --git a/setup.ps1 b/setup.ps1 index 8647bea94..116ed0a2b 100644 --- a/setup.ps1 +++ b/setup.ps1 @@ -153,16 +153,13 @@ function Find-PythonExecutable { "python3.12", "python3.11", "python3.10", - "python3.9", "python3", "C:\Users\$env:USERNAME\AppData\Local\Programs\Python\Python312\python.exe", "C:\Users\$env:USERNAME\AppData\Local\Programs\Python\Python311\python.exe", "C:\Users\$env:USERNAME\AppData\Local\Programs\Python\Python310\python.exe", - "C:\Users\$env:USERNAME\AppData\Local\Programs\Python\Python39\python.exe", "C:\Python312\python.exe", "C:\Python311\python.exe", - "C:\Python310\python.exe", - "C:\Python39\python.exe" + "C:\Python310\python.exe" ) @@ -178,10 +175,10 @@ function Main { "Starting the operations..." | Out-File $LogFilePath -Append "Current directory: $(Get-Location)" | Out-File $LogFilePath -Append - # Exit on lower versions than Python 3.9 or when Python executable not found + # Exit on lower versions than Python 3.10 or when Python executable not found $PythonExecutable = Find-PythonExecutable if ($null -eq $PythonExecutable) { - Write-Log "No suitable Python executable found. Please ensure that Python 3.9 or higher is installed and available in the system PATH." -Level 'ERROR' + Write-Log "No suitable Python executable found. Please ensure that Python 3.10 or higher is installed and available in the system PATH." -Level 'ERROR' Exit 1 } diff --git a/setup.sh b/setup.sh index 18f7682d8..a9e684d62 100755 --- a/setup.sh +++ b/setup.sh @@ -25,7 +25,7 @@ function check_installed_python() { exit 2 fi - for v in 12 11 10 9 + for v in 12 11 10 do PYTHON="python3.${v}" which $PYTHON @@ -36,7 +36,7 @@ function check_installed_python() { fi done - echo "No usable python found. Please make sure to have python3.9 or newer installed." + echo "No usable python found. Please make sure to have python3.10 or newer installed." exit 1 } @@ -166,7 +166,7 @@ function install_macos() { #Gets number after decimal in python version version=$(egrep -o 3.\[0-9\]+ <<< $PYTHON | sed 's/3.//g') - if [[ $version -ge 9 ]]; then #Checks if python version >= 3.9 + if [[ $version -ge 10 ]]; then #Checks if python version >= 3.10 install_mac_newer_python_dependencies fi } @@ -277,7 +277,7 @@ function install() { install_redhat else echo "This script does not support your OS." - echo "If you have Python version 3.9 - 3.12, pip, virtualenv, ta-lib you can continue." + echo "If you have Python version 3.10 - 3.12, pip, virtualenv, ta-lib you can continue." echo "Wait 10 seconds to continue the next install steps or use ctrl+c to interrupt this shell." sleep 10 fi @@ -304,7 +304,7 @@ function help() { echo " -p,--plot Install dependencies for Plotting scripts." } -# Verify if 3.9+ is installed +# Verify if 3.10+ is installed check_installed_python case $* in