Created
May 26, 2021 14:56
-
-
Save Ammly/5d8bf19f88a314c95c98efbbe288b22f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement | |
# isort: skip_file | |
# --- Do not remove these libs --- | |
import numpy as np # noqa | |
import pandas as pd # noqa | |
from pandas import DataFrame | |
from freqtrade.strategy.interface import IStrategy | |
# -------------------------------- | |
# Add your lib to import here | |
import talib.abstract as ta | |
import freqtrade.vendor.qtpylib.indicators as qtpylib | |
# Based on the Hyperopt results when running against BBRISHyperopt | |
class BBRSIOptimizedStrategy(IStrategy): | |
# Strategy interface version - allow new iterations of the strategy interface. | |
# Check the documentation or the Sample strategy to get the latest version. | |
INTERFACE_VERSION = 2 | |
# Minimal ROI designed for the strategy. | |
# This attribute will be overridden if the config file contains "minimal_roi". | |
minimal_roi = { | |
"0": 0.231, | |
"35": 0.046, | |
"83": 0.033, | |
"200": 0 | |
} | |
# Optimal stoploss designed for the strategy. | |
# This attribute will be overridden if the config file contains "stoploss". | |
stoploss = -0.345 | |
# Trailing stoploss | |
# trailing_stop = False | |
# trailing_only_offset_is_reached = False | |
# trailing_stop_positive = 0.01 | |
# trailing_stop_positive_offset = 0.0 # Disabled / not configured | |
trailing_stop = True | |
trailing_stop_positive = 0.142 | |
trailing_stop_positive_offset = 0.23 | |
trailing_only_offset_is_reached = True | |
# Optimal ticker interval for the strategy. | |
timeframe = '5m' | |
# Run "populate_indicators()" only for new candle. | |
process_only_new_candles = False | |
# These values can be overridden in the "ask_strategy" section in the config. | |
use_sell_signal = True | |
sell_profit_only = False | |
ignore_roi_if_buy_signal = False | |
# Number of candles the strategy requires before producing valid signals | |
startup_candle_count: int = 30 | |
# Optional order type mapping. | |
order_types = { | |
'buy': 'limit', | |
'sell': 'limit', | |
'stoploss': 'market', | |
'stoploss_on_exchange': False | |
} | |
# Optional order time in force. | |
order_time_in_force = { | |
'buy': 'gtc', | |
'sell': 'gtc' | |
} | |
plot_config = { | |
'main_plot': { | |
'bb_upperband': {'color': 'green'}, | |
'bb_midband': {'color': 'orange'}, | |
'bb_lowerband': {'color': 'red'}, | |
}, | |
'subplots': { | |
"RSI": { | |
'rsi': {'color': 'yellow'}, | |
} | |
} | |
} | |
def informative_pairs(self): | |
""" | |
Define additional, informative pair/interval combinations to be cached from the exchange. | |
These pair/interval combinations are non-tradeable, unless they are part | |
of the whitelist as well. | |
For more information, please consult the documentation | |
:return: List of tuples in the format (pair, interval) | |
Sample: return [("ETH/USDT", "5m"), | |
("BTC/USDT", "15m"), | |
] | |
""" | |
return [] | |
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: | |
# RSI | |
dataframe['rsi'] = ta.RSI(dataframe) | |
# Bollinger bands | |
bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2) | |
dataframe['bb_upperband'] = bollinger['upper'] | |
dataframe['bb_midband'] = bollinger['mid'] | |
dataframe['bb_lowerband'] = bollinger['lower'] | |
return dataframe | |
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: | |
dataframe.loc[ | |
( | |
(dataframe['rsi'] > 30) & # Signal: RSI is greater 30 | |
(dataframe['close'] < dataframe['bb_lowerband']) # Signal: price is less than lower bb 2sd | |
), | |
'buy'] = 1 | |
return dataframe | |
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: | |
dataframe.loc[ | |
( | |
(dataframe['rsi'] > 70) & # Signal: RSI is greater 70 | |
(dataframe['close'] > dataframe['bb_midband']) # Signal: price is greater than mid bb | |
), | |
'sell'] = 1 | |
return dataframe |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment