1 · Foundations
api/indicators.js · api/swing-horizon.js
The primitives every other formula is built on. \(C_i, H_i, L_i\) are the close, high and low of bar \(i\); \(P\) is the latest price; \(p\) is the look-back period.
Simple Moving Average SMA
\[ \mathrm{SMA}_p = \frac{1}{p}\sum_{i=n-p+1}^{n} C_i \]
The plain average of the last \(p\) closes. We use SMA-50 and SMA-200 to read trend.
Exponential Moving Average EMA
\[ k = \frac{2}{p+1}, \qquad E_i = C_i\,k + E_{i-1}(1-k) \]
A weighted average that reacts faster to recent price. It is the building block of MACD.
seed: E_0 = C_0
Daily Log Return return
\[ r_i = \ln\!\left(\frac{C_i}{C_{i-1}}\right) \]
Continuously-compounded one-day return — the input to realized volatility.
Realized Daily Volatility σd
\[ \sigma_d = \sqrt{\frac{1}{n-1}\sum_{i=1}^{n}\left(r_i-\bar r\right)^2} \]
The sample standard deviation of daily log returns (Bessel's \(n-1\)). Drives the Swing-Horizon diffusion estimate.
True Range TR
\[ \mathrm{TR}_i = \max\!\Big( H_i-L_i,\; \lvert H_i-C_{i-1}\rvert,\; \lvert L_i-C_{i-1}\rvert \Big) \]
The largest of today's range or either gap from yesterday's close — the honest measure of a bar's movement, gaps included. It feeds ATR and ADX.
2 · Wilder Indicators
api/indicators.js
The technical core, computed on one year of real daily bars — the exact indicators our older tools used to fake with Math.random(), now real. \(p=14\) throughout unless noted.
Relative Strength Index RSI(14)
\[ \mathrm{AG}_i = \frac{\mathrm{AG}_{i-1}(p-1)+\max(d_i,0)}{p}, \quad \mathrm{AL}_i = \frac{\mathrm{AL}_{i-1}(p-1)+\max(-d_i,0)}{p} \]
\[ \mathrm{RS} = \frac{\mathrm{AG}}{\mathrm{AL}}, \qquad \mathrm{RSI} = 100 - \frac{100}{1+\mathrm{RS}} \]
Wilder-smoothed average gains over average losses, where \(d_i = C_i - C_{i-1}\). Momentum oscillator, \(0\!-\!100\). >70 overbought, <30 oversold. If \(\mathrm{AL}=0\), RSI \(=100\).
seed: AG₀, AL₀ = mean gain/loss over first p bars
Average True Range ATR(14)
\[ \mathrm{ATR}_p = \frac{1}{p}\sum_{i=1}^{p}\mathrm{TR}_i, \qquad \mathrm{ATR}_i = \frac{\mathrm{ATR}_{i-1}(p-1)+\mathrm{TR}_i}{p} \]
\[ \mathrm{ATR}\% = 100\cdot\frac{\mathrm{ATR}}{P} \]
Wilder's smoothed True Range — the asset's typical daily move in price units. ATR is the unit our stops and targets are measured in.
MACD MACD(12,26,9)
\[ \mathrm{MACD}_t = \mathrm{EMA}_{12}(C)_t - \mathrm{EMA}_{26}(C)_t \]
\[ \mathrm{Signal}_t = \mathrm{EMA}_{9}(\mathrm{MACD})_t, \qquad \mathrm{Hist}_t = \mathrm{MACD}_t - \mathrm{Signal}_t \]
The gap between a fast and slow EMA, plus its own signal line. A positive, rising histogram is bullish momentum; a negative one is bearish.
Average Directional Index ADX(14) +DI/−DI
\[ +\mathrm{DM}_i = \begin{cases} H_i-H_{i-1} & \text{if } > (L_{i-1}-L_i)\text{ and } > 0 \\ 0 & \text{otherwise} \end{cases} \]
\[ +\mathrm{DI} = 100\,\frac{S(+\mathrm{DM})}{S(\mathrm{TR})}, \quad -\mathrm{DI} = 100\,\frac{S(-\mathrm{DM})}{S(\mathrm{TR})} \]
\[ \mathrm{DX} = 100\,\frac{\lvert +\mathrm{DI} - (-\mathrm{DI})\rvert}{+\mathrm{DI} + (-\mathrm{DI})}, \qquad \mathrm{ADX} = \text{Wilder-smooth}(\mathrm{DX}) \]
\(S(\cdot)\) is Wilder smoothing. ADX measures trend strength (not direction): >25 = a real trend; +DI vs −DI gives the direction.
Trend Classification trend
\[ \text{trend} = \begin{cases} \text{up} & P > \mathrm{SMA}_{50} > \mathrm{SMA}_{200} \\ \text{down} & P < \mathrm{SMA}_{50} < \mathrm{SMA}_{200} \\ \text{mixed} & \text{otherwise} \end{cases} \]
The classic moving-average stack. This is the gate that caught BTC and SOL in real downtrends the moment live data went on — where the old simulated tools would have flashed "buy."
3 · Momentum Composite Score
api/momentum.js
The free Momentum Scanner ranks the day's movers with a single 0–100 composite, a weighted blend of six normalized factors.
Relative Volume RV
\[ \mathrm{RV} = \frac{V}{\bar V_{10}} \]
Today's volume over the 10-day average. RV > 1 means unusual participation — the fuel behind a real move.
Social Sentiment S
\[ S = \frac{n_{\text{bull}} - n_{\text{bear}}}{n_{\text{bull}} + n_{\text{bear}}} \in [-1,\,1] \]
Net bull/bear ratio from the public StockTwits stream. Neutral or no data \(\Rightarrow S=0\).
Normalized Sub-Factors f
\[ f_{\text{pct}} = \mathrm{clip}(5\,\Delta\%,\,-100,\,100), \quad f_{\text{rv}} = \min(100,\,30\,\mathrm{RV}), \quad f_{\text{sent}} = 50(S+1) \]
\[ f_{\text{vol}} = \min\!\left(100,\,1500\,\frac{\mathrm{ATR}}{P}\right), \quad f_{\text{float}} \in \{100,80,50,30\}, \quad f_{\text{fresh}} = 50 \]
Each raw signal is squashed to a 0–100 band. Float tiers: <20M → 100, <50M → 80, <200M → 50, else 30 (tighter floats move harder).
Composite Score OT Momentum
\[ \mathrm{Score} = 0.30\,f_{\text{pct}} + 0.25\,f_{\text{rv}} + 0.15\,f_{\text{sent}} + 0.15\,f_{\text{vol}} + 0.10\,f_{\text{float}} + 0.05\,f_{\text{fresh}} \]
Price action and volume carry the most weight (55% combined) because that is what actually pays — sentiment and float are confirmation, not the thesis.
Scanner Exit Levels ATR stop/target
\[ \mathrm{SL} = \text{entry} - 1.5\,\mathrm{ATR}, \qquad \mathrm{TP} = \text{entry} + 4.5\,\mathrm{ATR}, \qquad \mathrm{R\!:\!R} = \frac{4.5}{1.5} = 3.0 \]
A fixed 3:1 reward-to-risk on a real ATR(14) computed from 60 daily bars. We never show a setup whose math doesn't clear 3:1 on the scanner.
4 · QuantDash Signal Engine
quantdash-web.html
The member dashboard turns a live price + a signal tier + an asset class into Entry / Stop / Target / R:R. Method: Wilder ATR stops + fixed R:R discipline. A level is only ever drawn from a confirmed live price.
Asset-Class ATR Proxy ATR ≈ P·band
\[ \mathrm{ATR} \approx P \times \mathrm{band}_{\text{class}} \]
Each asset class carries its own typical daily-ATR band, so a stop is sized to how that market actually breathes:
| Class | Band | Class | Band |
| Crypto | 3.8% | Energy | 2.5% |
| Equities (large-cap) | 1.8% | Agriculture | 2.0% |
| ETFs | 1.2% | Precious metals | 1.4% |
| Forex (majors) | 0.45% | Base metals | 1.8% |
| Index futures | 1.0% | Bonds | 0.8% |
Signal-Tier Multipliers SIG_MULT
\[ \text{entry} = P\,(1+\text{off}), \quad \mathrm{SL}_{\text{dist}} = N\cdot\mathrm{ATR}, \quad \mathrm{TP}_{\text{dist}} = M\cdot\mathrm{ATR} \]
| Tier | N (stop) | M (target) | Offset | R:R |
| STRONG BUY | 1.5 | 4.5 | −0.3% | 3.0:1 |
| BUY | 2.0 | 4.0 | −0.5% | 2.0:1 |
| HOLD | 2.5 | 2.5 | 0.0% | 1.0:1 |
| SELL (short) | 1.5 | 4.5 | +0.3% | 3.0:1 |
The small offset nudges the entry to a slightly better fill (below price for longs, above for shorts).
Entry / Stop / Target long & short
\[ \textbf{Long:}\quad \mathrm{SL} = \text{entry} - \mathrm{SL}_{\text{dist}}, \qquad \mathrm{TP} = \text{entry} + \mathrm{TP}_{\text{dist}} \]
\[ \textbf{Short:}\quad \mathrm{SL} = \text{entry} + \mathrm{SL}_{\text{dist}}, \qquad \mathrm{TP} = \text{entry} - \mathrm{TP}_{\text{dist}} \]
Shorts are the long logic mirrored across the entry. Entry shows orange, stop red, target green.
Reward-to-Risk & Color Grade R:R
\[ \mathrm{R\!:\!R} = \frac{\mathrm{TP}_{\text{dist}}}{\mathrm{SL}_{\text{dist}}} = \frac{M}{N} \]
Because both distances scale with the same ATR, R:R reduces to the tier ratio \(M/N\) — independent of price or asset. The cell is color-graded:
| Condition | Grade |
| R:R ≥ 3.0 | bright green — premium |
| R:R ≥ 2.0 | cyan — good |
| R:R ≥ 1.5 | gold — acceptable |
| R:R < 1.5 | red — skip |
5 · Swing-Horizon Model
api/swing-horizon.js
"How long until the target?" — answered from the asset's own history rather than a guess. \(d\) is the target move (e.g. \(0.28\) for +28%).
Historical Cycle Scan primary
Volatility-Diffusion Cross-Check fallback
\[ t_{\text{diff}} \approx \left(\frac{\ln(1+d)}{\sigma_d}\right)^{\!2} \]
A random-walk upper bound on how long a move of size \(d\) should take given daily volatility \(\sigma_d\). Used as the sanity cap and as the estimate when history is too thin.
Chosen Estimate & Calendar Window output
\[ D_{\text{trade}} = \min\!\big(D_{\text{cycle}},\; 1.5\,t_{\text{diff}}\big), \qquad D_{\text{cal}} = \left\lceil D_{\text{trade}}\cdot\tfrac{7}{5}\right\rceil \]
Trading days are capped by the diffusion bound, then converted to calendar days (5 trading ≈ 7 calendar) and rendered as "early / mid / late Month Year."
confidence: high ≥12 samples · medium ≥4 · low = diffusion-only
6 · Options Flow & Gamma
quantdash-web.html · CBOE delayed chain
The positioning layer behind QuantDash's options-flow strip. These read where the market's hedging pressure sits — they colour conviction, they never set the entry. Sourced from a delayed CBOE chain; treat as context, not a trigger.
Net Gamma Exposure GEX
\[ \mathrm{GEX} = S^2 \cdot 0.01 \cdot \sum_i \mathrm{sgn}_i\,\Gamma_i\,\mathrm{OI}_i\,(100) \]
Dealer hedging dollars per 1% move, summed across the chain (\(\mathrm{sgn}=+1\) dealer-long calls, \(-1\) dealer-short puts). Positive GEX → dealers sell rallies / buy dips, dampening volatility (mean-revert regime). Negative GEX → dealers chase, amplifying moves (trend / squeeze regime).
\(\Gamma\) = option gamma · \(\mathrm{OI}\) = open interest · \(S\) = spot · \(100\) = contract multiplier
Gamma-Flip Level S*
\[ S^\* : \mathrm{GEX}(S^\*) = 0 \]
The spot price where net gamma crosses zero. Above \(S^\*\) volatility is typically suppressed; below it volatility expands. The single most-watched level for intraday regime — it’s the line our Gauge pillar keys on.
Vanna ∂Δ/∂σ
\[ \mathrm{Vanna} = \frac{\partial^2 V}{\partial S\,\partial \sigma} = \frac{\partial \Delta}{\partial \sigma} \]
How an option’s delta shifts when implied vol moves. On an IV spike, vanna forces dealers to re-hedge directionally — the mechanism behind “vol-down → drift-up” melt-ups and vanna-driven reversals.
25-Delta IV Skew skew
\[ \mathrm{Skew}_{25} = \sigma^{\mathrm{IV}}_{\text{put},\,25\Delta} - \sigma^{\mathrm{IV}}_{\text{call},\,25\Delta} \]
The implied-vol premium of downside puts over upside calls. A rising skew = the market is paying up for protection (fear bid); a flattening skew = complacency or a chase for upside. Reads sentiment the price alone can’t.
Volatility-Normalized Signal Bands sigBands
\[ \textbf{BUY}: |\Delta\%| \ge 0.75\,\mathrm{ATR\%}, \qquad \textbf{STRONG}: |\Delta\%| \ge 1.5\,\mathrm{ATR\%} \]
Every tab’s signal threshold is scaled to the asset’s own daily ATR% (the same table the Entry/SL/TP engine uses — one source of truth). So a 0.5% forex move and a 3% crypto move are judged proportionally, and the signal always agrees with the levels. The two multipliers \(0.75\) / \(1.5\) are the only knob — and they’re back-tested.
symmetric for SELL · \(\mathrm{ATR\%}\) per class from ATR_PCT
7 · Risk Discipline
Arch's rules
1. ATR sizes everything. Stops and targets are measured in the asset's own volatility, never a flat percentage — a crypto stop and a bond stop are not the same width.
2. Reward-to-risk is fixed, not hoped for. STRONG BUY clears 3:1; we never enter below 1.5:1. The math sets the trade; emotion does not.
3. A level needs a live price. If the current market price isn't confirmed, the cell shows —. No stale number is ever dressed up as a signal.
4. Real data only. Every indicator here is computed from real daily bars. The day we turned the real engine on, it told the truth out loud — and that is the entire point.
⚖️ Compiled by Arch for the Pack — so every number can be checked by hand.
Verify live values any time at QuantDash · Momentum Scanner.
⚠️ Equations are disclosed for transparency and education. Outputs are research signals, not financial advice. All investing involves risk; past behavior does not guarantee future results.