From 284c6c4223d623b1125617835273d185c72a27b8 Mon Sep 17 00:00:00 2001 From: Gerald Lonlas Date: Mon, 1 Jan 2018 18:17:10 -0800 Subject: [PATCH 1/4] Reorder and revamp the documentation --- .github/ISSUE_TEMPLATE.md | 0 .github/PULL_REQUEST_TEMPLATE.md | 0 CONTRIBUTING.md | 16 +- README.md | 354 ++++++++++----------------- docs/.gitkeep | 0 docs/assets/freqtrade-screenshot.png | Bin 0 -> 145638 bytes docs/bot-optimization.md | 157 ++++++++++++ docs/bot-usage.md | 136 ++++++++++ docs/configuration.md | 127 ++++++++++ docs/faq.md | 21 ++ docs/index.md | 33 +++ docs/installation.md | 251 +++++++++++++++++++ docs/pre-requisite.md | 46 ++++ docs/sql_cheatsheet.md | 78 ++++++ docs/telegram-usage.md | 129 ++++++++++ 15 files changed, 1124 insertions(+), 224 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 docs/.gitkeep create mode 100644 docs/assets/freqtrade-screenshot.png create mode 100644 docs/bot-optimization.md create mode 100644 docs/bot-usage.md create mode 100644 docs/configuration.md create mode 100644 docs/faq.md create mode 100644 docs/index.md create mode 100644 docs/installation.md create mode 100644 docs/pre-requisite.md create mode 100644 docs/sql_cheatsheet.md create mode 100644 docs/telegram-usage.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..e69de29bb diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..e69de29bb diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 21dcda44a..967f57b65 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,16 +1,21 @@ +# Contribute to freqtrade + Feel like our bot is missing a feature? We welcome your pull requests! Few pointers for contributions: - Create your PR against the `develop` branch, not `master`. -- New features need to contain unit tests and must be PEP8 conformant (max-line-length = 100). +- New features need to contain unit tests and must be PEP8 +conformant (max-line-length = 100). If you are unsure, discuss the feature on our [Slack](https://join.slack.com/t/highfrequencybot/shared_invite/enQtMjQ5NTM0OTYzMzY3LWMxYzE3M2MxNDdjMGM3ZTYwNzFjMGIwZGRjNTc3ZGU3MGE3NzdmZGMwNmU3NDM5ZTNmM2Y3NjRiNzk4NmM4OGE) or in a [issue](https://github.com/gcarq/freqtrade/issues) before a PR. -Before sending the PR: -## Run unit tests +**Before sending the PR:** -All unit tests must pass. If a unit test is broken, change your code to make it pass. It means you have introduced a regression +## 1. Run unit tests + +All unit tests must pass. If a unit test is broken, change your code to +make it pass. It means you have introduced a regression. **Test the whole project** ```bash @@ -26,7 +31,8 @@ pytest freqtrade/tests/test_.py ```bash pytest freqtrade/tests/test_.py::test_ ``` -## Test if your code is PEP8 compliant + +## 2. Test if your code is PEP8 compliant **Install packages** (If not already installed) ```bash pip3.6 install flake8 coveralls diff --git a/README.md b/README.md index 57000301f..51e86b83d 100644 --- a/README.md +++ b/README.md @@ -1,160 +1,132 @@ # freqtrade [![Build Status](https://travis-ci.org/gcarq/freqtrade.svg?branch=develop)](https://travis-ci.org/gcarq/freqtrade) -[![Coverage Status](https://coveralls.io/repos/github/gcarq/freqtrade/badge.svg?branch=develop)](https://coveralls.io/github/gcarq/freqtrade?branch=develop) +[![Coverage Status](https://coveralls.io/repos/github/gcarq/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/gcarq/freqtrade?branch=develop) -Simple High frequency trading bot for crypto currencies. -Currently supports trading on Bittrex exchange. +Simple High frequency trading bot for crypto currencies designed to +support multi exchanges and be controlled via Telegram. -This software is for educational purposes only. -Don't risk money which you are afraid to lose. +![freqtrade](https://raw.githubusercontent.com/gcarq/freqtrade/develop/docs/assets/freqtrade-screenshot.png) -The command interface is accessible via Telegram (not required). -Just register a new bot on https://telegram.me/BotFather -and enter the telegram `token` and your `chat_id` in `config.json` +## Disclaimer +This software is for educational purposes only. Do not risk money which +you are afraid to lose. Always start by running a trading bot in Dry-run and do not engage money +before you understand how it works and what profit/loss you should +expect. -Persistence is achieved through sqlite. +We strongly recommend you to have coding and Python knowledge. Do not +hesitate to read the source code and understand the mechanism of this bot. -### Telegram RPC commands: -* /start: Starts the trader -* /stop: Stops the trader -* /status [table]: Lists all open trades -* /count: Displays number of open trades -* /profit: Lists cumulative profit from all finished trades -* /forcesell |all: Instantly sells the given trade (Ignoring `minimum_roi`). -* /performance: Show performance of each finished trade grouped by pair -* /balance: Show account balance per currency -* /daily : Shows profit or loss per day, over the last n days -* /help: Show help message -* /version: Show version +## Table of Contents +- [Features](#features) +- [Quick start](#quick-start) +- [Documentations](https://github.com/gcarq/freqtrade/blob/develop/docs/index.md) + - [Installation](https://github.com/gcarq/freqtrade/blob/develop/docs/installation.md) +- [Support](#support) + - [Help](#help--slack) + - [Bugs](#bugs--issues) + - [Feature Requests](#feature-requests) + - [Pull Requests](#pull-requests) +- [Basic Usage](#basic-usage) + - [Bot commands](#bot-commands) + - [Telegram RPC commands](#telegram-rpc-commands) +- [Min hardware required](#min-hardware-required) -### Config -`minimal_roi` is a JSON object where the key is a duration -in minutes and the value is the minimum ROI in percent. -See the example below: -``` -"minimal_roi": { - "40": 0.0, # Sell after 40 minutes if the profit is not negative - "30": 0.01, # Sell after 30 minutes if there is at least 1% profit - "20": 0.02, # Sell after 20 minutes if there is at least 2% profit - "0": 0.04 # Sell immediately if there is at least 4% profit -}, -``` +## Branches +The project is currently setup in two main branches: +- `develop` - This branch has often new features, but might also cause +breaking changes. +- `master` - This branch contains the latest stable release. The bot +'should' be stable on this branch, and is generally well tested. -`stoploss` is loss in percentage that should trigger a sale. -For example value `-0.10` will cause immediate sell if the -profit dips below -10% for a given trade. This parameter is optional. +## Features +- [x] **Based on Python**: For botting on any operating system - +Windows, macOS and Linux +- [x] **Persistence**: Persistence is achieved through sqlite +- [x] **Dry-run**: Run the bot without playing money. +- [x] **Backtesting**: Run a simulation of your buy/sell strategy. +- [x] **Strategy Optimization**: Optimize your buy/sell strategy +parameters with Hyperopts. +- [x] **Whitelist crypto-currencies**: Select which crypto-currency you +want to trade. +- [x] **Blacklist crypto-currencies**: Select which crypto-currency you +want to avoid. +- [x] **Manageable via Telegram**: Manage the bot with Telegram +- [x] **Display profit/loss in fiat**: Display your profit/loss in +33 fiat. +- [x] **Daily summary of profit/loss**: Provide a daily summary + of your profit/loss. +- [x] **Performance status report**: Provide a performance status of +your current trades. -`initial_state` is an optional field that defines the initial application state. -Possible values are `running` or `stopped`. (default=`running`) -If the value is `stopped` the bot has to be started with `/start` first. +### Exchange supported +- [x] Bittrex +- [ ] Binance +- [ ] Others -`ask_last_balance` sets the bidding price. Value `0.0` will use `ask` price, `1.0` will -use the `last` price and values between those interpolate between ask and last -price. Using `ask` price will guarantee quick success in bid, but bot will also -end up paying more then would probably have been necessary. +## Quick start +This quick start section is a very short explanation on how to test the +bot in dry-run. We invite you to read the +[bot documentation](https://github.com/gcarq/freqtrade/blob/develop/docs/index.md) +to ensure you understand how the bot is working. -`fiat_display_currency` set the fiat to use for the conversion form coin to -fiat in Telegram. The valid value are: "AUD", "BRL", "CAD", "CHF", -"CLP", "CNY", "CZK", "DKK", "EUR", "GBP", "HKD", "HUF", "IDR", "ILS", -"INR", "JPY", "KRW", "MXN", "MYR", "NOK", "NZD", "PHP", "PKR", "PLN", -"RUB", "SEK", "SGD", "THB", "TRY", "TWD", "ZAR", "USD". +The following steps are made for Linux/MacOS environment -The other values should be self-explanatory, -if not feel free to raise a github issue. - -### Prerequisites -* python3.6 -* sqlite -* [TA-lib](https://github.com/mrjbq7/ta-lib#dependencies) binaries -* Minimal (advised) system requirements: 2GB RAM, 1GB data, 2vCPU - -### Install - -#### Arch Linux - -Use your favorite AUR helper and install `python-freqtrade-git`. - -#### Manually - -`master` branch contains the latest stable release. - -`develop` branch has often new features, but might also cause breaking changes. To use it, you are encouraged to join our [slack channel](https://join.slack.com/t/highfrequencybot/shared_invite/enQtMjQ5NTM0OTYzMzY3LWMxYzE3M2MxNDdjMGM3ZTYwNzFjMGIwZGRjNTc3ZGU3MGE3NzdmZGMwNmU3NDM5ZTNmM2Y3NjRiNzk4NmM4OGE). - -``` -$ cd freqtrade/ -# copy example config. Dont forget to insert your api keys -$ cp config.json.example config.json -$ python -m venv .env -$ source .env/bin/activate -$ pip install -r requirements.txt -$ pip install -e . -$ ./freqtrade/main.py -``` - -There is also an [article](https://www.sales4k.com/blockchain/high-frequency-trading-bot-tutorial/) about how to setup the bot (thanks [@gurghet](https://github.com/gurghet)).* - -\* *Note:* that article was written for an earlier version, so it may be outdated - -#### Docker - -Building the image: - -``` -$ cd freqtrade -$ docker build -t freqtrade . -``` - -For security reasons, your configuration file will not be included in the -image, you will need to bind mount it. It is also advised to bind mount -a SQLite database file (see second example) to keep it between updates. - -You can run a one-off container that is immediately deleted upon exiting with -the following command (config.json must be in the current working directory): - -``` -$ docker run --rm -v `pwd`/config.json:/freqtrade/config.json -it freqtrade -``` - -To run a restartable instance in the background (feel free to place your -configuration and database files wherever it feels comfortable on your -filesystem): - -``` -$ cd ~/.freq -$ touch tradesv3.sqlite -$ docker run -d \ - --name freqtrade \ - -v ~/.freq/config.json:/freqtrade/config.json \ - -v ~/.freq/tradesv3.sqlite:/freqtrade/tradesv3.sqlite \ - freqtrade -``` -If you are using `dry_run=True` it's not necessary to mount `tradesv3.sqlite`. - -You can then use the following commands to monitor and manage your container: - -``` -$ docker logs freqtrade -$ docker logs -f freqtrade -$ docker restart freqtrade -$ docker stop freqtrade -$ docker start freqtrade -``` - -You do not need to rebuild the image for configuration -changes, it will suffice to edit `config.json` and restart the container. - -#### systemd service file -Copy `./freqtrade.service` to your systemd user directory (usually `~/.config/systemd/user`) -and update `WorkingDirectory` and `ExecStart` to match your setup. -After that you can start the daemon with: +**1. Clone the repo** ```bash -$ systemctl --user start freqtrade +git clone git@github.com:gcarq/freqtrade.git +git checkout develop +cd freqtrade +``` +**2. Create the config file** +Switch `"dry_run": true,` +```bash +cp config.json.example config.json +vi config.json +``` +**3. Build your docker image and run it** +```bash +docker build -t freqtrade . +docker run --rm -v `pwd`/config.json:/freqtrade/config.json -it freqtrade ``` -### Usage -``` + +### Help / Slack +For any questions not covered by the documentation or for further +information about the bot, we encourage you to join our slack channel. +- [Click here to join Slack channel](https://join.slack.com/t/highfrequencybot/shared_invite/enQtMjQ5NTM0OTYzMzY3LWMxYzE3M2MxNDdjMGM3ZTYwNzFjMGIwZGRjNTc3ZGU3MGE3NzdmZGMwNmU3NDM5ZTNmM2Y3NjRiNzk4NmM4OGE). + +### [Bugs / Issues](https://github.com/gcarq/freqtrade/issues?q=is%3Aissue) +If you discover a bug in the bot, please +[search our issue tracker](https://github.com/gcarq/freqtrade/issues?q=is%3Aissue) +first. If it hasn't been reported, please +[create a new issue](https://github.com/gcarq/freqtrade/issues/new) and +ensure you follow the template guide so that our team can assist you as +quickly as possible. + +### [Feature Requests](https://github.com/gcarq/freqtrade/labels/enhancement) +Have you a great idea to improve the bot you want to share? Please, +first search if this feature was not [already discussed](https://github.com/gcarq/freqtrade/labels/enhancement). +If it hasn't been requested, please +[create a new request](https://github.com/gcarq/freqtrade/issues/new) +and ensure you follow the template guide so that it does not get lost +in the bug reports. + +### [Pull Requests](https://github.com/gcarq/freqtrade/pulls) +Feel like our bot is missing a feature? We welcome your pull requests! +Please read our +[Contributing document](https://github.com/gcarq/freqtrade/blob/develop/CONTRIBUTING.md) +to understand the requirements before sending your pull-requests. + +**Important:** Always create your PR against the `develop` branch, not +`master`. + +## Basic Usage + +### Bot commands + +```bash usage: main.py [-h] [-c PATH] [-v] [--version] [--dynamic-whitelist [INT]] [--dry-run-db] {backtesting,hyperopt} ... @@ -179,86 +151,30 @@ optional arguments: "tradesv3.dry_run.sqlite" instead of memory DB. Work only if dry_run is enabled. ``` +More details on: +- [How to run the bot](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-usage.md#bot-commands) +- [How to use Backtesting](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-usage.md#backtesting-commands) +- [How to use Hyperopt](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-usage.md#hyperopt-commands) + +### Telegram RPC commands +Telegram is not mandatory. However, this is a great way to control your +bot. More details on our +[documentation](https://github.com/gcarq/freqtrade/blob/develop/docs/index.md) -#### Dynamic whitelist example -Per default `--dynamic-whitelist` will retrieve the 20 currencies based -on BaseVolume. This value can be changed when you run the script. - -**By Default** -Get the 20 currencies based on BaseVolume. -```bash -freqtrade --dynamic-whitelist -``` - -**Customize the number of currencies to retrieve** -Get the 30 currencies based on BaseVolume. -```bash -freqtrade --dynamic-whitelist 30 -``` - -**Exception** -`--dynamic-whitelist` must be greater than 0. If you enter 0 or a -negative value (e.g -2), `--dynamic-whitelist` will use the default -value (20). - -### Backtesting - -Backtesting also uses the config specified via `-c/--config`. - -``` -usage: freqtrade backtesting [-h] [-l] [-i INT] [--realistic-simulation] - [-r] - -optional arguments: - -h, --help show this help message and exit - -l, --live using live data - -i INT, --ticker-interval INT - specify ticker interval in minutes (default: 5) - --realistic-simulation - uses max_open_trades from config to simulate real - world limitations - -r, --refresh-pairs-cached - refresh the pairs files in tests/testdata with - the latest data from Bittrex. Use it if you want - to run your backtesting with up-to-date data. -``` - -#### How to use --refresh-pairs-cached parameter? -The first time your run Backtesting, it will take the pairs your have -set in your config file and download data from Bittrex. - -If for any reason you want to update your data set, you use -`--refresh-pairs-cached` to force Backtesting to update the data it has. -**Use it only if you want to update your data set. You will not be able -to come back to the previous version.** - -To test your strategy with latest data, we recommend to continue using -the parameter `-l` or `--live`. +- `/start`: Starts the trader +- `/stop`: Stops the trader +- `/status [table]`: Lists all open trades +- `/count`: Displays number of open trades +- `/profit`: Lists cumulative profit from all finished trades +- `/forcesell |all`: Instantly sells the given trade +(Ignoring `minimum_roi`). +- `/performance`: Show performance of each finished trade grouped by pair +- `/balance`: Show account balance per currency +- `/daily `: Shows profit or loss per day, over the last n days +- `/help`: Show help message +- `/version`: Show version -### Hyperopt - -It is possible to use hyperopt for trading strategy optimization. -Hyperopt uses an internal config named `OPTIMIZE_CONFIG` located in `freqtrade/optimize/hyperopt.py`. - -``` -usage: freqtrade hyperopt [-h] [-e INT] [--use-mongodb] - -optional arguments: - -h, --help show this help message and exit - -e INT, --epochs INT specify number of epochs (default: 100) - --use-mongodb parallelize evaluations with mongodb (requires mongod - in PATH) - -``` - -### Execute tests - -``` -$ pytest freqtrade -``` - -### Contributing - -We welcome contributions. See our [contribution guide](https://github.com/gcarq/freqtrade/blob/develop/README.md) -for more details. \ No newline at end of file +## Min hardware required +To run this bot we recommend you a cloud instance with a minimum of: +* Minimal (advised) system requirements: 2GB RAM, 1GB disk space, 2vCPU diff --git a/docs/.gitkeep b/docs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/assets/freqtrade-screenshot.png b/docs/assets/freqtrade-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..4ad681579fdd371896c3b751582d71614c806666 GIT binary patch literal 145638 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

