Simple Trend Following Strategy
Timeframe
5m
Direction
Long Only
Stoploss
-1.5%
Trailing Stop
Yes
ROI
0m: 3.0%, 60m: 2.0%, 180m: 1.0%, 360m: 0.5%
Interface Version
N/A
Startup Candles
300
Indicators
2
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
from freqtrade.strategy import IStrategy
from pandas import DataFrame
from datetime import datetime
from typing import List
import talib.abstract as ta
class FutureHighFreqV1(IStrategy):
"""
Simple Trend Following Strategy
Buy when:
- EMA 9 > EMA 21 (confirmed trend)
- Price above EMA 50 (major trend)
- RSI not overbought
Sell when:
- EMA 9 < EMA 21 (trend reversal)
- Or RSI overbought
"""
timeframe = '5m'
max_open_trades = 10
stake_amount = 0.10
startup_candle_count = 300
# Higher profit targets for strong trends
minimal_roi = {
"0": 0.03, # 3% quick
"60": 0.02, # 2% in 1h
"180": 0.01, # 1% in 3h
"360": 0.005 # 0.5% in 6h
}
stoploss = -0.015
trailing_stop = True
trailing_stop_positive = 0.01
trailing_stop_positive_offset = 0.015
trailing_only_offset_is_reached = True
order_types = {
'entry': 'market',
'exit': 'market',
'stoploss': 'market',
'stoploss_on_exchange': False
}
unfilledtimeout = {
'entry': 10,
'exit': 10,
'unit': 'seconds'
}
# ===== Parameters =====
fast_ema = 9
slow_ema = 21
ema50_period = 50
rsi_period = 14
rsi_buy = 60
rsi_sell = 75
cooldown_period = 5
def informative_pairs(self) -> List[tuple]:
return []
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe['fast_ema'] = ta.EMA(dataframe, timeperiod=self.fast_ema)
dataframe['slow_ema'] = ta.EMA(dataframe, timeperiod=self.slow_ema)
dataframe['ema50'] = ta.EMA(dataframe, timeperiod=self.ema50_period)
dataframe['rsi'] = ta.RSI(dataframe, timeperiod=self.rsi_period)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# Strong trend: Fast > Slow > EMA50
strong_trend = (
(dataframe['fast_ema'] > dataframe['slow_ema']) &
(dataframe['slow_ema'] > dataframe['ema50'])
)
# RSI not overbought
rsi_ok = dataframe['rsi'] < self.rsi_buy
conditions = strong_trend & rsi_ok & (dataframe['volume'] > 0)
dataframe.loc[conditions, 'enter_long'] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# Trend reversal
trend_reversal = dataframe['fast_ema'] < dataframe['slow_ema']
# Or RSI overbought
overbought = dataframe['rsi'] > self.rsi_sell
conditions = (trend_reversal | overbought) & (dataframe['volume'] > 0)
dataframe.loc[conditions, 'exit'] = 1
return dataframe