💬 Forum

BearBull3

Danson77/Freqtrade_AIO_UI/user_data/strategies/Old strategies/BearBull3_converted.py · first seen 2026-07-28 · repo updated 2026-05-20

Basics mode: spot timeframe: 5m interface version: 3 2h
Settings stoploss: -0.15 has minimal roi trailing startup candle count: 200
Indicators Bollinger_Bands MACD talib
Concepts trailing
3 related strategies ( identical code, similar name)

Each tile is a different kind of check — from an instant code lint to full sandboxed backtests and forward tests on recent data. Not sure what a check actually proves? See the FAQ →

Source

Download Raw
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from freqtrade.strategy import IStrategy, merge_informative_pair
from pandas import DataFrame
import talib.abstract as ta
# based on BinHV45 strategy: https://github.com/freqtrade/freqtrade-strategies/blob/master/user_data/strategies/berlinguyinca/BinHV45.py
# use at own risk

class BearBull3(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = '5m'  # works best on short timeframes 3 or 5 min
    minimal_roi = {'0': 0.15}
    stoploss = -0.15
    trailing_stop = True
    trailing_stop_positive = 0.005
    trailing_stop_positive_offset = 0.015
    trailing_only_offset_is_reached = True
    startup_candle_count = 200

    def informative_pairs(self):
        pairs = self.dp.current_whitelist()
        informative_pairs = [(pair, '2h') for pair in pairs]
        return informative_pairs

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # macd timeframe for trend detection
        macd_df = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe='2h')
        macd_df['macdhist'] = ta.MACD(macd_df, fastperiod=10, slowperiod=20, signalperiod=10)['macdhist']
        dataframe = merge_informative_pair(dataframe, macd_df, self.timeframe, '2h', ffill=True)
        # normal timeframe
        bb = ta.BBANDS(dataframe, timeperiod=40, nbdevup=2.0, nbdevdn=2.0)
        dataframe['mid'] = bb['middleband']
        dataframe['lower'] = bb['lowerband']
        dataframe['bbdelta'] = (dataframe['mid'] - dataframe['lower']).abs()
        #        dataframe['pricedelta'] = (dataframe['open'] - dataframe['close']).abs()
        dataframe['closedelta'] = (dataframe['close'] - dataframe['close'].shift()).abs()
        dataframe['tail'] = (dataframe['close'] - dataframe['low']).abs()
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:  #Bear
        # Bull
        dataframe.loc[(dataframe['macdhist_2h'].lt(0) & dataframe['lower'].shift().gt(0) & dataframe['bbdelta'].gt(dataframe['close'] * 0.014) & dataframe['closedelta'].gt(dataframe['close'] * 0.008) & dataframe['tail'].lt(dataframe['bbdelta'] * 0.23) & dataframe['close'].lt(dataframe['lower'].shift()) & dataframe['close'].le(dataframe['close'].shift()) | dataframe['macdhist_2h'].gt(0) & dataframe['lower'].shift().gt(0) & dataframe['bbdelta'].gt(dataframe['close'] * 0.035) & dataframe['closedelta'].gt(dataframe['close'] * 0.007) & dataframe['tail'].lt(dataframe['bbdelta'] * 0.2) & dataframe['close'].lt(dataframe['lower'].shift()) & dataframe['close'].le(dataframe['close'].shift())) & (dataframe['volume'] > 0), 'enter_long'] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        no sell signal
        """
        dataframe['exit_long'] = 0
        return dataframe