Signal methodology
How Drogo computes the indicators and signals that drive screener filters and AI commentary.
Last reviewed:
Notation
Throughout this page, c[t] is the close of bar t, h[t] is the high, l[t] is the low, and v[t] is the volume. n is the lookback parameter. All formulas operate on the user's chosen resolution (1m / 5m / 1h / 1D / etc.).
Moving averages
Simple Moving Average (SMA): SMA_n[t] = (c[t-n+1] + … + c[t]) / n. Used for trend identification and as an input to MACD-derivatives.
Exponential Moving Average (EMA): EMA_n[t] = α·c[t] + (1−α)·EMA_n[t−1] with α = 2/(n+1) and seed EMA_n[n−1] = SMA_n[n−1]. EMAs respond faster to recent price than SMAs of the same length and are used as the basis for MACD.
Relative Strength Index (RSI)
Drogo uses Wilder's RSI with the canonical 14-bar lookback: gain[t] = max(c[t]−c[t−1], 0), loss[t] = max(c[t−1]−c[t], 0). The first 14-bar averages are simple averages of gain and loss; subsequent values use Wilder smoothing: avgGain[t] = (avgGain[t−1]·13 + gain[t]) / 14. Then RSI = 100 − 100/(1 + avgGain/avgLoss).
RSI is bounded in [0, 100]. We classify ≤ 30 as oversold, ≥ 70 as overbought, ≤ 20 / ≥ 80 as extremely oversold/overbought. These thresholds are conventional defaults; they are not buy/sell signals on their own.
When avgLoss = 0 over the lookback (rare on liquid instruments, common on illiquid crypto), we report RSI = 100. This matches Wilder's original definition and avoids a division-by-zero NaN.
Worked example: 15 closes [44.34, 44.09, 44.15, 43.61, 44.33, 44.83, 45.10, 45.42, 45.84, 46.08, 45.89, 46.03, 45.61, 46.28, 46.28]. The 14 differences sum to gains = 4.04, losses = 1.10, so avgGain = 0.289, avgLoss = 0.079, RS = 3.66, RSI = 100 − 100/(1+3.66) ≈ 78.5. That reading is overbought territory; expect mean-reversion pressure or trend exhaustion on the next bars unless gains accelerate further.
MACD
MACD = EMA_12(c) − EMA_26(c), signal = EMA_9(MACD), histogram = MACD − signal. We report all three. A bullish cross fires when MACD[t−1] ≤ signal[t−1] and MACD[t] > signal[t].
ATR & volatility
True Range at bar t: TR[t] = max(h[t]−l[t], |h[t]−c[t−1]|, |l[t]−c[t−1]|). ATR(14) is Wilder-smoothed TR. We expose ATR both as an absolute price unit and as a percentage of the closing price (ATR% = ATR / c · 100), the latter being more useful for cross-symbol comparison.
Realized volatility is the annualised standard deviation of log returns over the lookback: vol = √(252) · stdev(ln(c[t]/c[t−1])) for daily bars. Crypto uses 365-day annualisation.
Breakout & reversal heuristics
N-day high breakout: fires on bar t when c[t] > max(c[t−N], …, c[t−1]) and v[t] ≥ k·avg(v[t−N:t]) (default k = 1.5). The volume gate filters out the typical illiquid grind-up that gets caught by pure price breakouts.
Volume spike: fires when v[t] ≥ k·avg(v[t−N:t]) with N = 20, k = 3 by default. Used as a screener filter and as a heads-up signal in the AI commentary.
Gap up / down: (o[t] − c[t−1]) / c[t−1] ≥ X% (gap up) or ≤ −X% (gap down). Default thresholds: ±2% on daily, ±0.3% on intraday.
What signals do not do
Signals are deterministic functions of price/volume history. They do not embed any forward-looking opinion, and they are not the output of a trained model. They cannot account for fundamental catalysts (earnings, M&A, regulatory action) that occur between bars.
A signal firing is not a buy or sell recommendation. Drogo's screener and AI surfaces use signals as one of several inputs; the user is responsible for the trading decision.
Changelog
- — Initial publication.
- — Added explicit handling for the avgLoss = 0 edge case in RSI and the annualisation factor for crypto vs equity timeframes.
References
Drogo Research — Quant editorial
נבדק לדיוק עובדתי; המתודולוגיה מקושרת למטה.