MACD Momentum with Trend Filter
Trade MACD crossovers only with the prevailing trend.
Strategy Overview
- Type: Momentum
- Indicators: MACD (12, 26, 9), SMA(200)
- Risk Level: Medium
- Assets: Single asset (BTC)
Complete Code
package main
import (
"github.com/backtesting-org/kronos-sdk/pkg/types/connector"
"github.com/backtesting-org/kronos-sdk/pkg/types/kronos"
"github.com/backtesting-org/kronos-sdk/pkg/types/strategy"
"github.com/shopspring/decimal"
)
type MACDMomentum struct {
strategy.BaseStrategy
k kronos.Kronos
}
func NewMACDMomentum(k kronos.Kronos) strategy.Strategy {
return &MACDMomentum{k: k}
}
func (s *MACDMomentum) GetSignals() ([]*strategy.Signal, error) {
btc := s.k.Asset("BTC")
macd, _ := s.k.Indicators().MACD(btc, 12, 26, 9)
sma200, _ := s.k.Indicators().SMA(btc, 200)
price, _ := s.k.Market().Price(btc)
// Only trade with the trend
inUptrend := price.GreaterThan(sma200)
inDowntrend := price.LessThan(sma200)
// Bullish crossover in uptrend
if macd.MACD.GreaterThan(macd.Signal) &&
macd.Histogram.GreaterThan(decimal.Zero) &&
inUptrend {
s.k.Log().Opportunity("MACD-Momentum", "BTC", "MACD bullish crossover in uptrend")
signal := s.k.Signal(s.GetName()).
Buy(btc, connector.Binance, decimal.NewFromFloat(0.15)).
Build()
return []*strategy.Signal{signal}, nil
}
// Bearish crossover in downtrend
if macd.MACD.LessThan(macd.Signal) &&
macd.Histogram.LessThan(decimal.Zero) &&
inDowntrend {
s.k.Log().Opportunity("MACD-Momentum", "BTC", "MACD bearish crossover in downtrend")
signal := s.k.Signal(s.GetName()).
Sell(btc, connector.Binance, decimal.NewFromFloat(0.15)).
Build()
return []*strategy.Signal{signal}, nil
}
return nil, nil
}
func (s *MACDMomentum) GetName() strategy.StrategyName { return "MACD-Momentum" }
func (s *MACDMomentum) GetDescription() string { return "MACD with trend filter" }
func (s *MACDMomentum) GetRiskLevel() strategy.RiskLevel { return strategy.RiskLevelMedium }
func (s *MACDMomentum) GetStrategyType() strategy.StrategyType { return strategy.StrategyTypeMomentum }
How It Works
- Determine Trend: Use 200 SMA to identify trend direction
- Check MACD: Look for bullish or bearish crossovers
- Filter: Only trade crossovers aligned with trend
- Execute: Buy in uptrends, sell in downtrends
Key Concepts
- MACD Crossover: When MACD line crosses signal line
- Histogram: Shows strength of crossover
- Trend Filter: Prevents counter-trend trades
- With-Trend Only: Increases win rate
Backtesting
Run with:
kronos backtest
Expected characteristics:
- Moderate trade frequency
- Better win rate than raw MACD
- Avoids whipsaws in choppy markets
- May miss early trend entries
Improvements
Consider adding:
- Multiple timeframe confirmation
- Volume analysis
- Stop loss based on recent swing
- Partial exits on histogram divergence
Related Strategies
- Multi-Indicator - Adds more confirmation
- MA Crossover - Pure trend following