{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Strategy debugging example\n", "\n", "Debugging a strategy can be time-consuming. FreqTrade offers helper functions to visualize raw data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import nest_asyncio\n", "\n", "# Fix asyncio for Jupyter\n", "nest_asyncio.apply()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from os import chdir\n", "from pathlib import Path\n", "\n", "# Change directory to project root\n", "chdir(Path(Path.home(), 'Documents', 'Repos', 'freqtrade'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from itertools import chain\n", "\n", "from freqtrade.configuration import Configuration\n", "\n", "# Load configuration\n", "# Specify values for use in this script\n", "# Edit to match your needs\n", "config_files = [\n", " Path('user_data', 'user_repo', 'config.json'),\n", " Path(Path.home(), '.freqtrade', 'exchange-config.json')\n", "]\n", "# Create config object\n", "config = Configuration.from_files(config_files)\n", "# Create config string for use in cli commands\n", "conf = \" \".join(\n", " list(chain.from_iterable([['-c', str(file)] for file in config_files])))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import logging\n", "\n", "from freqtrade.loggers import setup_logging\n", "\n", "# Configure logging\n", "logger = logging.getLogger()\n", "setup_logging(config)\n", "logger.setLevel(logging.INFO)\n", "logger.info(f'conf: {conf}')\n", "# print(json.dumps(config, indent=1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Download data" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# Download data\n", "!freqtrade {conf} download-data --timeframes 1m 5m 1d" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Backtest" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# Run backtest\n", "!freqtrade {conf} backtesting --timerange -200 --ticker-interval 15m --refresh-pairs-cached --export=trades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "\n", "from freqtrade.data.btanalysis import load_trades\n", "from freqtrade.data.history import load_pair_history\n", "from freqtrade.plot.plotting import (extract_trades_of_period,\n", " generate_candlestick_graph)\n", "from freqtrade.resolvers import StrategyResolver\n", "\n", "# Specify pair to plot\n", "pair = \"ETH/BTC\"\n", "# Load ticker history\n", "tickers = load_pair_history(datadir=Path(config['datadir']),\n", " ticker_interval=config['ticker_interval'],\n", " pair=pair)\n", "\n", "# Load strategy\n", "strategy = StrategyResolver({\n", " 'user_data_dir': Path(config['user_data_dir']),\n", " 'strategy_path': Path(config['strategy_path'])\n", "}).strategy\n", "\n", "# Generate buy/sell signals using strategy\n", "data = strategy.analyze_ticker(tickers, {'pair': pair})\n", "\n", "# Collect trades\n", "trades = load_trades(\n", " config['trade_source'],\n", " db_url=config.get('db_url'),\n", " exportfilename=config.get('exportfilename'),\n", ")\n", "\n", "trades = trades.loc[trades['pair'] == pair]\n", "trades = extract_trades_of_period(data, trades)\n", "\n", "# Build and display plot\n", "fig = generate_candlestick_graph(pair=pair,\n", " data=data,\n", " trades=trades,\n", " indicators1=config[\"indicators1\"],\n", " indicators2=config[\"indicators2\"])\n", "\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Feel free to submit an issue or Pull Request enhancing this document if you would like to share ideas on how to best analyze the data." ] } ], "metadata": { "file_extension": ".py", "kernelspec": { "display_name": "Python [conda env:freqtrade]", "language": "python", "name": "conda-env-freqtrade-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" }, "mimetype": "text/x-python", "name": "python", "npconvert_exporter": "python", "pygments_lexer": "ipython3", "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false }, "version": 3 }, "nbformat": 4, "nbformat_minor": 2 }