Timeframe
4h
Direction
Long & Short
Stoploss
-2.0%
Trailing Stop
No
ROI
0m: 4.0%
Interface Version
N/A
Startup Candles
N/A
Indicators
0
freqtrade/freqtrade-strategies
from freqtrade.strategy import IStrategy, IntParameter, DecimalParameter
import pandas as pd
class BreakoutVolumeStrategy(IStrategy):
breakout_lookback = IntParameter(10, 50, default=20, space="buy", optimize=True)
volume_multiplier = DecimalParameter(1.1, 3.0, decimals=2, default=1.5, space="buy", optimize=True)
stoploss_param = DecimalParameter(-0.10, -0.01, decimals=3, default=-0.02, space="sell", optimize=True)
roi_param = DecimalParameter(0.02, 0.10, decimals=3, default=0.04, space="sell", optimize=True)
timeframe = '4h'
startup_candle_count: int = 50
stoploss = -0.02
minimal_roi = {"0": 0.04}
can_short = True
def populate_indicators(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
length = int(self.breakout_lookback.value)
dataframe['highest_high'] = dataframe['high'].rolling(window=length, min_periods=1).max().shift(1)
dataframe['lowest_low'] = dataframe['low'].rolling(window=length, min_periods=1).min().shift(1)
dataframe['avg_volume'] = dataframe['volume'].rolling(window=length, min_periods=1).mean().shift(1)
dataframe['volume_spike'] = dataframe['volume'] > (self.volume_multiplier.value * dataframe['avg_volume'])
dataframe['is_breakout'] = dataframe['close'] > dataframe['highest_high']
dataframe['is_breakdown'] = dataframe['close'] < dataframe['lowest_low']
dataframe['long_condition'] = dataframe['is_breakout'] & dataframe['volume_spike']
dataframe['short_condition'] = dataframe['is_breakdown'] & dataframe['volume_spike']
return dataframe
def populate_entry_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
dataframe.loc[dataframe['long_condition'], 'enter_long'] = 1
dataframe.loc[dataframe['short_condition'], 'enter_short'] = 1
return dataframe
def populate_exit_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
return dataframe
def custom_stoploss(self, pair: str, trade, current_time, current_rate, current_profit, **kwargs):
return float(self.stoploss_param.value)
def custom_exit(self, pair: str, trade, current_time, current_rate, current_profit, **kwargs):
roi = float(self.roi_param.value)
if trade.is_short:
if current_profit <= -roi:
return "take_profit"
else:
if current_profit >= roi:
return "take_profit"
return None