freqtrade-strategy-dev
Develop, iterate, and improve Freqtrade cryptocurrency trading strategies. Use when writing a new strategy, improving an existing one, analyzing why a strategy is losing, or understanding which indicators to use. Covers strategy anatomy, key configuration parameters, proven entry/exit patterns, and the iteration workflow. Trigger phrases: write freqtrade strategy, improve strategy, why is my strategy losing, freqtrade indicators, strategy not profitable, freqtrade entry conditions.
Freqtrade Strategy Development
Build profitable trading strategies with disciplined iteration, tight risk management, and data-driven entry/exit rules. Assumes Freqtrade is running via Docker (docker-compose).
Strategy Anatomy
Every Freqtrade strategy requires three methods:
populate_indicators(dataframe, metadata)— Add technical indicators (RSI, MACD, Bollinger Bands, etc.) to the dataframepopulate_entry_trend(dataframe, metadata)— Define buy signal logic; setenter_long = 1when conditions metpopulate_exit_trend(dataframe, metadata)— Define sell signal logic; setexit_long = 1when conditions met (optional if using ROI/stop-loss)
Key Config Parameters
stoploss = -0.03 # 3% max loss per trade
trailing_stop = True
trailing_stop_positive = 0.01
trailing_stop_positive_offset = 0.02
minimal_roi = {
"0": 0.04, # 4% profit target immediately
"30": 0.02, # 2% after 30 candles
"60": 0.01, # 1% after 60 candles
}
timeframe = "5m" # or "15m", "1h", etc.
stake_currency = "USDT"
dry_run = True # Always backtest/dry-run first
Proven Entry Pattern
stoploss = -0.03
trailing_stop = True
trailing_stop_positive = 0.01
trailing_stop_positive_offset = 0.02
minimal_roi = {"0": 0.04, "30": 0.02, "60": 0.01}
# In populate_indicators: calculate RSI, CCI, Bollinger Bands, EMA, Volume SMA
# In populate_entry_trend: only buy when ALL conditions met
conditions = [
(dataframe['rsi'] < 30), # Oversold
(dataframe['cci'] < -100), # Momentum confirmation
(dataframe['close'] < dataframe['bb_lowerband']), # Price near lower band
(dataframe['volume'] > dataframe['volume_sma']), # Volume confirms
(dataframe['bullish_candle']), # Pattern confirmation
]
dataframe.loc[reduce(lambda x, y: x & y, conditions), 'enter_long'] = 1
Key Lessons Learned
- Tight stops save accounts — 3% max loss beats 5%, 7%, or 8% every time
- Quality over quantity — 25 selective trades outperform 308 mediocre ones
- Win rate alone is meaningless — 63% win rate unprofitable if avg loss is 5x avg gain
- Selectivity is survival — RSI(30) + CCI(-100) dual filters dramatically reduce noise
- Test in bear markets — If strategy survives a crash, it works everywhere
- Volume confirms conviction — Entries without above-average volume fail more often
Useful Indicators
- RSI (14) — Momentum; < 30 = oversold, > 70 = overbought
- CCI — Commodity Channel Index; momentum confirmation; < -100 = deep oversold
- MACD — Trend following; watch for crossovers
- Bollinger Bands — Volatility; price near lower band = potential reversal
- EMA — Trend filter; price above EMA = uptrend
- MFI — Money Flow Index; volume-weighted momentum
Iteration Workflow
- Write baseline strategy with core entry/exit logic
- Backtest on 90–120 days of historical data
- Analyze exit reasons: are you exiting winners or losers too fast?
- Tighten ONE parameter at a time (e.g., RSI threshold)
- Backtest same period, compare vs. baseline
- If better → keep; if worse → revert
- Test different market conditions (Bull, bear, sideways)
- Dry-run on live feeds before deploying to live trading
Version Control
Keep all versions: name files MyStrategy_v1.py, MyStrategy_v2.py, etc. Add comments above each change explaining what improved and why. This preserves your iteration history and makes reverting safe.
References
references/indicators-guide.md— Technical indicator formulas and interpretationreferences/iteration-workflow.md— Step-by-step walkthrough of strategy optimization