?1|1GeVRh0%XX?_4_y4;uf7)C^j3 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 z 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�lYGaSQpn|zh%L=ZSp7zV_ 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 KQ6_Kp;r{_>^a&pT literal 0 HcmV?d00001 diff --git a/docs/bot-optimization.md b/docs/bot-optimization.md new file mode 100644 index 000000000..88ba672f8 --- /dev/null +++ b/docs/bot-optimization.md @@ -0,0 +1,157 @@ +# Bot Optimization +This page explains where to customize your strategies, validate their +performance by using Backtesting, and tuning them by finding the optimal +parameters with Hyperopt. + +## Table of Contents +- [Change your strategy](#change-your-strategy) +- [Add more Indicator](#add-more-indicator) +- [Test your strategy with Backtesting](#test-your-strategy-with-backtesting) +- [Find optimal parameters with Hyperopt](#find-optimal-parameters-with-hyperopt) +- [Show your buy strategy on a graph](#show-your-buy-strategy-on-a-graph) + +## Change your strategy +The bot is using buy and sell strategies to buy and sell your trades. +Both are customizable. + +### Buy strategy +The default buy strategy is located in the file +[freqtrade/analyze.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/analyze.py#L73-L92). +Edit the function `populate_buy_trend()` to update your buy strategy. + +Sample: +```python +def populate_buy_trend(dataframe: DataFrame) -> DataFrame: + """ + Based on TA indicators, populates the buy signal for the given dataframe + :param dataframe: DataFrame + :return: DataFrame with buy column + """ + dataframe.loc[ + ( + (dataframe['rsi'] < 35) & + (dataframe['fastd'] < 35) & + (dataframe['adx'] > 30) & + (dataframe['plus_di'] > 0.5) + ) | + ( + (dataframe['adx'] > 65) & + (dataframe['plus_di'] > 0.5) + ), + 'buy'] = 1 + + return dataframe +``` + +### Sell strategy +The default buy strategy is located in the file +[freqtrade/analyze.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/analyze.py#L95-L115) +Edit the function `populate_sell_trend()` to update your buy strategy. + +Sample: +```python +def populate_sell_trend(dataframe: DataFrame) -> DataFrame: + """ + Based on TA indicators, populates the sell signal for the given dataframe + :param dataframe: DataFrame + :return: DataFrame with buy column + """ + dataframe.loc[ + ( + ( + (crossed_above(dataframe['rsi'], 70)) | + (crossed_above(dataframe['fastd'], 70)) + ) & + (dataframe['adx'] > 10) & + (dataframe['minus_di'] > 0) + ) | + ( + (dataframe['adx'] > 70) & + (dataframe['minus_di'] > 0.5) + ), + 'sell'] = 1 + return dataframe +``` + +## Add more Indicator +As you have seen, buy and sell strategies need indicators. You can see +the indicators in the file +[freqtrade/analyze.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/analyze.py#L95-L115). +Of course you can add more indicators by extending the list contained in +the function `populate_indicators()`. + +Sample: +```python +def populate_indicators(dataframe: DataFrame) -> DataFrame: + """ + Adds several different TA indicators to the given DataFrame + """ + dataframe['sar'] = ta.SAR(dataframe) + dataframe['adx'] = ta.ADX(dataframe) + stoch = ta.STOCHF(dataframe) + dataframe['fastd'] = stoch['fastd'] + dataframe['fastk'] = stoch['fastk'] + dataframe['blower'] = ta.BBANDS(dataframe, nbdevup=2, nbdevdn=2)['lowerband'] + dataframe['sma'] = ta.SMA(dataframe, timeperiod=40) + dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9) + dataframe['mfi'] = ta.MFI(dataframe) + dataframe['rsi'] = ta.RSI(dataframe) + dataframe['ema5'] = ta.EMA(dataframe, timeperiod=5) + dataframe['ema10'] = ta.EMA(dataframe, timeperiod=10) + dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50) + dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100) + dataframe['ao'] = awesome_oscillator(dataframe) + macd = ta.MACD(dataframe) + dataframe['macd'] = macd['macd'] + dataframe['macdsignal'] = macd['macdsignal'] + dataframe['macdhist'] = macd['macdhist'] + hilbert = ta.HT_SINE(dataframe) + dataframe['htsine'] = hilbert['sine'] + dataframe['htleadsine'] = hilbert['leadsine'] + dataframe['plus_dm'] = ta.PLUS_DM(dataframe) + dataframe['plus_di'] = ta.PLUS_DI(dataframe) + dataframe['minus_dm'] = ta.MINUS_DM(dataframe) + dataframe['minus_di'] = ta.MINUS_DI(dataframe) + return dataframe +``` + +## Test your strategy with Backtesting +Now you have good Buy and Sell strategies, you want to test it against +real data. This is what we call [backtesting](https://en.wikipedia.org/wiki/Backtesting). + +Backtesting will use the crypto-currencies (pair) tickers located in +[/freqtrade/tests/testdata](https://github.com/gcarq/freqtrade/tree/develop/freqtrade/tests/testdata). +If the 5 min and 1 min ticker for the crypto-currencies to test is not +already in the `testdata` folder, backtesting will download them +automatically. Testdata files will not be updated until your specify it. + +### Run a backtesting against the currencies listed in your config file +**With 5 min tickers (Per default)** +```bash +python3 ./freqtrade/main.py -c config.json backtesting --realistic-simulation +``` + +**With 1 min tickers** +```bash +python3 ./freqtrade/main.py -c config.json backtesting --realistic-simulation --ticker-interval 1 +``` + +**Reload your testdata files** +```bash +python3 ./freqtrade/main.py -c config.json backtesting --realistic-simulation --refresh-pairs-cached +``` + +**With live data (do not alter your testdata files)** +```bash +python3 ./freqtrade/main.py -c config.json backtesting --realistic-simulation --live +``` + +## Find optimal parameters with Hyperopt +*To be completed, please feel free to complete this section.* + +## Show your buy strategy on a graph +*To be completed, please feel free to complete this section.* + +## Next step +Now you have a perfect bot and want to control it from Telegram. Your +next step is to learn [Telegram usage](https://github.com/gcarq/freqtrade/blob/develop/docs/telegram-usage.md). \ No newline at end of file diff --git a/docs/bot-usage.md b/docs/bot-usage.md new file mode 100644 index 000000000..79044691e --- /dev/null +++ b/docs/bot-usage.md @@ -0,0 +1,136 @@ +# Bot usage +This page explains the difference parameters of the bot and how to run +it. + +## Table of Contents +- [Bot commands](#bot-commands) +- [Backtesting commands](#backtesting-commands) +- [Hyperopt commands](#hyperopt-commands) + +## Bot commands +``` +usage: main.py [-h] [-c PATH] [-v] [--version] [--dynamic-whitelist [INT]] + [--dry-run-db] + {backtesting,hyperopt} ... + +Simple High Frequency Trading Bot for crypto currencies + +positional arguments: + {backtesting,hyperopt} + backtesting backtesting module + hyperopt hyperopt module + +optional arguments: + -h, --help show this help message and exit + -c PATH, --config PATH + specify configuration file (default: config.json) + -v, --verbose be verbose + --version show program's version number and exit + --dynamic-whitelist [INT] + dynamically generate and update whitelist based on 24h + BaseVolume (Default 20 currencies) + --dry-run-db Force dry run to use a local DB + "tradesv3.dry_run.sqlite" instead of memory DB. Work + only if dry_run is enabled. +``` + +### How to use a different config file? +The bot allows you to select which config file you want to use. Per +default, the bot will load the file `./config.json` + +```bash +python3 ./freqtrade/main.py -c path/far/far/away/config.json +``` + +### How to use --dynamic-whitelist? +Per default `--dynamic-whitelist` will retrieve the 20 currencies based +on BaseVolume. This value can be changed when you run the script. + +**By Default** +Get the 20 currencies based on BaseVolume. +```bash +python3 ./freqtrade/main.py --dynamic-whitelist +``` + +**Customize the number of currencies to retrieve** +Get the 30 currencies based on BaseVolume. +```bash +python3 ./freqtrade/main.py --dynamic-whitelist 30 +``` + +**Exception** +`--dynamic-whitelist` must be greater than 0. If you enter 0 or a +negative value (e.g -2), `--dynamic-whitelist` will use the default +value (20). + +### How to use --dry-run-db? +When you run the bot in Dry-run mode, per default no transactions are +stored in a database. If you want to store your bot actions in a DB +using `--dry-run-db`. This command will use a separate database file +`tradesv3.dry_run.sqlite` + +```bash +python3 ./freqtrade/main.py -c config.json --dry-run-db +``` + + +## Backtesting commands + +Backtesting also uses the config specified via `-c/--config`. + +``` +usage: freqtrade backtesting [-h] [-l] [-i INT] [--realistic-simulation] + [-r] + +optional arguments: + -h, --help show this help message and exit + -l, --live using live data + -i INT, --ticker-interval INT + specify ticker interval in minutes (default: 5) + --realistic-simulation + uses max_open_trades from config to simulate real + world limitations + -r, --refresh-pairs-cached + refresh the pairs files in tests/testdata with + the latest data from Bittrex. Use it if you want + to run your backtesting with up-to-date data. +``` + +### How to use --refresh-pairs-cached parameter? +The first time your run Backtesting, it will take the pairs you have +set in your config file and download data from Bittrex. + +If for any reason you want to update your data set, you use +`--refresh-pairs-cached` to force Backtesting to update the data it has. +**Use it only if you want to update your data set. You will not be able +to come back to the previous version.** + +To test your strategy with latest data, we recommend continuing using +the parameter `-l` or `--live`. + + +## Hyperopt commands + +It is possible to use hyperopt for trading strategy optimization. +Hyperopt uses an internal json config return by `hyperopt_optimize_conf()` +located in `freqtrade/optimize/hyperopt_conf.py`. + +``` +usage: freqtrade hyperopt [-h] [-e INT] [--use-mongodb] + +optional arguments: + -h, --help show this help message and exit + -e INT, --epochs INT specify number of epochs (default: 100) + --use-mongodb parallelize evaluations with mongodb (requires mongod + in PATH) + +``` + +## A parameter missing in the configuration? +All parameters for `main.py`, `backtesting`, `hyperopt` are referenced +in [misc.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/misc.py#L84) + +## Next step +The optimal strategy of the bot will change with time depending of the +market trends. The next step is to +[optimize your bot](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md). \ No newline at end of file diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 000000000..bfd169aea --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,127 @@ +# Configure the bot +This page explains how to configure your `config.json` file. + +## Table of Contents +- [Bot commands](#bot-commands) +- [Backtesting commands](#backtesting-commands) +- [Hyperopt commands](#hyperopt-commands) + +## Setup config.json +We recommend to copy and use the `config.json.example` as a template +for your bot configuration. + +The table below will list all configuration parameters. + +| Command | Default | Mandatory | Description | +|----------|---------|----------|-------------| +| `max_open_trades` | 3 | Yes | Number of trades open your bot will have. +| `stake_currency` | BTC | Yes | Crypto-currency used for trading. +| `stake_amount` | 0.05 | Yes | Amount of crypto-currency your bot will use for each trade. Per default, the bot will use (0.05 BTC x 3) = 0.15 BTC in total will be always engaged. +| `fiat_display_currency` | USD | Yes | Fiat currency used to show your profits. More information below. +| `dry_run` | true | Yes | Define if the bot must be in Dry-run or production mode. +| `minimal_roi` | See below | Yes | Set the threshold in percent the bot will use to sell a trade. More information below. +| `stoploss` | -0.10 | No | Value of the stoploss in percent used by the bot. More information below. +| `bid_strategy.ask_last_balance` | 0.0 | Yes | Set the bidding price. More information below. +| `exchange.name` | bittrex | Yes | Name of the exchange class to use. +| `exchange.key` | key | No | API key to use for the exchange. Only required when you are in production mode. +| `exchange.secret` | secret | No | API secret to use for the exchange. Only required when you are in production mode. +| `exchange.pair_whitelist` | [] | No | List of currency to use by the bot. Can be overrided with `--dynamic-whitelist` param. +| `exchange.pair_blacklist` | [] | No | List of currency the bot must avoid. Useful when using `--dynamic-whitelist` param. +| `experimental.use_sell_signal` | false | No | Use your sell strategy in addition of the `minimal_roi`. +| `telegram.enabled` | true | Yes | Enable or not the usage of Telegram. +| `telegram.token` | token | No | Your Telegram bot token. Only required is `enable` is `true`. +| `telegram.chat_id` | chat_id | No | Your personal Telegram account id. Only required is `enable` is `true`. +| `initial_state` | running | No | Defines the initial application state. More information below. +| `internals.process_throttle_secs` | 5 | Yes | Set the process throttle. Value in second. + +The definition of each config parameters is in +[misc.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/misc.py#L205). + +### Understand minimal_roi +`minimal_roi` is a JSON object where the key is a duration +in minutes and the value is the minimum ROI in percent. +See the example below: +``` +"minimal_roi": { + "40": 0.0, # Sell after 40 minutes if the profit is not negative + "30": 0.01, # Sell after 30 minutes if there is at least 1% profit + "20": 0.02, # Sell after 20 minutes if there is at least 2% profit + "0": 0.04 # Sell immediately if there is at least 4% profit +}, +``` + +### Understand stoploss +`stoploss` is loss in percentage that should trigger a sale. +For example value `-0.10` will cause immediate sell if the +profit dips below -10% for a given trade. This parameter is optional. + +### Understand initial_state +`initial_state` is an optional field that defines the initial application state. +Possible values are `running` or `stopped`. (default=`running`) +If the value is `stopped` the bot has to be started with `/start` first. + +### Understand ask_last_balance +`ask_last_balance` sets the bidding price. Value `0.0` will use `ask` price, `1.0` will +use the `last` price and values between those interpolate between ask and last +price. Using `ask` price will guarantee quick success in bid, but bot will also +end up paying more then would probably have been necessary. + +### What values for fiat_display_currency? +`fiat_display_currency` set the fiat to use for the conversion form coin to fiat in Telegram. +The valid value are: "AUD", "BRL", "CAD", "CHF", "CLP", "CNY", "CZK", "DKK", "EUR", "GBP", "HKD", "HUF", "IDR", "ILS", "INR", "JPY", "KRW", "MXN", "MYR", "NOK", "NZD", "PHP", "PKR", "PLN", "RUB", "SEK", "SGD", "THB", "TRY", "TWD", "ZAR", "USD". + +## Switch to dry-run mode +We recommend starting the bot in dry-run mode to see how your bot will +behave and how is the performance of your strategy. In Dry-run mode the +bot does not engage your money. It only runs a live simulation without +creating trades. + +### To switch your bot in Dry-run mode: +1. Edit your `config.json` file +2. Switch dry-run to true +```json +"dry_run": true, +``` + +3. Remove your Bittrex API key (change them by fake api credentials) +```json +"exchange": { + "name": "bittrex", + "key": "key", + "secret": "secret", + ... +} +``` + +Once you will be happy with your bot performance, you can switch it to +production mode. + +## Switch to production mode +In production mode, the bot will engage your money. Be careful a wrong +strategy can lose all your money. Be aware of what you are doing when +you run it in production mode. + +### To switch your bot in production mode: +1. Edit your `config.json` file + +2. Switch dry-run to false +```json +"dry_run": false, +``` + +3. Insert your Bittrex API key (change them by fake api keys) +```json +"exchange": { + "name": "bittrex", + "key": "af8ddd35195e9dc500b9a6f799f6f5c93d89193b", + "secret": "08a9dc6db3d7b53e1acebd9275677f4b0a04f1a5", + ... +} +``` +If you have not your Bittrex API key yet, +[see our tutorial](https://github.com/gcarq/freqtrade/blob/develop/docs/pre-requisite.md). + + +## Next step +Now you have configured your config.json, the next step is to +[start your bot](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-usage.md). diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 000000000..58929e15c --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,21 @@ +# freqtrade FAQ + +#### I have waited 5 minutes, why hasn't the bot made any trades yet?! + +Depending on the buy strategy, the amount of whitelisted coins, the situation of the market etc, it can take up to hours to find good entry position for a trade. Be patient! + +#### I have made 12 trades already, why is my total profit negative?! + +I understand your disappointment but unfortunately 12 trades is just not enough to say anything. If you run backtesting, you can see that our current algorithm does leave you on the plus side, but that is after thousands of trades and even there, you will be left with losses on specific coins that you have traded tens if not hundreds of times. We of course constantly aim to improve the bot but it will _always_ be a gamble, which should leave you with modest wins on monthly basis but you can't say much from few trades. + +#### I’d like to change the stake amount. Can I just stop the bot with /stop and then change the config.json and run it again? + +Not quite. Trades are persisted to a database but the configuration is currently only read when the bot is killed and restarted. `/stop` more like pauses. You can stop your bot, adjust settings and start it again. + +#### I want to improve the bot with a new strategy + +That's great. We have a nice backtesting and hyperoptimizing setup. See the tutorial [[here|Testing-new-strategies-with-Hyperopt]]. + +#### Is there a setting to only SELL the coins being held and not perform anymore BUYS? + +You can use the `/forcesell all` command from Telegram. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..5df745ae8 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,33 @@ +# freqtrade documentation +Welcome to freqtrade documentation. Please feel free to contribute to +this documentation if you see it became outdated by sending us a +Pull-request. Do not hesitate to reach us on +[Slack](https://join.slack.com/t/highfrequencybot/shared_invite/enQtMjQ5NTM0OTYzMzY3LWMxYzE3M2MxNDdjMGM3ZTYwNzFjMGIwZGRjNTc3ZGU3MGE3NzdmZGMwNmU3NDM5ZTNmM2Y3NjRiNzk4NmM4OGE) + if you do not find the answer to your questions. + +## Table of Contents +- [Pre-requisite](https://github.com/gcarq/freqtrade/blob/develop/docs/pre-requisite.md) + - [Setup your Bittrex account](https://github.com/gcarq/freqtrade/blob/develop/docs/pre-requisite.md#setup-your-bittrex-account) + - [Setup your Telegram bot](https://github.com/gcarq/freqtrade/blob/develop/docs/pre-requisite.md#setup-your-telegram-bot) +- [Bot Installation](https://github.com/gcarq/freqtrade/blob/develop/docs/installation.md) + - [Install with Docker (all platforms)](https://github.com/gcarq/freqtrade/blob/develop/docs/installation.md#docker) + - [Install on Linux Ubuntu](https://github.com/gcarq/freqtrade/blob/develop/docs/installation.md#21-linux---ubuntu-1604) + - [Install on MacOS](https://github.com/gcarq/freqtrade/blob/develop/docs/installation.md#23-macos-installation) + - [Install on Windows](https://github.com/gcarq/freqtrade/blob/develop/docs/installation.md#windows) +- [Bot Configuration](https://github.com/gcarq/freqtrade/blob/develop/docs/configuration.md) +- [Bot usage (Start your bot)](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-usage.md) + - [Bot commands](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-usage.md#bot-commands) + - [Backtesting commands](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-usage.md#backtesting-commands) + - [Hyperopt commands](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-usage.md#hyperopt-commands) +- [Bot Optimization](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md) + - [Change your strategy](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#change-your-strategy) + - [Add more Indicator](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#add-more-indicator) + - [Test your strategy with Backtesting](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#test-your-strategy-with-backtesting) + - [Find optimal parameters with Hyperopt](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#find-optimal-parameters-with-hyperopt) + - [Show your buy strategy on a graph](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#show-your-buy-strategy-on-a-graph) +- [Control the bot with telegram](https://github.com/gcarq/freqtrade/blob/develop/docs/telegram-usage.md) +- [Contribute to the project](https://github.com/gcarq/freqtrade/blob/develop/CONTRIBUTING.md) + - [How to contribute](https://github.com/gcarq/freqtrade/blob/develop/CONTRIBUTING.md) + - [Run tests & Check PEP8 compliance](https://github.com/gcarq/freqtrade/blob/develop/CONTRIBUTING.md) +- [FAQ](https://github.com/gcarq/freqtrade/blob/develop/docs/faq.md) + - [SQL cheatsheet](https://github.com/gcarq/freqtrade/blob/develop/docs/sql_cheatsheet.md) \ No newline at end of file diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 000000000..a9f024c60 --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,251 @@ +# Install the bot +This page explains how to prepare your environment for running the bot. +To understand how to set up the bot please read the Bot +[Bot configuration](https://github.com/gcarq/freqtrade/blob/develop/docs/configuration.md) +page. + +## Table of Contents +- [Docker Automatic Installation](#docker) +- [Linux or Mac manual Installation](#linux--mac) + - [Linux - Ubuntu 16.04](#21-linux---ubuntu-1604) + - [Linux - Other distro](#22-linux---other-distro) + - [MacOS installation](#23-macos-installation) + - [Advanced Linux ](#advanced-linux) +- [Windows manual Installation](#windows) + +# Docker + +## Easy installation +Start by downloading Docker for your platform: +- [Mac](https://www.docker.com/products/docker#/mac) +- [Windows](https://www.docker.com/products/docker#/windows) +- [Linux](https://www.docker.com/products/docker#/linux) + +Once you have Docker installed, simply create the config file +(e.g. `config.json`) and then create a Docker image for `freqtrade` +using the Dockerfile in this repo. + +### 1. Prepare the bot +1. Clone the git +```bash +git clone git@github.com:gcarq/freqtrade.git +``` +2. (Optional) Checkout the develop branch +```bash +git checkout develop +``` +3. Go into the new directory +```bash +cd freqtrade +``` +4. Copy `config.sample` to `config.json` +```bash +cp config.json.example config.json +``` +To edit the config please refer to the [Bot Configuration](https://github.com/gcarq/freqtrade/blob/develop/docs/configuration.md) page +5. Create your DB file +```bash +# For Production +touch tradesv3.sqlite + +# For Dry-run +touch tradesv3.dryrun.sqlite +``` + +### 2. Build the docker image +```bash +cd freqtrade +docker build -t freqtrade . +``` + +For security reasons, your configuration file will not be included in the +image, you will need to bind mount it. It is also advised to bind mount +a sqlite database file (see the "5. Run a restartable docker image" +section) to keep it between updates. + +### 3. Verify the docker image +After build process you can verify that the image was created with: +``` +docker images +``` + +### 4. Run the docker image +You can run a one-off container that is immediately deleted upon exiting with +the following command (config.json must be in the current working directory): + +``` +docker run --rm -v `pwd`/config.json:/freqtrade/config.json -it freqtrade +``` + +In this example, the database will be created inside the docker instance +and will be lost when you will refresh your image. + +### 5. Run a restartable docker image +To run a restartable instance in the background (feel free to place your +configuration and database files wherever it feels comfortable on your +filesystem). + +**5.1. Move your config file and database** +```bash +mkdir ~/.freqtrade +mv config.json ~/.freqtrade +mv tradesv3.sqlite ~/.freqtrade +``` + +**5.2. Run the docker image** +```bash +docker run -d \ + --name freqtrade \ + -v ~/.freqtrade/config.json:/freqtrade/config.json \ + -v ~/.freqtrade/tradesv3.sqlite:/freqtrade/tradesv3.sqlite \ + freqtrade +``` +If you are using `dry_run=True` it's not necessary to mount +`tradesv3.sqlite`, but you can mount `tradesv3.dryrun.sqlite` if you +plan to use the dry run mode with the param `--dry-run-db`. + + +### 6. Monitor your Docker instance +You can then use the following commands to monitor and manage your container: + +```bash +docker logs freqtrade +docker logs -f freqtrade +docker restart freqtrade +docker stop freqtrade +docker start freqtrade +``` + +You do not need to rebuild the image for configuration changes, it will +suffice to edit `config.json` and restart the container. + + +# Linux / MacOS +## 1. Requirements +Click each one for install guide: +- [Python 3.6.x](http://docs.python-guide.org/en/latest/starting/installation/), +note the bot was not tested on Python >= 3.7.x +- [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/) (Recommended) +- [TA-Lib](https://mrjbq7.github.io/ta-lib/install.html) + +## 2. First install required packages +This bot require Python 3.6 and TA-LIB + +### 2.1 Linux - Ubuntu 16.04 + +**2.1.1. Install Python 3.6, Git, and wget** +```bash +sudo add-apt-repository ppa:jonathonf/python-3.6 +sudo apt-get update +sudo apt-get install python3.6 python3.6-venv build-essential autoconf libtool pkg-config make wget git +``` + +**2.1.2. Install TA-LIB** +Official webpage: https://mrjbq7.github.io/ta-lib/install.html +``` +wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz +tar xvzf ta-lib-0.4.0-src.tar.gz +cd ta-lib +./configure --prefix=/usr +make +make install +cd .. +rm -rf ./ta-lib* +``` + +**2.1.3. [Optional] Install MongoDB** +Install MongoDB if you plan to optimize your strategy with Hyperopt. + +```bash +sudo apt-get install mongodb-org +``` +Complete tutorial on [Digital Ocean: How to Install MongoDB on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-mongodb-on-ubuntu-16-04) + +### 2.2. Linux - Other distro +If you are on a different Linux OS you maybe have to adapt things like: + +- package manager (for example yum instead of apt-get) +- package names + +### 2.3. MacOS installation + +**2.3.1. Install git and wget** +```bash +brew install wget git +``` + +**2.3.2. Install Python 3.6** +- [Python 3.6 MacOS offical page](https://www.python.org/downloads/mac-osx/) + + +**2.3.3. [Optional] Install MongoDB** +Install MongoDB if you plan to optimize your strategy with Hyperopt. +```bash +curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-3.4.10.tgz +tar -zxvf mongodb-osx-ssl-x86_64-3.4.10.tgz +mkdir -p /env/mongodb +cp -R -n mongodb-osx-x86_64-3.4.10/ /env/mongodb +export PATH=/env/mongodb/bin:$PATH +``` + +## 3. Clone the repo +The following steps are made for Linux/mac environment +1. Clone the git `git clone git@github.com:gcarq/freqtrade.git` +2. (Optional) Checkout the develop branch `git checkout develop` + +## 4. Prepare the bot +```bash +cd freqtrade +cp config.json.example config.json +``` +To edit the config please refer to [Bot Configuration](https://github.com/gcarq/freqtrade/blob/develop/docs/configuration.md) + +## 5. Setup your virtual env +```bash +python3.6 -m venv .env +source .env/bin/activate +pip3.6 install -r requirements.txt +pip3.6 install -e . +pip3.6 install hyperopt +``` + +## 6. Run the bot +If this is the first time you run the bot, ensure you are running it +in Dry-run `"dry_run": true,` otherwise it will start to buy and sell coins. + +```bash +python3.6 ./freqtrade/main.py -c config.json +``` + +### Advanced Linux +**systemd service file** +Copy `./freqtrade.service` to your systemd user directory (usually `~/.config/systemd/user`) +and update `WorkingDirectory` and `ExecStart` to match your setup. +After that you can start the daemon with: +```bash +systemctl --user start freqtrade +``` + +# Windows +We do recommend Windows users to use [Docker](#docker) this will work +much easier and smoother (also safer). + +```cmd +#copy paste config.json to \path\freqtrade-develop\freqtrade +>cd \path\freqtrade-develop +>python -m venv .env +>cd .env\Scripts +>activate.bat +>cd \path\freqtrade-develop +>pip install -r requirements.txt +>pip install -e . +>cd freqtrade +>python main.py +``` +*Thanks [Owdr](https://github.com/Owdr) for the commands. Source: [Issue #222](https://github.com/gcarq/freqtrade/issues/222)* + +## Next step +Now you have an environment ready, the next step is to +[configure your bot](https://github.com/gcarq/freqtrade/blob/develop/docs/configuration.md). diff --git a/docs/pre-requisite.md b/docs/pre-requisite.md new file mode 100644 index 000000000..1bdad4ece --- /dev/null +++ b/docs/pre-requisite.md @@ -0,0 +1,46 @@ +# Pre-requisite +Before running your bot in production you will need to setup few +external API. In production mode, the bot required valid Bittrex API +credentials and a Telegram bot (optional but recommended). + +## Table of Contents +- [Setup your Bittrex account](#setup-your-bittrex-account) +- [Backtesting commands](#setup-your-telegram-bot) + +## Setup your Bittrex account +*To be completed, please feel free to complete this section.* + +## Setup your Telegram bot +The only things you need is a working Telegram bot and its API token. +Below we explain how to create your Telegram Bot, and how to get your +Telegram user id. + +### 1. Create your instagram bot +**1.1. Start a chat with https://telegram.me/BotFather** +**1.2. Send the message** `/newbot` +*BotFather response:* +``` +Alright, a new bot. How are we going to call it? Please choose a name for your bot. +``` +**1.3. Choose the public name of your bot (e.g "`Freqtrade bot`")** +*BotFather response:* +``` +Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot. +``` +**1.4. Choose the name id of your bot (e.g "`My_own_freqtrade_bot`")** +**1.5. Father bot will return you the token (API key)** +Copy it and keep it you will use it for the config parameter `token`. +*BotFather response:* +``` +Done! Congratulations on your new bot. You will find it at t.me/My_own_freqtrade_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this. + +Use this token to access the HTTP API: +521095879:AAEcEZEL7ADJ56FtG_qD0bQJSKETbXCBCi0 + +For a description of the Bot API, see this page: https://core.telegram.org/bots/api +``` + +### 2. Get your user id +**2.1. Talk to https://telegram.me/userinfobot** +**2.2. Get your "Id", you will use it for the config parameter +`chat_id`.** \ No newline at end of file diff --git a/docs/sql_cheatsheet.md b/docs/sql_cheatsheet.md new file mode 100644 index 000000000..1edbcde5b --- /dev/null +++ b/docs/sql_cheatsheet.md @@ -0,0 +1,78 @@ +# SQL Helper +This page constains some help if you want to edit your sqlite db. + +## Install sqlite3 +**Ubuntu/Debian installation** +```bash +sudo apt-get install sqlite3 +``` + +## Open the DB +```bash +sqlite3 +.open +``` + +## Table structure + +### List tables +```bash +.tables +``` + +### Display table structure +```bash +.schema +``` + +### Trade table structure +```sql +CREATE TABLE trades ( + id INTEGER NOT NULL, + exchange VARCHAR NOT NULL, + pair VARCHAR NOT NULL, + is_open BOOLEAN NOT NULL, + fee FLOAT NOT NULL, + open_rate FLOAT, + close_rate FLOAT, + close_profit FLOAT, + stake_amount FLOAT NOT NULL, + amount FLOAT, + open_date DATETIME NOT NULL, + close_date DATETIME, + open_order_id VARCHAR, + PRIMARY KEY (id), + CHECK (is_open IN (0, 1)) +); +``` + +## Get all trades in the table + +```sql +SELECT * FROM trades; +``` + +## Fix trade still open after a /forcesell + +```sql +UPDATE trades +SET is_open=0, close_date=, close_rate=, close_profit=close_rate/open_rate +WHERE id=; +``` + +**Example:** +```sql +UPDATE trades +SET is_open=0, close_date='2017-12-20 03:08:45.103418', close_rate=0.19638016, close_profit=0.0496 +WHERE id=31; +``` + + +## Fix wrong fees in the table +If your DB was created before +[PR#200](https://github.com/gcarq/freqtrade/pull/200) was merged +(before 12/23/17). + +```sql +UPDATE trades SET fee=0.0025 WHERE fee=0.005; +``` \ No newline at end of file diff --git a/docs/telegram-usage.md b/docs/telegram-usage.md new file mode 100644 index 000000000..904723b30 --- /dev/null +++ b/docs/telegram-usage.md @@ -0,0 +1,129 @@ +# Telegram usage + +This page explains how to command your bot with Telegram. + +## Pre-requisite +To control your bot with Telegram, you need first to +[set up a Telegram bot](https://github.com/gcarq/freqtrade/blob/develop/docs/pre-requisite.md) +and add your Telegram API keys into your config file. + +## Telegram commands +Per default, the Telegram bot shows predefined commands. Some commands +are only available by sending them to the bot. The table below list the +official commands. You can ask at any moment for help with `/help`. + +| Command | Default | Description | +|----------|---------|-------------| +| `/start` | | Starts the trader +| `/stop` | | Starts the trader +| `/status` | | Lists all open trades +| `/status table` | | List all open trades in a table format +| `/count` | | Displays number of trades used and available +| `/profit` | | Display a summary of your profit/loss from close trades and some stats about your performance +| `/forcesell ` | | Instantly sells the given trade (Ignoring `minimum_roi`). +| `/forcesell all` | | Instantly sells all open trades (Ignoring `minimum_roi`). +| `/performance` | | Show performance of each finished trade grouped by pair +| `/balance` | | Show account balance per currency +| `/daily ` | 7 | Shows profit or loss per day, over the last n days +| `/help` | | Show help message +| `/version` | | Show version + +## Telegram commands in action +Below, example of Telegram message you will receive for each command. + +### /start +> **Status:** `running` + +### /stop +> `Stopping trader ...` +> **Status:** `stopped` + +## /status +For each open trade, the bot will send you the following message. + +> **Trade ID:** `123` +> **Current Pair:** BTC_CVC +> **Open Since:** `1 days ago` +> **Amount:** `26.64180098` +> **Open Rate:** `0.00007489` +> **Close Rate:** `None` +> **Current Rate:** `0.00007489` +> **Close Profit:** `None` +> **Current Profit:** `12.95%` +> **Open Order:** `None` + +## /status table +Return the status of all open trades in a table format. +``` + ID Pair Since Profit +---- -------- ------- -------- + 67 BTC_SC 1 d 13.33% + 123 BTC_CVC 1 h 12.95% +``` + +## /count +Return the number of trades used and available. +``` +current max +--------- ----- + 2 10 +``` + +## /profit +Return a summary of your profit/loss and performance. + +> **ROI:** Close trades +> ∙ `0.00485701 BTC (258.45%)` +> ∙ `62.968 USD` +> **ROI:** All trades +> ∙ `0.00255280 BTC (143.43%)` +> ∙ `33.095 EUR` +> +> **Total Trade Count:** `138` +> **First Trade opened:** `3 days ago` +> **Latest Trade opened:** `2 minutes ago` +> **Avg. Duration:** `2:33:45` +> **Best Performing:** `BTC_PAY: 50.23%` + +## /forcesell + +> **BITTREX:** Selling BTC/LTC with limit `0.01650000 (profit: ~-4.07%, -0.00008168)` + +## /performance +Return the performance of each crypto-currency the bot has sold. +> Performance: +> 1. `BTC_RCN 57.77%` +> 2. `BTC_PAY 56.91%` +> 3. `BTC_VIB 47.07%` +> 4. `BTC_SALT 30.24%` +> 5. `BTC_STORJ 27.24%` +> ... + +## /balance +Return the balance of all crypto-currency your have on the exchange. + +> **Currency:** BTC +> **Available:** 3.05890234 +> **Balance:** 3.05890234 +> **Pending:** 0.0 + +> **Currency:** CVC +> **Available:** 86.64180098 +> **Balance:** 86.64180098 +> **Pending:** 0.0 + +## /daily +Per default `/daily` will return the 7 last days. +The example below if for `/daily 3`: + +> **Daily Profit over the last 3 days:** +``` +Day Profit BTC Profit USD +---------- -------------- ------------ +2018-01-03 0.00224175 BTC 29,142 USD +2018-01-02 0.00033131 BTC 4,307 USD +2018-01-01 0.00269130 BTC 34.986 USD +``` + +## /version +> **Version:** `0.14.3` \ No newline at end of file From f37c495b90a54fb56e1199968ae622d3b228f93b Mon Sep 17 00:00:00 2001 From: Gerald Lonlas Date: Tue, 2 Jan 2018 18:50:12 -0800 Subject: [PATCH 2/4] Update the documentation from the PR review --- README.md | 22 ++++++++++++++++++---- docs/bot-optimization.md | 8 ++++---- docs/installation.md | 13 ++++--------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 51e86b83d..7899d24bc 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,10 @@ support multi exchanges and be controlled via Telegram. ## Disclaimer This software is for educational purposes only. Do not risk money which -you are afraid to lose. Always start by running a trading bot in Dry-run and do not engage money +you are afraid to lose. USE THE SOFTWARE AT YOUR OWN RISK. THE AUTHORS +AND ALL AFFILIATES ASSUME NO RESPONSIBILITY FOR YOUR TRADING RESULTS. + +Always start by running a trading bot in Dry-run and do not engage money before you understand how it works and what profit/loss you should expect. @@ -31,7 +34,9 @@ hesitate to read the source code and understand the mechanism of this bot. - [Basic Usage](#basic-usage) - [Bot commands](#bot-commands) - [Telegram RPC commands](#telegram-rpc-commands) -- [Min hardware required](#min-hardware-required) +- [Requirements](#requirements) + - [Min hardware required](#min-hardware-required) + - [Software requirements](#software-requirements) ## Branches The project is currently setup in two main branches: @@ -41,7 +46,7 @@ breaking changes. 'should' be stable on this branch, and is generally well tested. ## Features -- [x] **Based on Python**: For botting on any operating system - +- [x] **Based on Python 3.6+**: For botting on any operating system - Windows, macOS and Linux - [x] **Persistence**: Persistence is achieved through sqlite - [x] **Dry-run**: Run the bot without playing money. @@ -174,7 +179,16 @@ bot. More details on our - `/help`: Show help message - `/version`: Show version +## Requirements -## Min hardware required +### Min hardware required To run this bot we recommend you a cloud instance with a minimum of: * Minimal (advised) system requirements: 2GB RAM, 1GB disk space, 2vCPU + +### Software requirements +- [Python 3.6.x](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://mrjbq7.github.io/ta-lib/install.html) +- [virtualenv](https://virtualenv.pypa.io/en/stable/installation/) (Recommended) +- [Docker](https://www.docker.com/products/docker) (Recommended) diff --git a/docs/bot-optimization.md b/docs/bot-optimization.md index 88ba672f8..ea4ea9ae4 100644 --- a/docs/bot-optimization.md +++ b/docs/bot-optimization.md @@ -128,22 +128,22 @@ automatically. Testdata files will not be updated until your specify it. ### Run a backtesting against the currencies listed in your config file **With 5 min tickers (Per default)** ```bash -python3 ./freqtrade/main.py -c config.json backtesting --realistic-simulation +python3 ./freqtrade/main.py backtesting --realistic-simulation ``` **With 1 min tickers** ```bash -python3 ./freqtrade/main.py -c config.json backtesting --realistic-simulation --ticker-interval 1 +python3 ./freqtrade/main.py backtesting --realistic-simulation --ticker-interval 1 ``` **Reload your testdata files** ```bash -python3 ./freqtrade/main.py -c config.json backtesting --realistic-simulation --refresh-pairs-cached +python3 ./freqtrade/main.py backtesting --realistic-simulation --refresh-pairs-cached ``` **With live data (do not alter your testdata files)** ```bash -python3 ./freqtrade/main.py -c config.json backtesting --realistic-simulation --live +python3 ./freqtrade/main.py backtesting --realistic-simulation --live ``` ## Find optimal parameters with Hyperopt diff --git a/docs/installation.md b/docs/installation.md index a9f024c60..9ea6265ba 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -43,7 +43,7 @@ cd freqtrade cp config.json.example config.json ``` To edit the config please refer to the [Bot Configuration](https://github.com/gcarq/freqtrade/blob/develop/docs/configuration.md) page -5. Create your DB file +5. Create your DB file (Optional, the bot will create it if it is missing) ```bash # For Production touch tradesv3.sqlite @@ -171,16 +171,12 @@ If you are on a different Linux OS you maybe have to adapt things like: ### 2.3. MacOS installation -**2.3.1. Install git and wget** +**2.3.1. Install Python 3.6, git and wget** ```bash -brew install wget git +brew install python3 git wget ``` -**2.3.2. Install Python 3.6** -- [Python 3.6 MacOS offical page](https://www.python.org/downloads/mac-osx/) - - -**2.3.3. [Optional] Install MongoDB** +**2.3.2. [Optional] Install MongoDB** Install MongoDB if you plan to optimize your strategy with Hyperopt. ```bash curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-3.4.10.tgz @@ -208,7 +204,6 @@ python3.6 -m venv .env source .env/bin/activate pip3.6 install -r requirements.txt pip3.6 install -e . -pip3.6 install hyperopt ``` ## 6. Run the bot From cb7c36a512d0c75b431eb83831386cb655575c79 Mon Sep 17 00:00:00 2001 From: Gerald Lonlas Date: Tue, 2 Jan 2018 22:43:00 -0800 Subject: [PATCH 3/4] Add Backtesting and Hyperopt documentation --- docs/backtesting.md | 104 +++++++++++++++ docs/bot-optimization.md | 48 +------ docs/hyperopt.md | 269 +++++++++++++++++++++++++++++++++++++++ docs/index.md | 5 +- 4 files changed, 379 insertions(+), 47 deletions(-) create mode 100644 docs/backtesting.md create mode 100644 docs/hyperopt.md diff --git a/docs/backtesting.md b/docs/backtesting.md new file mode 100644 index 000000000..d7073365f --- /dev/null +++ b/docs/backtesting.md @@ -0,0 +1,104 @@ +# Backtesting +This page explains how to validate your strategy performance by using +Backtesting. + +## Table of Contents +- [Test your strategy with Backtesting](#test-your-strategy-with-backtesting) +- [Understand the backtesting result](#understand-the-backtesting-result) + +## Test your strategy with Backtesting +Now you have good Buy and Sell strategies, you want to test it against +real data. This is what we call +[backtesting](https://en.wikipedia.org/wiki/Backtesting). + + +Backtesting will use the crypto-currencies (pair) from your config file +and load static tickers located in +[/freqtrade/tests/testdata](https://github.com/gcarq/freqtrade/tree/develop/freqtrade/tests/testdata). +If the 5 min and 1 min ticker for the crypto-currencies to test is not +already in the `testdata` folder, backtesting will download them +automatically. Testdata files will not be updated until you specify it. + +The result of backtesting will confirm you if your bot as more chance to +make a profit than a loss. + + +The backtesting is very easy with freqtrade. + +### Run a backtesting against the currencies listed in your config file +**With 5 min tickers (Per default)** +```bash +python3 ./freqtrade/main.py backtesting --realistic-simulation +``` + +**With 1 min tickers** +```bash +python3 ./freqtrade/main.py backtesting --realistic-simulation --ticker-interval 1 +``` + +**Reload your testdata files** +```bash +python3 ./freqtrade/main.py backtesting --realistic-simulation --refresh-pairs-cached +``` + +**With live data (do not alter your testdata files)** +```bash +python3 ./freqtrade/main.py backtesting --realistic-simulation --live +``` + +For help about backtesting usage, please refer to +[Backtesting commands](#backtesting-commands). + +## Understand the backtesting result +The most important in the backtesting is to understand the result. + +A backtesting result will look like that: +``` +====================== BACKTESTING REPORT ================================ +pair buy count avg profit % total profit BTC avg duration +-------- ----------- -------------- ------------------ -------------- +BTC_ETH 56 -0.67 -0.00075455 62.3 +BTC_LTC 38 -0.48 -0.00036315 57.9 +BTC_ETC 42 -1.15 -0.00096469 67.0 +BTC_DASH 72 -0.62 -0.00089368 39.9 +BTC_ZEC 45 -0.46 -0.00041387 63.2 +BTC_XLM 24 -0.88 -0.00041846 47.7 +BTC_NXT 24 0.68 0.00031833 40.2 +BTC_POWR 35 0.98 0.00064887 45.3 +BTC_ADA 43 -0.39 -0.00032292 55.0 +BTC_XMR 40 -0.40 -0.00032181 47.4 +TOTAL 419 -0.41 -0.00348593 52.9 +``` + +The last line will give you the overall performance of your strategy, +here: +``` +TOTAL 419 -0.41 -0.00348593 52.9 +``` + +We understand the bot has made `419` trades for an average duration of +`52.9` min, with a performance of `-0.41%` (loss), that means it has +lost a total of `-0.00348593 BTC`. + +As you will see your strategy performance will be influenced by your buy +strategy, your sell strategy, and also by the `minimal_roi` and +`stop_loss` you have set. + +As for an example if your minimal_roi is only `"0": 0.01`. You cannot +expect the bot to make more profit than 1% (because it will sell every +time a trade will reach 1%). +```json +"minimal_roi": { + "0": 0.01 +}, +``` + +On the other hand, if you set a too high `minimal_roi` like `"0": 0.55` +(55%), there is a lot of chance that the bot will never reach this +profit. Hence, keep in mind that your performance is a mix of your +strategies, your configuration, and the crypto-currency you have set up. + +## Next step +Great, your strategy is profitable. What if the bot can give your the +optimal parameters to use for your strategy? +Your next step is to learn [how to find optimal parameters with Hyperopt](https://github.com/gcarq/freqtrade/blob/develop/docs/hyperopt.md) \ No newline at end of file diff --git a/docs/bot-optimization.md b/docs/bot-optimization.md index ea4ea9ae4..a49ffdc26 100644 --- a/docs/bot-optimization.md +++ b/docs/bot-optimization.md @@ -1,14 +1,10 @@ # Bot Optimization -This page explains where to customize your strategies, validate their -performance by using Backtesting, and tuning them by finding the optimal -parameters with Hyperopt. +This page explains where to customize your strategies, and add new +indicators. ## Table of Contents - [Change your strategy](#change-your-strategy) - [Add more Indicator](#add-more-indicator) -- [Test your strategy with Backtesting](#test-your-strategy-with-backtesting) -- [Find optimal parameters with Hyperopt](#find-optimal-parameters-with-hyperopt) -- [Show your buy strategy on a graph](#show-your-buy-strategy-on-a-graph) ## Change your strategy The bot is using buy and sell strategies to buy and sell your trades. @@ -115,43 +111,7 @@ def populate_indicators(dataframe: DataFrame) -> DataFrame: return dataframe ``` -## Test your strategy with Backtesting -Now you have good Buy and Sell strategies, you want to test it against -real data. This is what we call [backtesting](https://en.wikipedia.org/wiki/Backtesting). - -Backtesting will use the crypto-currencies (pair) tickers located in -[/freqtrade/tests/testdata](https://github.com/gcarq/freqtrade/tree/develop/freqtrade/tests/testdata). -If the 5 min and 1 min ticker for the crypto-currencies to test is not -already in the `testdata` folder, backtesting will download them -automatically. Testdata files will not be updated until your specify it. - -### Run a backtesting against the currencies listed in your config file -**With 5 min tickers (Per default)** -```bash -python3 ./freqtrade/main.py backtesting --realistic-simulation -``` - -**With 1 min tickers** -```bash -python3 ./freqtrade/main.py backtesting --realistic-simulation --ticker-interval 1 -``` - -**Reload your testdata files** -```bash -python3 ./freqtrade/main.py backtesting --realistic-simulation --refresh-pairs-cached -``` - -**With live data (do not alter your testdata files)** -```bash -python3 ./freqtrade/main.py backtesting --realistic-simulation --live -``` - -## Find optimal parameters with Hyperopt -*To be completed, please feel free to complete this section.* - -## Show your buy strategy on a graph -*To be completed, please feel free to complete this section.* ## Next step -Now you have a perfect bot and want to control it from Telegram. Your -next step is to learn [Telegram usage](https://github.com/gcarq/freqtrade/blob/develop/docs/telegram-usage.md). \ No newline at end of file +Now you have a perfect strategy you probably want to backtesting it. +Your next step is to learn [How to use ](https://github.com/gcarq/freqtrade/blob/develop/docs/backtesting.md). diff --git a/docs/hyperopt.md b/docs/hyperopt.md new file mode 100644 index 000000000..212a3f56c --- /dev/null +++ b/docs/hyperopt.md @@ -0,0 +1,269 @@ +# Hyperopt +This page explains how to tune your strategy by finding the optimal +parameters with Hyperopt. + +## Table of Contents +- [Prepare your Hyperopt](#prepare-hyperopt) + - [1. Configure your Guards and Triggers](#1-configure-your-guards-and-triggers) + - [2. Update the hyperopt config file](#2-update-the-hyperopt-config-file) +- [Advanced Hyperopt notions](#advanced-notions) + - [Understand the Guards and Triggers](#understand-the-guards-and-triggers) +- [Execute Hyperopt](#execute-hyperopt) + - [Hyperopt with MongoDB](#hyperopt-with-mongoDB) +- [Understand the hyperopts result](#understand-the-backtesting-result) + +## Prepare Hyperopt +Before we start digging in Hyperopt, we recommend you to take a look at +out Hyperopt file +[freqtrade/optimize/hyperopt.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py) + +### 1. Configure your Guards and Triggers +There are two places you need to change to add a new buy strategy for +testing: +- Inside the [populate_buy_trend()](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L167-L207). +- Inside the [SPACE dict](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L47-L94). + +There you have two different type of indicators: 1. `guards` and 2. +`triggers`. +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 buy in specific moment, like +"buy when EMA5 crosses over EMA10" or buy when close price touches lower +bollinger band. + +HyperOpt will, for each eval round, pick just ONE trigger, and possibly +multiple guards. So that the constructed strategy will be something like +"*buy exactly when close price touches lower bollinger band, BUT only if +ADX > 10*". + + +If you have updated the buy strategy, means change the content of +`populate_buy_trend()` function you have to update the `guards` and +`triggers` hyperopts must used. + +As for an example if your `populate_buy_trend()` function is: +```python +def populate_buy_trend(dataframe: DataFrame) -> DataFrame: + dataframe.loc[ + (dataframe['rsi'] < 35) & + (dataframe['adx'] > 65), + 'buy'] = 1 + + return dataframe +``` + +Your hyperopt file must contains `guards` to find the right value for +`(dataframe['adx'] > 65)` & and `(dataframe['plus_di'] > 0.5)`. That +means you will need to enable/disable triggers. + +In our case the `SPACE` and `populate_buy_trend` in hyperopt.py file +will be look like: +```python +SPACE = { + 'rsi': hp.choice('rsi', [ + {'enabled': False}, + {'enabled': True, 'value': hp.quniform('rsi-value', 20, 40, 1)} + ]), + 'adx': hp.choice('adx', [ + {'enabled': False}, + {'enabled': True, 'value': hp.quniform('adx-value', 15, 50, 1)} + ]), + 'trigger': hp.choice('trigger', [ + {'type': 'lower_bb'}, + {'type': 'faststoch10'}, + {'type': 'ao_cross_zero'}, + {'type': 'ema5_cross_ema10'}, + {'type': 'macd_cross_signal'}, + {'type': 'sar_reversal'}, + {'type': 'stochf_cross'}, + {'type': 'ht_sine'}, + ]), +} + +... + +def populate_buy_trend(dataframe: DataFrame) -> DataFrame: + conditions = [] + # GUARDS AND TRENDS + if params['adx']['enabled']: + conditions.append(dataframe['adx'] > params['adx']['value']) + if params['rsi']['enabled']: + conditions.append(dataframe['rsi'] < params['rsi']['value']) + + # TRIGGERS + triggers = { + 'lower_bb': dataframe['tema'] <= dataframe['blower'], + 'faststoch10': (crossed_above(dataframe['fastd'], 10.0)), + 'ao_cross_zero': (crossed_above(dataframe['ao'], 0.0)), + 'ema5_cross_ema10': (crossed_above(dataframe['ema5'], dataframe['ema10'])), + 'macd_cross_signal': (crossed_above(dataframe['macd'], dataframe['macdsignal'])), + 'sar_reversal': (crossed_above(dataframe['close'], dataframe['sar'])), + 'stochf_cross': (crossed_above(dataframe['fastk'], dataframe['fastd'])), + 'ht_sine': (crossed_above(dataframe['htleadsine'], dataframe['htsine'])), + } + ... +``` + + +### 2. Update the hyperopt config file +Hyperopt is using a dedicated config file. At this moment hyperopt +cannot use your config file. It is also made on purpose to allow you +testing your strategy with different configurations. + +The Hyperopt configuration is located in +[freqtrade/optimize/hyperopt_conf.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/optimize/hyperopt_conf.py). + + +## Advanced notions +### Understand the Guards and Triggers +When you need to add the new guards and triggers to be hyperopt +parameters, you do this by adding them into the [SPACE dict](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L47-L94). + +If it's a trigger, you add one line to the 'trigger' choice group and that's it. + +If it's a guard, you will add a line like this: +``` +'rsi': hp.choice('rsi', [ + {'enabled': False}, + {'enabled': True, 'value': hp.quniform('rsi-value', 20, 40, 1)} +]), +``` +This says, "*one of guards is RSI, it can have two values, enabled or +disabled. If it is enabled, try different values for it between 20 and 40*". + +So, the part of the strategy builder using the above setting looks like +this: +``` +if params['rsi']['enabled']: + conditions.append(dataframe['rsi'] < params['rsi']['value']) +``` +It checks if Hyperopt wants the RSI guard to be enabled for this +round `params['rsi']['enabled']` and if it is, then it will add a +condition that says RSI must be < than the value hyperopt picked +for this evaluation, that is given in the `params['rsi']['value']`. + +That's it. Now you can add new parts of strategies to Hyperopt and it +will try all the combinations with all different values in the search +for best working algo. + + +### Add a new Indicators +If you want to test an indicator that isn't used by the bot currently, +you need to add it to +[freqtrade/analyze.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/analyze.py#L40-L70) +inside the `populate_indicators` function. + +## Execute Hyperopt +Once you have updated your hyperopt configuration you can run it. +Because hyperopt tries a lot of combination to find the best parameters +it will take time you will have the result (more than 30 mins). + +We strongly recommend to use `screen` to prevent any connection loss. +```bash +python3 ./freqtrade/main.py -c config.json hyperopt +``` + +### Hyperopt with MongoDB +Hyperopt with MongoDB, is like Hyperopt under steroids. As you saw by +executing the previous command is the execution takes a long time. +To accelerate it you can use hyperopt with MongoDB. + +To run hyperopt with MongoDb you will need 3 terminals. + +**Terminal 1: Start MongoDB** +```bash +cd +source .env/bin/activate +python3 scripts/start-mongodb.py +``` + +**Terminal 2: Start Hyperopt worker** +```bash +cd +source .env/bin/activate +python3 scripts/start-hyperopt-worker.py +``` + +**Terminal 3: Start Hyperopt with MongoDB** +```bash +cd +source .env/bin/activate +python3 ./freqtrade/main.py -c config.json hyperopt --use-mongodb +``` + +**Re-run an Hyperopt** +To re-run Hyperopt you have to delete the existing MongoDB table. +```bash +cd +rm -rf .hyperopt/mongodb/ +``` + +## Understand the hyperopts result +Once Hyperopt is completed you can use the result to adding new buy +signal. Given following result from hyperopt: +``` +Best parameters: +{ + "adx": 1, + "adx-value": 15.0, + "fastd": 1, + "fastd-value": 40.0, + "green_candle": 1, + "mfi": 0, + "over_sar": 0, + "rsi": 1, + "rsi-value": 37.0, + "trigger": 0, + "uptrend_long_ema": 1, + "uptrend_short_ema": 0, + "uptrend_sma": 0 +} + +Best Result: + 2197 trades. Avg profit 1.84%. Total profit 0.79367541 BTC. Avg duration 241.0 mins. +``` + +You should understand this result like: +- You should **consider** the guard "adx" (`"adx": 1,` = `adx` is true) +and the best value is `15.0` (`"adx-value": 15.0,`) +- You should **consider** the guard "fastd" (`"fastd": 1,` = `fastd` +is true) and the best value is `40.0` (`"fastd-value": 40.0,`) +- You should **consider** to enable the guard "green_candle" +(`"green_candle": 1,` = `candle` is true) but this guards as no +customizable value. +- You should **ignore** the guard "mfi" (`"mfi": 0,` = `mfi` is false) +- and so on... + + +You have to look from +[freqtrade/optimize/hyperopt.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L170-L200) +what those values match to. + +So for example you had `adx-value: 15.0` (and `adx: 1` was true) so we +would look at `adx`-block from +[freqtrade/optimize/hyperopt.py](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L178-L179). +That translates to the following code block to +[analyze.populate_buy_trend()](https://github.com/gcarq/freqtrade/blob/develop/freqtrade/analyze.py#L73) +``` +(dataframe['adx'] > 15.0) +``` + +So translating your whole hyperopt result to as the new buy-signal +would be the following: +``` +def populate_buy_trend(dataframe: DataFrame) -> DataFrame: + dataframe.loc[ + ( + (dataframe['adx'] > 15.0) & # adx-value + (dataframe['fastd'] < 40.0) & # fastd-value + (dataframe['close'] > dataframe['open']) & # green_candle + (dataframe['rsi'] < 37.0) & # rsi-value + (dataframe['ema50'] > dataframe['ema100']) # uptrend_long_ema + ), + 'buy'] = 1 + return dataframe +``` + +## Next step +Now you have a perfect bot and want to control it from Telegram. Your +next step is to learn the [Telegram usage](https://github.com/gcarq/freqtrade/blob/develop/docs/telegram-usage.md). diff --git a/docs/index.md b/docs/index.md index 5df745ae8..ed940d132 100644 --- a/docs/index.md +++ b/docs/index.md @@ -22,9 +22,8 @@ Pull-request. Do not hesitate to reach us on - [Bot Optimization](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md) - [Change your strategy](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#change-your-strategy) - [Add more Indicator](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#add-more-indicator) - - [Test your strategy with Backtesting](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#test-your-strategy-with-backtesting) - - [Find optimal parameters with Hyperopt](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#find-optimal-parameters-with-hyperopt) - - [Show your buy strategy on a graph](https://github.com/gcarq/freqtrade/blob/develop/docs/bot-optimization.md#show-your-buy-strategy-on-a-graph) + - [Test your strategy with Backtesting](https://github.com/gcarq/freqtrade/blob/develop/docs/backtesting.md) + - [Find optimal parameters with Hyperopt](https://github.com/gcarq/freqtrade/blob/develop/docs/hyperopt.md) - [Control the bot with telegram](https://github.com/gcarq/freqtrade/blob/develop/docs/telegram-usage.md) - [Contribute to the project](https://github.com/gcarq/freqtrade/blob/develop/CONTRIBUTING.md) - [How to contribute](https://github.com/gcarq/freqtrade/blob/develop/CONTRIBUTING.md) From 70d1511f73636b230e1628ea85d41b0e7ea2f09b Mon Sep 17 00:00:00 2001 From: Gerald Lonlas Date: Tue, 2 Jan 2018 23:34:26 -0800 Subject: [PATCH 4/4] Update ISSUE_TEMPLATE.md and PULL_REQUEST_TEMPLATE.md --- .github/ISSUE_TEMPLATE.md | 30 ++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 15 +++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index e69de29bb..2cbbc59cb 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,30 @@ +## Step 1: Have you search for this issue before posting it? + +If you have discovered a bug in the bot, please [search our issue tracker](https://github.com/gcarq/freqtrade/issues?q=is%3Aissue). +If it hasn't been reported, please create a new issue. + +## Step 2: Describe your environment + + * Python Version: _____ (`python -V`) + * Branch: Master | Develop + * Last Commit ID: _____ (`git log --format="%H" -n 1`) + +## Step 3: Describe the problem: +*Explain the problem you have encountered* + +### Steps to reproduce: + + 1. _____ + 2. _____ + 3. _____ + +### Observed Results: + + * What happened? + * What did you expect to happen? + +### Relevant code exceptions or logs: + + ``` + // paste your log here + ``` diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e69de29bb..ae79dd8f0 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,15 @@ +Thank you for sending your pull request. But first, have you included +unit tests, and is your code PEP8 conformant? [More details](https://github.com/gcarq/freqtrade/blob/develop/CONTRIBUTING.md) + +## Summary +Explain in one sentence the goal of this PR + +Solve the issue: #___ + +## Quick changelog + +- +- + +## What's new? +*Explain in details what this PR solve or improve. You can include visuals.*