Timeframe
1d
Direction
Long Only
Stoploss
-12.0%
Trailing Stop
No
ROI
0m: 25.0%, 30m: 15.0%, 60m: 8.0%, 90m: 0.0%
Interface Version
3
Startup Candles
200
Indicators
2
"""
GoldenCrossDaily_v1 — Daily Trend Following
Entry: EMA50 crosses above EMA200 (golden cross)
Regime: BTC > EMA200 (bear market protection)
Exit: ROI/Stoploss only
Pairs: BTC/USDT, ETH/USDT, SOL/USDT
"""
import talib.abstract as ta
from freqtrade.strategy import IStrategy
from pandas import DataFrame
class GoldenCrossDaily_v1(IStrategy):
INTERFACE_VERSION = 3
timeframe = "1d"
can_short = False
stoploss = -0.12
use_custom_stoploss = False
trailing_stop = False
process_only_new_candles = True
minimal_roi = {
"0": 0.25, # 25% — quick strong move
"30": 0.15, # 30 days — 15%
"60": 0.08, # 60 days — 8%
"90": 0, # 90 days — breakeven
}
startup_candle_count = 200
max_open_trades = 2
@property
def protections(self):
return [
{"method": "CooldownPeriod", "stop_duration_candles": 10},
{"method": "StoplossGuard", "lookback_period_candles": 30,
"trade_limit": 1, "stop_duration_candles": 30},
]
def informative_pairs(self):
return [("BTC/USDT", "1d")]
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# Get BTC data for macro regime filter
if self.dp:
btc_data = self.dp.get_pair_dataframe("BTC/USDT", "1d")
btc_ema200 = ta.EMA(btc_data["close"], timeperiod=200)
dataframe["btc_price"] = btc_data["close"]
dataframe["btc_ema200"] = btc_ema200
dataframe["btc_bull"] = dataframe["btc_price"] > dataframe["btc_ema200"]
# Pair indicators
dataframe["ema50"] = ta.EMA(dataframe["close"], timeperiod=50)
dataframe["ema200"] = ta.EMA(dataframe["close"], timeperiod=200)
dataframe["ema50_above_ema200"] = dataframe["ema50"] > dataframe["ema200"]
dataframe["golden_cross"] = (
(dataframe["ema50"] > dataframe["ema200"]) &
(dataframe["ema50"].shift(1) <= dataframe["ema200"].shift(1))
)
# ADX for trend quality
dataframe["adx"] = ta.ADX(dataframe, timeperiod=14)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
macro_ok = dataframe.get("btc_bull", True)
entry = (
macro_ok &
dataframe["golden_cross"] &
(dataframe["adx"] > 20)
)
dataframe.loc[entry, "enter_long"] = 1
dataframe.loc[entry, "enter_tag"] = "golden_cross"
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
return dataframe