From 113b6d8055310097c1328556295c53ec001e147a Mon Sep 17 00:00:00 2001 From: Gerald Lonlas Date: Tue, 29 May 2018 23:43:04 -0700 Subject: [PATCH] Add a strategy --- README.md | 11 +-- user_data/strategies/strategy005.py | 125 ++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 user_data/strategies/strategy005.py diff --git a/README.md b/README.md index dbce55b..2eb43cf 100644 --- a/README.md +++ b/README.md @@ -34,16 +34,17 @@ bot. - [Offer me a coffee](#offer-me-a-coffee) ## Free trading strategies -Value below are result from backtesting from 2017-12-19 to 2017-01-20 and +Value below are result from backtesting from 2018-01-10 to 2018-01-30 and `experimental.sell_profit_only` enabled. More detail on each strategy page. | Strategy | Buy count | AVG profit % | Total profit | AVG duration | |-----------|-----------|--------------|--------------|--------------| -| [Strategy 001](https://github.com/glonlas/freqtrade-strategies/issues/1) | 287 | 2.39 | 0.02763202 | 1306.3 | -| [Strategy 002](https://github.com/glonlas/freqtrade-strategies/issues/2) | 158 | 2.67 | 0.01686667 | 387.9 | -| [Strategy 003](https://github.com/glonlas/freqtrade-strategies/issues/3) | 147 | 2.21 | 0.01277113 | 694.9 | -| [Strategy 004](https://github.com/glonlas/freqtrade-strategies/issues/4) | 232 | 2.11 | 0.01977185 | 455.3 | +| [Strategy 001](https://github.com/glonlas/freqtrade-strategies/issues/1) | 55 | 0.05 | 0.00012102 | 476.1 | +| [Strategy 002](https://github.com/glonlas/freqtrade-strategies/issues/2) | 9 | 3.21 | 0.00114807 | 189.4 | +| [Strategy 003](https://github.com/glonlas/freqtrade-strategies/issues/3) | 14 | 1.47 | 0.00081740 | 227.5 | +| [Strategy 004](https://github.com/glonlas/freqtrade-strategies/issues/4) | 37 | 0.69 | 0.00102128 | 367.3 | +| [Strategy 005](https://github.com/glonlas/freqtrade-strategies/issues/11) | 180 | 1.16 | 0.00827589 | 156.2 | Strategies from this repo are free to use and feel free to update them. diff --git a/user_data/strategies/strategy005.py b/user_data/strategies/strategy005.py new file mode 100644 index 0000000..9fbff2c --- /dev/null +++ b/user_data/strategies/strategy005.py @@ -0,0 +1,125 @@ + +# --- Do not remove these libs --- +from freqtrade.strategy.interface import IStrategy +from typing import Dict, List +from hyperopt import hp +from functools import reduce +from pandas import DataFrame +# -------------------------------- + +import talib.abstract as ta +import freqtrade.vendor.qtpylib.indicators as qtpylib +import numpy # noqa + + +class Strategy005(IStrategy): + """ + Strategy 005 + author@: Gerald Lonlas + github@: https://github.com/glonlas/freqtrade-strategies + + How to use it? + > python3 ./freqtrade/main.py -s Strategy005 + """ + + # Minimal ROI designed for the strategy. + # This attribute will be overridden if the config file contains "minimal_roi" + minimal_roi = { + "1440": 0.01, + "80": 0.02, + "40": 0.03, + "20": 0.04, + "0": 0.05 + } + + # Optimal stoploss designed for the strategy + # This attribute will be overridden if the config file contains "stoploss" + stoploss = -0.5 + + # Optimal ticker interval for the strategy + ticker_interval = '5m' + + def populate_indicators(self, dataframe: DataFrame) -> DataFrame: + """ + Adds several different TA indicators to the given DataFrame + + Performance Note: For the best performance be frugal on the number of indicators + you are using. Let uncomment only the indicator you are using in your strategies + or your hyperopt configuration, otherwise you will waste your memory and CPU usage. + """ + + # MACD + macd = ta.MACD(dataframe) + dataframe['macd'] = macd['macd'] + dataframe['macdsignal'] = macd['macdsignal'] + + # Minus Directional Indicator / Movement + dataframe['minus_di'] = ta.MINUS_DI(dataframe) + + # RSI + dataframe['rsi'] = ta.RSI(dataframe) + + # Inverse Fisher transform on RSI, values [-1.0, 1.0] (https://goo.gl/2JGGoy) + rsi = 0.1 * (dataframe['rsi'] - 50) + dataframe['fisher_rsi'] = (numpy.exp(2 * rsi) - 1) / (numpy.exp(2 * rsi) + 1) + # Inverse Fisher transform on RSI normalized, value [0.0, 100.0] (https://goo.gl/2JGGoy) + dataframe['fisher_rsi_norma'] = 50 * (dataframe['fisher_rsi'] + 1) + + # Stoch fast + stoch_fast = ta.STOCHF(dataframe) + dataframe['fastd'] = stoch_fast['fastd'] + dataframe['fastk'] = stoch_fast['fastk'] + + # Overlap Studies + # ------------------------------------ + + # SAR Parabol + dataframe['sar'] = ta.SAR(dataframe) + + # SMA - Simple Moving Average + dataframe['sma'] = ta.SMA(dataframe, timeperiod=40) + + return dataframe + + def populate_buy_trend(self, 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[ + # Prod + ( + (dataframe['close'] > 0.00000200) & + (dataframe['volume'] > dataframe['volume'].mean() * 4) & + (dataframe['close'] < dataframe['sma']) & + (dataframe['fastd'] > dataframe['fastk']) & + (dataframe['rsi'] > 0) & + (dataframe['fastd'] > 0) & + # (dataframe['fisher_rsi'] < -0.94) + (dataframe['fisher_rsi_norma'] < 38.900000000000006) + ), + 'buy'] = 1 + + return dataframe + + def populate_sell_trend(self, 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[ + # Prod + ( + (qtpylib.crossed_above(dataframe['rsi'], 50)) & + (dataframe['macd'] < 0) & + (dataframe['minus_di'] > 0) + ) | + ( + (dataframe['sar'] > dataframe['close']) & + (dataframe['fisher_rsi'] > 0.3) + ), + + 'sell'] = 1 + return dataframe