Timeframe
5m
Direction
Long Only
Stoploss
N/A
Trailing Stop
No
ROI
N/A
Interface Version
N/A
Startup Candles
200
Indicators
7
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
# user_data/strategies/MyFreqAIStrategy.py
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import talib.abstract as ta
class MyFreqAIStrategy(IStrategy):
timeframe = "5m"
can_short = False
startup_candle_count = 200
# Plot configuration for visualizing indicators and signals
plot_config = {
# Main plot - price chart with EMAs and Bollinger Bands
'main_plot': {
'tema': {},
'ema_20': {'color': 'orange'},
'ema_50': {'color': 'blue'},
'bb_upper': {'color': 'gray', 'type': 'line'},
'bb_lower': {'color': 'gray', 'type': 'line'},
'bb_middle': {'color': 'gray', 'type': 'line'},
},
# Subplots
'subplots': {
'RSI & ADX': {
'rsi': {'color': 'red'},
'adx': {'color': 'purple'},
},
'MACD': {
'macd': {'color': 'blue'},
'macdsignal': {'color': 'orange'},
'macdhist': {'type': 'bar', 'color': 'gray'},
},
'Signals': {
'enter_long': {'color': 'green', 'type': 'scatter'},
'exit_long': {'color': 'red', 'type': 'scatter'},
}
}
}
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# Basic technical indicators
dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14)
dataframe["ema_20"] = ta.EMA(dataframe, timeperiod=20)
dataframe["ema_50"] = ta.EMA(dataframe, timeperiod=50)
# Additional indicators for futures trading
dataframe["adx"] = ta.ADX(dataframe, timeperiod=14)
dataframe["macd"], dataframe["macdsignal"], dataframe["macdhist"] = ta.MACD(dataframe, fastperiod=12, slowperiod=26, signalperiod=9)
dataframe["bb_upper"], dataframe["bb_middle"], dataframe["bb_lower"] = ta.BBANDS(dataframe, timeperiod=20)
# For futures perp-spot arbitrage features, we would need data from both markets
# These features would be calculated if we had access to both spot and perp data
# For now, we'll create placeholder features that demonstrate the concept
# Basis-related features (perp price - spot price) / spot price
# In a real implementation, you'd load both datasets and calculate:
# dataframe["basis"] = (perp_close - spot_close) / spot_close
# dataframe["basis_ma"] = ta.SMA(dataframe["basis"], timeperiod=20)
# dataframe["basis_zscore"] = (dataframe["basis"] - dataframe["basis"].rolling(100).mean()) / dataframe["basis"].rolling(100).std()
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# Use FreqAI predictions for entry signals, with fallback to basic RSI condition
dataframe.loc[:, 'enter_long'] = dataframe.get('&-enter_long', dataframe['rsi'] < 30)
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# Use FreqAI predictions for exit signals, with fallback to basic RSI condition
dataframe.loc[:, 'exit_long'] = dataframe.get('&-exit_long', dataframe['rsi'] > 70)
return dataframe