Timeframe
3m
Direction
Long Only
Stoploss
-10.0%
Trailing Stop
Yes
ROI
0m: 24.2%
Interface Version
N/A
Startup Candles
N/A
Indicators
1
from pandas import DataFrame
from functools import reduce
from freqtrade.strategy import IStrategy
from freqtrade.exchange import timeframe_to_minutes
import logging
import talib.abstract as ta
class BollingerBandStrategy(IStrategy):
timeframe = "3m"
timeframe_mins = timeframe_to_minutes(timeframe)
# ROI table:
minimal_roi = {
"0": 0.242,
str(timeframe_mins * 3): 0.01, # 2% after 3 candles
str(timeframe_mins * 6): 0.00 # 1% After 6 candles
}
# Stoploss:
stoploss = -0.1
# Trailing stop:
trailing_stop = True
trailing_stop_positive = 0.01
trailing_stop_positive_offset = 0.05
trailing_only_offset_is_reached = False
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
logging.info(dataframe['date'])
upperband, middleband, lowerband = ta.BBANDS(
dataframe['close'],
timeperiod=20
)
dataframe['upperband'] = upperband
dataframe['middleband'] = middleband
dataframe['lowerband'] = lowerband
dataframe['iii'] = self.intraday_intensity_index(dataframe)
dataframe['money_flow'] = dataframe['iii'].rolling(window=21).sum() / dataframe['close'].rolling(window=21).sum()
return dataframe
def intraday_intensity_index(self, dataframe):
close = dataframe['close']
high = dataframe['high']
low = dataframe['low']
volume = dataframe['volume']
return ( (close * 2) - high - low ) / ( (high - low) ) * volume
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
conditions_long = []
conditions_short = []
conditions_long.append(
dataframe['close'] < dataframe['lowerband']
)
conditions_long.append(
(dataframe['volume'] > 0)
)
conditions_long.append(
(dataframe['money_flow'] > 0)
)
conditions_long.append(
(dataframe['iii'] > 0)
)
conditions_short.append(
dataframe['close'] > dataframe['upperband']
)
conditions_short.append(
(dataframe['money_flow'] < 0)
)
conditions_short.append(
(dataframe['volume'] > 0)
)
conditions_short.append(
(dataframe['iii'] < 0)
)
dataframe.loc[
(
reduce(lambda x, y: x & y, conditions_long)
),
'enter_long'] = 1
dataframe.loc[
(
reduce(lambda x, y: x & y, conditions_short)
),
'enter_short'] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
return super().populate_exit_trend(dataframe, metadata)