Methodology v2.1 (OHLC)

In plain words

This page answers “are you cheating?”. The rules we use to check our own forecasts are published in advance and never changed after the fact. Each forecast is published before the market moves, and a few hours later an honest mark appears next to it: right or wrong. Below are the exact rules if you want to dig in or check us.

Technical rules

Full check: hourly OHLC extremes over 24h, trend ±2.5%. Fast check: same OHLC logic over 3h at ±1.0% — starts only from the enable date (no retro recalculation). Public site delay = 3h (= fast window); verdicts publish immediately. Phases: TREND_UP / TREND_DOWN / SIDEWAYS / WHIPSAW. HIGH_UNCERTAINTY → N/A. Schedule: every 3h from 07:00 Asia/Riyadh (anchors 07/16/22) + HIGH events +15m. Code: src/grader_v21.py, src/ohlc_outcome.py.

v2.1 — fast + full

Why no price or technical analysis in the LLM

Price and indicators already live inside the client's trading bots. TrendOrFlat supplies an orthogonal layer: external news and macro context. Keeping price out of the LLM prompt avoids self-reference (the model reading the market it is supposed to classify) and reduces curve-fitting to historical candles. Price is used only after the fact — in the OHLC grader, reference strategy, and simulator.

Known limitations

Blind spots to narrative-free moves (a smooth trend with little news). Forecasts are probabilistic, not guarantees. During shocks, provider web search can lag official releases. Event runs prefer primary sources (BLS/BEA/Census/Fed) but cannot hard-lock search domains — degraded search is flagged in run notes.

Overlapping forecasts

Each run is an independent forecast for the next 24 hours from its own timestamp. The full (24h) verdict grades that forecast, not an open trading position. For live risk control, the acting regime is always the latest completed run — older open forecasts may still be graded later without changing the current gate.

Exact definition of PARTIAL

Both horizons use the same OHLC first-hit logic. Thresholds: fast 3h ±1.0%; full 24h ±2.5%. If only the upper band is hit → TREND_UP; only lower → TREND_DOWN; neither → SIDEWAYS; both → WHIPSAW. For TREND_UP/TREND_DOWN forecasts: CORRECT if the realized phase matches or WHIPSAW with the matching side hit first; PARTIAL if WHIPSAW but the opposite side (or both bands in the same candle) hit first; WRONG if the opposite trend or SIDEWAYS. SIDEWAYS forecasts have no PARTIAL (CORRECT only on SIDEWAYS, else WRONG). HIGH_UNCERTAINTY → N/A.

Forecast refusals

HIGH_UNCERTAINTY is a refusal to forecast: it does not enter the accuracy score (N/A, not in evaluated). A run-level NO_CONSENSUS is treated the same way. Refusal is useful: it protects capital — a “storm warning” when not trading beats guessing. Frequent refusals would inflate accuracy, so next to accuracy we always show the refusal share (the “Refusals %” column). Under research: whether OFF predicts whipsaw (HIGH_UNCERTAINTY → realized WHIPSAW) — we will publish once we have ≥30 OFF forecasts.

Reference strategy (Donchian-24h)

Public duel on the homepage compares a fixed Donchian breakout on BTCUSDT 1h candles with and without the TrendOrFlat regime filter. No LLM inside this backtest. Price is allowed here (forbidden only in the LLM prompt). Curve starts at the first cloud v2 run day; rule changes create a new strategy_version alongside — no silent retro rewrite.

Symbol: BTCUSDT. Interval: 1h. Lookback N = 24 completed bars (exclude bar t).
Upper_t = max(high_{t-24} … high_{t-1})
Lower_t = min(low_{t-24} … low_{t-1})
Long signal: high_t > Upper_t
Short signal: low_t < Lower_t
If both in one bar: larger penetration wins; tie → no trade.
Position ∈ {−1,0,+1}. Raw variant: reverse/enter on every signal.
Filtered variant: TREND_LONG → long only; TREND_SHORT → short only;
OFF or FLAT → flatten, count blocked entries when a raw signal is ignored.
Acting regime at bar t = latest completed forecast with ts ≤ bar open.
Equity_0 = 1. Equity update each bar: E ← E × (1 + pos × Δclose/close_prev).
No fees, no slippage (transparent baseline). Code: src/reference_strategy.py (donchian24_v1).

Current frozen version: donchian24_v1. Changing formulas requires donchian24_v2 (or later) written next to v1 — historical v1 rows are never recalculated under new rules.

History includes runs before public launch — marked honestly in methodology.

Verify a run (API)

Open-source grader (grader-public)

Download CSV