Add a strategy
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user