Timeframe
30m
Direction
Long Only
Stoploss
-5.0%
Trailing Stop
Yes
ROI
0m: 6.0%, 60m: 4.0%, 180m: 2.0%, 360m: 1.0%
Interface Version
3
Startup Candles
N/A
Indicators
5
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
"""Momentum breakout: MACD histogram + volume surge + Donchian breakout."""
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta
class MacdMomentumStrategy(IStrategy):
INTERFACE_VERSION = 3
minimal_roi = {
"0": 0.06,
"60": 0.04,
"180": 0.02,
"360": 0.01,
}
stoploss = -0.05
trailing_stop = True
trailing_stop_positive = 0.012
trailing_stop_positive_offset = 0.022
trailing_only_offset_is_reached = True
timeframe = "30m"
process_only_new_candles = True
startup_candle_count: int = 200
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
macd = ta.MACD(dataframe, fastperiod=12, slowperiod=26, signalperiod=9)
dataframe["macd"] = macd["macd"]
dataframe["macd_signal"] = macd["macdsignal"]
dataframe["macd_hist"] = macd["macdhist"]
dataframe["macd_hist_prev"] = dataframe["macd_hist"].shift(1)
dataframe["donch_high_20"] = dataframe["high"].rolling(20).max()
dataframe["donch_low_20"] = dataframe["low"].rolling(20).min()
dataframe["ema_100"] = ta.EMA(dataframe, timeperiod=100)
dataframe["volume_sma"] = ta.SMA(dataframe["volume"], timeperiod=20)
dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(dataframe["macd_hist"] > 0) &
(dataframe["macd_hist"] > dataframe["macd_hist_prev"]) &
(dataframe["macd"] > dataframe["macd_signal"]) &
(dataframe["close"] > dataframe["donch_high_20"].shift(1)) &
(dataframe["close"] > dataframe["ema_100"]) &
(dataframe["rsi"] < 75) &
(dataframe["volume"] > dataframe["volume_sma"] * 1.3) &
(dataframe["volume"] > 0)
),
"enter_long"] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(
(dataframe["macd_hist"] < 0) |
(dataframe["close"] < dataframe["donch_low_20"].shift(1)) |
(dataframe["rsi"] > 82)
) &
(dataframe["volume"] > 0)
),
"exit_long"] = 1
return dataframe