💬 Forum

BreakoutStrategy

uploads/breakout-strategy.py · uploaded by 🐋 Ron · first seen 2026-07-17

Basics mode: spot timeframe: 1m interface version: 3
Settings stoploss: -0.271 has minimal roi trailing hyperopt hyperopt params: 2
Indicators scipy talib
Concepts breakout trailing
15 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
from pandas import DataFrame
from functools import reduce
from freqtrade.strategy import IStrategy, DecimalParameter, IntParameter
import talib.abstract as ta
from scipy.signal import argrelextrema
import numpy as np

class BreakoutStrategy(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = '1m'
    can_short = False
    buy_peak_order = IntParameter(10, 120, default=60, space='buy')
    sell_peak_order = IntParameter(10, 120, default=60, space='sell')
    # ROI table:
    minimal_roi = {'0': 0.242, '13': 0.044, '51': 0.02, '170': 0}
    # Stoploss:
    stoploss = -0.271
    # 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:
        for val in self.buy_peak_order.range:
            ilocs_max = argrelextrema(dataframe['high'].values, np.greater_equal, order=val)[0]
            dataframe.loc[dataframe.iloc[ilocs_max].index, f'upper_peak_{val}'] = dataframe['high']
            dataframe[f'upper_peak_{val}'].fillna(method='ffill', inplace=True)
        for val in self.sell_peak_order.range:
            ilocs_min = argrelextrema(dataframe['low'].values, np.less_equal, order=val)[0]
            dataframe.loc[dataframe.iloc[ilocs_min].index, f'lower_peak_{val}'] = dataframe['low']
            dataframe[f'lower_peak_{val}'].fillna(method='ffill', inplace=True)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        conditions_long = []
        conditions_long.append(dataframe['close'] < dataframe[f'lower_peak_{self.sell_peak_order.value}'].shift(1))
        dataframe.loc[reduce(lambda x, y: x & y, conditions_long), 'enter_long'] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        conditions_short = []
        conditions_short.append(dataframe['close'] > dataframe[f'upper_peak_{self.buy_peak_order.value}'].shift(1))
        dataframe.loc[reduce(lambda x, y: x & y, conditions_short), 'exit_long'] = 1
        return dataframe