EMA 13/48 Cross
BeginnerThe classic: buy when fast EMA crosses above slow EMA.
const fast = ind.ema[13], slow = ind.ema[48];
if (fast[i-1] <= slow[i-1] && fast[i] > slow[i]) return 'long';
if (fast[i-1] >= slow[i-1] && fast[i] < slow[i]) return 'short';
return null;
Why it works
EMA crosses catch sustained momentum. Works when crypto is in a clear multi-week trend (bull or bear). Easy to implement, easy to reason about.
Why it fails
Generates constant false signals in ranging markets. Most crypto time is ranging. Without filters, this strategy loses money on choppy chop before the one big trend pays for it.
Works best on: 1h · 4h · 1dBTC · ETH
MACD + ADX Filter
IntermediateMACD crossover, but only when ADX confirms a trend.
const macd = ind.macd, adx = ind.adx[14];
if (adx[i] < 20) return null;
if (macd.line[i-1] <= macd.signal[i-1] && macd.line[i] > macd.signal[i]) return 'long';
if (macd.line[i-1] >= macd.signal[i-1] && macd.line[i] < macd.signal[i]) return 'short';
return null;
Why it works
MACD alone whipsaws in ranging markets. Adding ADX > 20 filters out the chop — you only take MACD signals when a trend is actually present.
Why it fails
ADX is a lagging indicator; by the time it confirms a trend, half the move may have already happened. Also misses mean-reversion edge entirely.
Works best on: 1h · 4hBTC · ETH · SOL
Supertrend
IntermediateFlip direction with the Supertrend indicator.
const st = ind.supertrend['10_3'];
if (st[i].trend === 1 && st[i-1].trend !== 1) return 'long';
if (st[i].trend === -1 && st[i-1].trend !== -1) return 'short';
return null;
Why it works
Supertrend is ATR-based so the stop distance adapts to volatility. One indicator handles both entry and trailing stop — unusually clean.
Why it fails
In low-volatility choppy periods, the trend flips constantly, racking up fees. Fee drag can bleed a whole year of gains in a bad quarter.
Works best on: 1h · 4hBTC · ETH
Triple EMA (9/21/55)
IntermediateEnter only when all three EMAs agree on direction.
const e9 = ind.ema[9], e21 = ind.ema[21], e55 = ind.ema[55];
if (e9[i] > e21[i] && e21[i] > e55[i] && !(e9[i-1] > e21[i-1] && e21[i-1] > e55[i-1])) return 'long';
if (e9[i] < e21[i] && e21[i] < e55[i] && !(e9[i-1] < e21[i-1] && e21[i-1] < e55[i-1])) return 'short';
return null;
Why it works
Three-timeframe confirmation (fast, medium, slow). When all three stack in order, short-, medium-, and long-term momentum agree. Fewer signals but higher quality.
Why it fails
The confirmation delay means you're always late to the trend. Often you enter right as the move exhausts and get shaken out by the first pullback.
Works best on: 1h · 4hBTC · ETH