From fcd05b623ef482e5aa98683f87d2fb55cfe895d8 Mon Sep 17 00:00:00 2001 From: devam <56464719+devam2001@users.noreply.github.com> Date: Sun, 11 Oct 2026 02:07:02 +1100 Subject: [PATCH 1/5] Paper vs replay reconciliation: the last go-live gate Replays the exact period a paper session ran (same strategy, pairs, balance, max open trades), matches trades by pair and entry time, and checks that paper results are close to the replay: 28+ days, 80%+ of trades in both, realised return within 2 points, fills within 0.3% per side. The return gap is split into matched-trade execution, paper-only and replay-only trades, and anything the replay can't reproduce (manual pause/resume/flatten, halts, code changed mid-session) is flagged. - ridgeline/reconcile.py: session discovery, trade matching, checks - panel/replay.py: data top-up, session replay, background jobs - panel: Paper vs replay card; the Research tab's last gate shows real results - scripts/reconcile.py: CLI for panel sessions and the Docker bot - panel sessions now record their pairs, balance, start and a code fingerprint in .meta.json (config.json's pair list changes monthly) --- .gitignore | 1 + README.md | 34 +++- RESEARCH.md | 4 + docs/OPERATIONS.md | 63 ++++++ panel/app.py | 50 ++++- panel/bot.py | 16 +- panel/replay.py | 92 +++++++++ panel/static/app.js | 131 ++++++++++++- panel/static/index.html | 16 ++ panel/static/style.css | 4 + ridgeline/reconcile.py | 419 ++++++++++++++++++++++++++++++++++++++++ scripts/reconcile.py | 82 ++++++++ tests/test_panel_api.py | 69 +++++++ tests/test_reconcile.py | 199 +++++++++++++++++++ 14 files changed, 1172 insertions(+), 8 deletions(-) create mode 100644 ridgeline/reconcile.py create mode 100644 scripts/reconcile.py create mode 100644 tests/test_reconcile.py diff --git a/.gitignore b/.gitignore index b4493fc..7e4ed46 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,6 @@ all_usdt.json reports/ user_data/audit/ user_data/risk_state.json +*.reconcile.json .pytest_cache/ .ruff_cache/ diff --git a/README.md b/README.md index 30ab7ff..355bcce 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,9 @@ panel cannot start a live bot at all. | `user_data/config.private.json` | API login, JWT secret, exchange keys - **never share/commit** (loaded automatically via `add_config_files`) | | `panel/` | control panel (FastAPI + plain JS) | | `scripts/research.py` | IS/OOS backtests, walk-forward, fee stress, bias checks, go-live gates | -| `ridgeline/` | shared package: risk limits (`risk.py`, `freqtrade_risk.py`), audit trail, tear-sheet reports, alerts | +| `ridgeline/` | shared package: risk limits (`risk.py`, `freqtrade_risk.py`), audit trail, tear-sheet reports, paper-vs-replay reconciliation, alerts | | `scripts/report.py`, `scripts/watchdog.py` | tear-sheet generator; health/risk watchdog with Telegram alerts | +| `scripts/reconcile.py` | the last go-live gate: compares a paper session with a replay of the same weeks | | `tests/`, `.github/workflows/ci.yml` | test suite (risk, audit, lookahead, universe, panel, hygiene) run by GitHub Actions | | `Dockerfile`, `docker-compose.yml` | 24/7 deployment: bot + monitor-mode panel + watchdog | | `docs/OPERATIONS.md` | runbook: risk limits, kill switch, alerts, VPS deployment, incidents, monthly routine | @@ -150,6 +151,36 @@ Then it must paper-trade for **4+ weeks** with results close to a replay of the same weeks. If nothing passes, the answer is "don't go live yet" - not "loosen the gates". +### Paper vs replay (the last gate) + +Use the panel's **Paper trading → Paper vs replay** card, or run: + +```bash +python scripts/reconcile.py +``` + +It replays the exact period the session ran, with the same strategy, pairs and +starting balance. Then it matches the trades one by one (same pair, entries +within 1.5 candles). The session is "close to the replay" when all of these hold: + +- it ran for at least 28 days +- at least 80% of trades happened in both +- realised return is within 2 percentage points of the replay +- fills cost at most 0.3% per side compared with the replay's candle prices + +The result also splits the return gap into three parts: +- trades in both, which shows execution differences +- paper-only trades +- replay-only trades + +It flags anything the replay can't reproduce: +- manual pauses, resumes and flattens +- drawdown halts +- strategy code or parameters that changed mid-session + +The Research tab shows the newest result for each strategy. +See [docs/OPERATIONS.md](docs/OPERATIONS.md#paper-vs-replay). + Plain backtests still work as usual: ```bash @@ -229,6 +260,7 @@ The tests cover: - audit tamper detection - a lookahead check: signals must not change when future candles are removed - point-in-time universe selection +- paper-vs-replay trade matching, gap breakdown and checks - the panel's dry-run guard and kill-switch sequence - repo hygiene: no secrets, and no live config in git diff --git a/RESEARCH.md b/RESEARCH.md index dff261a..bba2fae 100644 --- a/RESEARCH.md +++ b/RESEARCH.md @@ -113,6 +113,10 @@ The gap between the IS results is the most important finding: ## Next steps 1. **Paper-trade TrendRider4h for 4+ weeks** from the panel. Use Reset wallet and pick TrendRider4h. `config.json` now holds today's point-in-time top 25. + - Then run **Paper vs replay** on that session, or + `python scripts/reconcile.py `. + - That's the last gate: the paper results must be close to a replay of + the same weeks. 2. **Re-run `research.py gates` monthly.** New data adds OOS trades, and the 100-trade gate will be settled honestly. 3. **Optionally re-hyperopt TrendRider4h** on point-in-time IS universes. Treat diff --git a/docs/OPERATIONS.md b/docs/OPERATIONS.md index 9301d58..55a795c 100644 --- a/docs/OPERATIONS.md +++ b/docs/OPERATIONS.md @@ -10,6 +10,7 @@ How to run ridgeline 24/7, watch it, and act when something goes wrong. - [Deploying on a VPS (Docker)](#deploying-on-a-vps-docker) - [Incident checklist](#incident-checklist) - [Monthly routine](#monthly-routine) +- [Paper vs replay](#paper-vs-replay) - [Reports](#reports) --- @@ -161,11 +162,73 @@ git pull && docker compose up -d --build python scripts/research.py universe --download --write-config # refresh data + live pair list python scripts/research.py gates # re-test every strategy on new OOS data python scripts/report.py --db user_data/paper/.sqlite --month YYYY-MM +python scripts/reconcile.py # paper vs replay of the same weeks ``` If you change the pair list or the strategy, restart the bot: `docker compose restart bot`, or Reset in the panel. +## Paper vs replay + +The last go-live gate: 4+ weeks of paper trading whose results are close to a +replay (backtest) of the same weeks. Run it from **Paper trading → Paper vs +replay** in the panel, or from the command line: + +```bash +python scripts/reconcile.py # a panel session +python scripts/reconcile.py --db user_data/tradesv3.docker.sqlite --log user_data/logs/bot.log # the Docker bot +``` + +**What it does.** +1. Tops up candle data for the session's pairs. +2. Replays the session's period, starting at the candle its first decision + used and using the same strategy, pairs, starting balance and max open trades. +3. Matches trades: same pair, entries at most 1.5 candles apart. + +The result is saved next to the session's database as +`.reconcile.json`. The Research tab shows the newest result for each +strategy. + +**Where the settings come from.** A session started from the panel records +its strategy, pair list, balance, start time and a fingerprint of the +strategy code in `.meta.json`. That matters because `config.json`'s +pair list changes monthly. Older sessions and the Docker bot fall back to the +bot's log and database. `--strategy`, `--pairs`, `--balance`, `--start` and +`--end` override any of them. + +**Checks.** All must pass: + +| Check | Target | Why | +|---|---|---| +| Length | ≥ 28 days | Long enough to see a few trades and some market change | +| Trades in both | ≥ 80% | Signals fire the same way live as in the backtest | +| Return gap | ≤ 2 percentage points | The backtest's results are reachable | +| Fill cost | ≤ 0.3% per side | Fills land near the candle prices the backtest assumes | + +Fill cost is the average difference between paper and replay prices. It's +positive when paper paid more on entry or received less on exit. Exits only +count when both sides left for the same reason. + +**Reading a gap.** The return gap is split into three parts: +- **trades in both**: execution, meaning fills, stop timing and exit prices +- **paper-only trades** +- **replay-only trades** + +One-sided trades usually come from: +- an entry order that didn't fill within its 10-minute timeout +- a different equity, so a risk limit or the open-trade cap blocked one side +- signals right at the start or end of the period + +The result notes things the replay can't reproduce, so check those first: +- manual pause, resume or flatten (from the audit trail) +- drawdown halts, which need a manual resume live but resume automatically in backtests +- strategy code or parameters changed during the session +- paper trades newer than the latest closed candle + +**If it fails.** Don't loosen the targets. Find out why the two diverged. If +the backtest assumptions are wrong (for example, real fills are consistently +worse), fix the research model and re-run the gates before trying again. + ## Reports Two ways to get a tear sheet: diff --git a/panel/app.py b/panel/app.py index 89d202f..fae8ff7 100644 --- a/panel/app.py +++ b/panel/app.py @@ -12,8 +12,9 @@ from panel.bot import MONITOR_MODE, PaperBot, PaperBotError from panel.common import USERDIR, list_strategies, load_json -from panel.replay import REPLAY_DIR, ReplayJobs +from panel.replay import REPLAY_DIR, BacktestError, ReplayJobs, SessionReplays from ridgeline import audit +from ridgeline.reconcile import session_info from ridgeline.report import build_tearsheet, load_trades_backtest, load_trades_db, session_balance STATIC = Path(__file__).parent / "static" @@ -23,6 +24,7 @@ bot = PaperBot() replays = ReplayJobs() +session_replays = SessionReplays() class PaperStart(BaseModel): @@ -149,11 +151,30 @@ def _valid_month(month: Optional[str]) -> Optional[str]: return month or None -@app.get("/api/report", response_class=HTMLResponse) -def paper_report(session: str, month: Optional[str] = None): - db = USERDIR / "paper" / f"{_valid_id(session)}.sqlite" +def _session_db(session_id: str) -> Path: + db = USERDIR / "paper" / f"{_valid_id(session_id)}.sqlite" if not db.exists(): raise HTTPException(404, "No such paper session") + return db + + +@app.post("/api/paper/sessions/{session_id}/reconcile") +def reconcile_start(session_id: str): + db = _session_db(session_id) + try: + return session_replays.submit(session_info(db)) + except (ValueError, BacktestError) as e: + raise HTTPException(409, str(e)) + + +@app.get("/api/paper/sessions/{session_id}/reconcile") +def reconcile_get(session_id: str): + return session_replays.get(session_id, _session_db(session_id)) or {"status": "none"} + + +@app.get("/api/report", response_class=HTMLResponse) +def paper_report(session: str, month: Optional[str] = None): + db = _session_db(session) try: trades = load_trades_db(db) return build_tearsheet(trades, session_balance(db), title="Ridgeline - paper trading report", @@ -202,6 +223,25 @@ def replay_history(): return replays.history() +def _latest_reconciliations() -> dict: + """Newest paper-vs-replay result per strategy (panel sessions and the + Docker bot's database), for the last go-live gate.""" + out = {} + for path in [*(USERDIR / "paper").glob("*.reconcile.json"), *USERDIR.glob("*.reconcile.json")]: + r = load_json(path, None) or {} + if r.get("status") != "done": + continue + strategy = r["session"]["strategy"] + if strategy not in out or r["generated"] > out[strategy]["generated"]: + out[strategy] = {"session_id": r["session"]["session_id"], "generated": r["generated"], + "days": r["period"]["days"], "close_to_replay": r["close_to_replay"], + "passed": sum(c["pass"] for c in r["checks"]), "checks": len(r["checks"])} + return out + + @app.get("/api/research") def research(): - return load_json(USERDIR / "research" / "latest.json", None) or {} + report = load_json(USERDIR / "research" / "latest.json", None) or {} + if report: + report["paper_checks"] = _latest_reconciliations() + return report diff --git a/panel/bot.py b/panel/bot.py index dbcf5e3..5f232ca 100644 --- a/panel/bot.py +++ b/panel/bot.py @@ -29,6 +29,7 @@ from panel.common import FREQTRADE, ROOT, USERDIR, config_args, load_json, merged_config from ridgeline import audit +from ridgeline.reconcile import strategy_fingerprint from ridgeline.risk import RiskLimits, build_state, limits_summary, load_halt, set_halt MONITOR_MODE = os.environ.get("PANEL_MODE", "").lower() == "monitor" @@ -110,6 +111,18 @@ def start(self, balance: float, strategy: str) -> dict: }, indent=2)) args = [*config_args(), "-c", str(session_cfg)] self._verify_dry_run(args) + # What this session runs, for reconciling it with a replay later: + # config.json's pair list changes monthly, and code can change mid-session. + cfg = merged_config() + (PAPER_DIR / f"{session_id}.meta.json").write_text(json.dumps({ + "session_id": session_id, + "strategy": strategy, + "balance": balance, + "pairs": cfg.get("exchange", {}).get("pair_whitelist", []), + "max_open_trades": cfg.get("max_open_trades"), + "started": datetime.now(timezone.utc).isoformat(timespec="seconds"), + "code": strategy_fingerprint(strategy), + }, indent=2)) log_path = PAPER_DIR / f"{session_id}.log" cmd = [*FREQTRADE, "trade", *args, "--strategy", strategy, "--logfile", str(log_path)] @@ -305,6 +318,7 @@ def sessions(self) -> list[dict]: rows = [] for db in sorted(PAPER_DIR.glob("*.sqlite"), reverse=True): cfg = load_json(db.with_suffix(".config.json"), {}) or {} + meta = load_json(db.with_suffix(".meta.json"), {}) or {} rows.append({"session_id": db.stem, "balance": cfg.get("dry_run_wallet"), - "size_kb": round(db.stat().st_size / 1024, 1)}) + "strategy": meta.get("strategy"), "size_kb": round(db.stat().st_size / 1024, 1)}) return rows diff --git a/panel/replay.py b/panel/replay.py index 1846300..0c57f1c 100644 --- a/panel/replay.py +++ b/panel/replay.py @@ -1,6 +1,8 @@ # Fast historical replay: run a Freqtrade backtest with a chosen starting # balance and date range, then reduce the result to what the UI and the # research scripts need (metrics, equity curve vs buy-and-hold, trades). +# Also replays a paper session's exact period to reconcile it against paper +# trading (ridgeline/reconcile.py has the comparison itself). import json import re @@ -15,8 +17,12 @@ import pandas as pd from panel.common import DATADIR, FREQTRADE, USERDIR, config_args +from ridgeline import audit +from ridgeline.reconcile import SessionInfo, load_paper_trades, load_replay_trades, reconcile, strategy_timeframe REPLAY_DIR = USERDIR / "replays" +# Daily EMA200 filters need ~200 days of history before the first candle. +WARMUP_DAYS = 250 class BacktestError(RuntimeError): @@ -67,6 +73,92 @@ def run_backtest( return summarize(outdir, strategy) +def download_data(pairs: list[str], since: pd.Timestamp, log_path: Path, + timeframes: tuple[str, ...] = ("1h", "4h", "1d")) -> None: + """Top up candle data for these pairs to the latest closed candle.""" + cmd = [*FREQTRADE, "download-data", *config_args(), "--pairs", *pairs, + "--timeframes", *timeframes, "--timerange", f"{since:%Y%m%d}-"] + with open(log_path, "w", encoding="utf-8", errors="replace") as log: + proc = subprocess.run(cmd, stdout=log, stderr=subprocess.STDOUT) + if proc.returncode != 0: + tail = log_path.read_text(encoding="utf-8", errors="replace").splitlines()[-15:] + raise BacktestError("Data download failed:\n" + "\n".join(tail)) + + +def replay_window(info: SessionInfo) -> tuple[str, pd.Timestamp]: + """The strategy's timeframe and the replay's first candle: the one the + session's first decision was based on. Raises if it hasn't closed yet.""" + timeframe = strategy_timeframe(info.strategy) + start = info.start.floor(pd.Timedelta(timeframe)) + first_close = start + pd.Timedelta(timeframe) + if first_close > pd.Timestamp.now(tz="UTC"): + raise BacktestError(f"Nothing to replay yet: the session's first {timeframe} candle closes at " + f"{first_close:%Y-%m-%d %H:%M} UTC.") + return timeframe, start + + +def replay_session(info: SessionInfo, outdir: Optional[Path] = None, download: bool = True) -> dict: + """Replay a paper session's exact period (same strategy, pairs, balance) + and reconcile it with what paper trading did.""" + timeframe, start = replay_window(info) + outdir = Path(outdir or REPLAY_DIR / f"session-{info.session_id}") + outdir.mkdir(parents=True, exist_ok=True) + if download: + # BTC/USDT feeds the strategies' market-regime filter even when it isn't traded. + download_data(sorted({*info.pairs, "BTC/USDT"}), start - pd.Timedelta(days=WARMUP_DAYS), + outdir / "download.log") + run_backtest(info.strategy, f"{int(start.timestamp())}-{int(info.end.timestamp())}", info.balance, + pairs=info.pairs, max_open_trades=info.max_open_trades, outdir=outdir) + replay, meta = load_replay_trades(outdir) + return reconcile(load_paper_trades(info.db), replay, info=info, replay_end=meta["end"], + timeframe=timeframe, events=audit.tail(100_000)) + + +def reconcile_path(db: Path) -> Path: + """Where a session's latest reconciliation is kept: next to its database.""" + return Path(db).with_suffix(".reconcile.json") + + +class SessionReplays: + """Paper-vs-replay reconciliations for the panel, one at a time. The result + is written next to the session's database, so it outlives the panel.""" + + def __init__(self): + self._pool = ThreadPoolExecutor(max_workers=1) + self._lock = threading.Lock() + self._running: dict[str, dict] = {} + + def submit(self, info: SessionInfo) -> dict: + replay_window(info) # fail fast if there's nothing to replay yet + with self._lock: + if info.session_id in self._running: + return self._running[info.session_id] + job = {"status": "running", "session_id": info.session_id, + "started": datetime.now(timezone.utc).isoformat(timespec="seconds")} + self._running[info.session_id] = job + self._pool.submit(self._run, info) + return job + + def _run(self, info: SessionInfo) -> None: + try: + result = replay_session(info) + except Exception as e: # surfaced to the UI as-is + result = {"status": "error", "error": str(e), "session": info.to_dict(), + "generated": datetime.now(timezone.utc).isoformat(timespec="seconds")} + try: + reconcile_path(info.db).write_text(json.dumps(result, indent=2, default=str)) + finally: + with self._lock: + self._running.pop(info.session_id, None) + + def get(self, session_id: str, db: Path) -> Optional[dict]: + with self._lock: + if session_id in self._running: + return self._running[session_id] + path = reconcile_path(db) + return json.loads(path.read_text()) if path.exists() else None + + def summarize(outdir: Path, strategy: str) -> dict: from freqtrade.data.btanalysis import load_backtest_stats diff --git a/panel/static/app.js b/panel/static/app.js index c2a0330..f7c4099 100644 --- a/panel/static/app.js +++ b/panel/static/app.js @@ -108,6 +108,10 @@ async function refreshPaper() { } else if (session) { rows.push(["Strategy", esc(session.strategy)], ["Starting balance", fmtMoney(session.balance)]); } + if (session && session.session_id !== knownSessionId) { + knownSessionId = session.session_id; + loadReconSessions(knownSessionId); + } if (session) { rows.push([st.managed ? "Session" : "Last session", `${esc(session.session_id)}`]); rows.push(["Report", `Performance tear sheet ↗`]); @@ -198,6 +202,124 @@ $("#paper-reset").addEventListener("click", () => { paperAction(() => api("/api/paper/reset", { method: "POST", body: { balance: bal, strategy: $("#paper-strategy").value } })); }); +// ===================================================================== +// Paper vs replay +// ===================================================================== +let knownSessionId = null; +let reconPolling = null; + +const checkMark = (pass) => `${pass ? "✓" : "✗"}`; +const fmtPts = (v) => (v == null || isNaN(v) ? "–" : `${v > 0 ? "+" : ""}${Number(v).toFixed(2)} pts`); + +async function loadReconSessions(preferred) { + const sel = $("#recon-session"); + const rows = await api("/api/paper/sessions").catch(() => []); + const want = preferred || sel.value; + sel.innerHTML = rows.map((s) => ``).join(""); + if (want && rows.some((s) => s.session_id === want)) sel.value = want; + $("#recon-run").disabled = !rows.length; + if (!rows.length) { + $("#recon-status").textContent = "No paper sessions yet."; + return; + } + loadRecon(); +} + +async function loadRecon() { + const id = $("#recon-session").value; + if (!id) return; + const r = await api(`/api/paper/sessions/${encodeURIComponent(id)}/reconcile`) + .catch((e) => ({ status: "error", error: e.message })); + if (id !== $("#recon-session").value) return; // selection changed meanwhile + renderRecon(r); + if (r.status === "running") pollRecon(id); +} + +async function pollRecon(id) { + if (reconPolling === id) return; + reconPolling = id; + while (reconPolling === id && $("#recon-session").value === id) { + await new Promise((res) => setTimeout(res, 2000)); + const r = await api(`/api/paper/sessions/${encodeURIComponent(id)}/reconcile`).catch(() => null); + if (!r || $("#recon-session").value !== id) break; + renderRecon(r); + if (r.status !== "running") break; + } + if (reconPolling === id) reconPolling = null; +} + +function renderRecon(r) { + const status = $("#recon-status"); + const verdict = $("#recon-verdict"); + const result = $("#recon-result"); + $("#recon-run").disabled = r.status === "running"; + verdict.hidden = r.status !== "done"; + result.hidden = r.status !== "done"; + if (r.status === "none") { + status.textContent = "Not compared yet."; + return; + } + if (r.status === "running") { + status.textContent = "Replaying… (tops up candle data first; usually under a minute)"; + return; + } + if (r.status === "error") { + status.innerHTML = `Comparison failed: ${esc(r.error).slice(0, 600)}`; + return; + } + + verdict.className = `pill ${r.close_to_replay ? "on" : "ext"}`; + verdict.textContent = r.close_to_replay ? "Close to replay" : "Not close yet"; + status.textContent = `Compared ${r.generated.replace("T", " ").slice(0, 16)} UTC · ` + + `${r.period.start.slice(0, 16).replace("T", " ")} → ${r.period.end.slice(0, 16).replace("T", " ")} UTC (${r.period.days} days)`; + + $("#recon-checks").innerHTML = r.checks.map((c) => + `
  • ${checkMark(c.pass)}${esc(c.label)} (${c.value == null ? "n/a" : esc(c.value)})
  • `).join(""); + + const p = r.paper, rp = r.replay, m = r.matching, g = r.gap, f = r.fills; + const total = m.matched + m.paper_only + m.replay_only; + $("#recon-tiles").innerHTML = [ + tile("Paper return (realised)", fmtPct(p.return_pct), signClass(p.return_pct), `${p.closed} closed, ${p.open} open`), + tile("Replay return (realised)", fmtPct(rp.return_pct), signClass(rp.return_pct), `${rp.closed} closed, ${rp.open} open`), + tile("Gap (paper − replay)", fmtPts(g.return_gap_pp), signClass(g.return_gap_pp), + `matched ${fmtMoney(g.matched_abs, "")} · paper-only ${fmtMoney(g.paper_only_abs, "")} · replay-only ${fmtMoney(g.replay_only_abs, "")}`), + tile("Trades in both", `${m.matched} / ${total}`, "", `${m.paper_only} paper-only, ${m.replay_only} replay-only`), + tile("Fill cost per side", fmtPct(f.fill_cost_pct, 3), f.fill_cost_pct > 0 ? "neg" : "", + `entry ${fmtPct(f.entry_cost_pct, 3)} · exit ${fmtPct(f.exit_cost_pct, 3)}`), + ].join(""); + + $("#recon-warnings").innerHTML = r.warnings.map((w) => `
  • ${esc(w)}
  • `).join(""); + + const label = { matched: "Both", paper_only: "Paper only", replay_only: "Replay only" }; + table($("#recon-trades"), [ + { label: "Pair", key: "pair" }, + { label: "In", render: (t) => esc(label[t.status]), cls: (t) => (t.status === "matched" ? "" : "neg") }, + { label: "Paper entry (UTC)", render: (t) => esc(t.paper_open ?? "–") }, + { label: "Replay entry (UTC)", render: (t) => esc(t.replay_open ?? "–") }, + { label: "Entry cost", num: true, render: (t) => fmtPct(t.entry_cost_pct, 3), cls: (t) => signClass(-t.entry_cost_pct) }, + { label: "Exit (paper / replay)", render: (t) => `${esc(t.paper_exit ?? "–")} / ${esc(t.replay_exit ?? "–")}` }, + { label: "Exit cost", num: true, render: (t) => fmtPct(t.exit_cost_pct, 3), cls: (t) => signClass(-t.exit_cost_pct) }, + { label: "Paper P&L", num: true, render: (t) => fmtPct(t.paper_profit_pct), cls: (t) => signClass(t.paper_profit_pct) }, + { label: "Replay P&L", num: true, render: (t) => fmtPct(t.replay_profit_pct), cls: (t) => signClass(t.replay_profit_pct) }, + ], r.trades, { empty: "No trades on either side in this period." }); +} + +$("#recon-session").addEventListener("change", () => loadRecon()); +$("#recon-run").addEventListener("click", async () => { + const id = $("#recon-session").value; + if (!id) return; + $("#recon-run").disabled = true; + $("#recon-status").textContent = "Starting…"; + try { + renderRecon(await api(`/api/paper/sessions/${encodeURIComponent(id)}/reconcile`, { method: "POST" })); + pollRecon(id); + } catch (e) { + $("#recon-status").innerHTML = `${esc(e.message)}`; + $("#recon-run").disabled = false; + } +}); + // ===================================================================== // Replay // ===================================================================== @@ -353,6 +475,12 @@ async function loadResearch() { const entries = Object.entries(r.strategies).sort((a, b) => b[1].oos.calmar - a[1].oos.calmar); for (const [name, s] of entries) { const passed = s.gates.filter((g) => g.pass).length; + const pc = (r.paper_checks || {})[name]; + const paperGate = pc + ? `
  • ${checkMark(pc.close_to_replay)}4+ weeks of paper trading close to replay ` + + `(session ${esc(pc.session_id)}: ${pc.days} days, ${pc.passed}/${pc.checks} checks)
  • ` + : `
  • ○4+ weeks of paper trading close to replay ` + + `(not compared yet: Paper trading → Paper vs replay)
  • `; const badge = s.eligible_for_paper ? `Eligible for 4-week paper test` : `${passed}/${s.gates.length} gates passed`; @@ -366,7 +494,7 @@ async function loadResearch() {
      ${s.gates.map((g) => `
    • ${g.pass ? "✓" : "✗"}${esc(g.label)} (${esc(g.value)})
    • `).join("")} -
    • ○4+ weeks of paper trading close to replay (manual)
    • + ${paperGate}
    @@ -464,6 +592,7 @@ $("#risk-flatten").addEventListener("click", () => { `

    Monitor mode: the bot runs as a Docker service, so Start/Stop/Reset are disabled here. Risk controls still work.

    `); } await loadStrategies().catch(() => {}); + loadReconSessions(); let tab = "paper"; try { tab = localStorage.getItem("tab") || "paper"; } catch {} document.querySelector(`.tab[data-tab="${tab}"]`)?.click(); diff --git a/panel/static/index.html b/panel/static/index.html index 243d908..e6d86fb 100644 --- a/panel/static/index.html +++ b/panel/static/index.html @@ -80,6 +80,22 @@

    Open trades

    Closed trades (latest 50)

    +
    +

    Paper vs replay

    +

    Replays the exact period a session ran (same strategy, pairs and balance) and matches + the trades one by one. The last go-live gate needs 4+ weeks of paper trading with every check passing.

    +
    + + + +
    + +

    Audit log

    Every control action and risk event, hash-chained so edits or deletions are detectable.

    diff --git a/panel/static/style.css b/panel/static/style.css index 869fcce..5d69db6 100644 --- a/panel/static/style.css +++ b/panel/static/style.css @@ -158,6 +158,10 @@ tr.clickable:hover td { background: var(--surface-2); } .gate-list { list-style: none; padding: 0; margin: 0 0 12px; display: grid; gap: 4px; } .gate-list li { display: flex; gap: 8px; } .gate-list .mark { width: 16px; font-weight: 700; } +.recon-controls { margin: 12px 0; } +.recon-controls select { max-width: 100%; } +.notes { margin: 0 0 14px; padding-left: 18px; color: var(--warn); font-size: 12px; display: grid; gap: 4px; } +.notes:empty { display: none; } .wf-bars { display: flex; gap: 3px; align-items: center; height: 60px; margin-top: 6px; } .wf-bar { flex: 1; min-width: 6px; border-radius: 2px; } diff --git a/ridgeline/reconcile.py b/ridgeline/reconcile.py new file mode 100644 index 0000000..30dcf22 --- /dev/null +++ b/ridgeline/reconcile.py @@ -0,0 +1,419 @@ +"""Paper vs replay reconciliation. + +The last go-live gate: a strategy paper-trades for 4+ weeks, and the paper +results must be close to a replay (backtest) of the same weeks, run with the +same strategy, pairs and starting balance. Passing it means the backtests the +research relies on hold up in near-live execution: + - signals fire on time + - fills land near the candle prices the backtest assumes + - stops and exits behave the same way + + session_info() what a paper session ran: strategy, pairs, balance, start, end + load_paper_trades() / load_replay_trades() + match_trades() pair trades up by pair and entry time + reconcile() summary, return-gap breakdown, checks and a verdict + +Running the replay itself (data download + backtest) is replay_session() in +panel/replay.py; scripts/reconcile.py and the panel both call it. +""" + +import ast +import hashlib +import json +import re +import sqlite3 +from collections import Counter +from contextlib import closing +from dataclasses import dataclass, field +from datetime import datetime, timezone +from pathlib import Path +from typing import Optional + +import pandas as pd + +from ridgeline import ROOT, USERDIR + +STRATEGY_DIR = USERDIR / "strategies" + +MIN_DAYS = 28 +# Paper and replay entries for the same signal can be up to a candle apart: +# a session that starts mid-candle acts on the last closed candle at once, +# and an unfilled entry order is retried on the next candle. +MATCH_TOLERANCE_CANDLES = 1.5 + +CHECKS = [ + # (key, label, comparison, target) + ("days", f"Paper-traded for at least {MIN_DAYS} days", ">=", MIN_DAYS), + ("match_rate_pct", "At least 80% of trades happened in both", ">=", 80), + ("return_gap_pp", "Realised return within 2 points of the replay", "<=", 2.0), + ("fill_cost_pct", "Fills cost at most 0.3% per side vs the replay", "<=", 0.3), +] + +# Audit events the replay can't reproduce: manual actions, and drawdown halts +# (a human resumes them live; the backtest resumes after a fixed review period). +UNMODELLED_EVENTS = {"entries_paused", "trading_resumed", "flatten", "risk_halt"} + +TRADE_COLUMNS = ["pair", "open_date", "close_date", "open_rate", "close_rate", "stake", + "profit_ratio", "profit_abs", "exit_reason", "is_open"] +CLOSE_COLUMNS = ["close_date", "close_rate", "profit_ratio", "profit_abs", "exit_reason"] + +_WHITELIST_RE = re.compile(r"Whitelist with \d+ pairs: (\[[^\]]*\])") +_STRATEGY_RE = re.compile(r"Using resolved strategy (\w+)") +_TIMEFRAME_RE = re.compile(r"^\s+timeframe\s*=\s*[\"'](\w+)[\"']", re.M) + + +# ---------------------------------------------------------------- session + +@dataclass +class SessionInfo: + session_id: str + db: Path + strategy: str + pairs: list[str] + balance: float + start: pd.Timestamp + end: pd.Timestamp + max_open_trades: Optional[int] = None + warnings: list[str] = field(default_factory=list) + + def to_dict(self) -> dict: + return {"session_id": self.session_id, "strategy": self.strategy, "pairs": self.pairs, + "balance": self.balance, "start": self.start.isoformat(), "end": self.end.isoformat(), + "max_open_trades": self.max_open_trades} + + +def strategy_fingerprint(strategy: str, strategy_dir: Path = STRATEGY_DIR) -> dict[str, Optional[str]]: + """Hashes of everything that decides a strategy's trades: its code, its + hyperopt parameters and the shared risk layer.""" + files = [Path(strategy_dir) / f"{strategy}.py", Path(strategy_dir) / f"{strategy}.json", + ROOT / "ridgeline" / "risk.py", ROOT / "ridgeline" / "freqtrade_risk.py"] + return {p.name: hashlib.sha256(p.read_bytes()).hexdigest()[:16] if p.exists() else None for p in files} + + +def strategy_timeframe(strategy: str, strategy_dir: Path = STRATEGY_DIR) -> str: + match = _TIMEFRAME_RE.search((Path(strategy_dir) / f"{strategy}.py").read_text(encoding="utf-8")) + if not match: + raise ValueError(f"Couldn't find the timeframe of {strategy}") + return match.group(1) + + +def session_info(db: Path, *, log: Optional[Path] = None, strategy: Optional[str] = None, + pairs: Optional[list[str]] = None, balance: Optional[float] = None, + start: Optional[pd.Timestamp] = None, end: Optional[pd.Timestamp] = None) -> SessionInfo: + """What a session ran, from the best source available. Explicit arguments win. + After them, in order: + - .meta.json, written by the panel when a session starts + - the bot's log (log, or .log, with its rotated backups) + - the database itself + """ + db = Path(db) + meta = _load_json(db.with_suffix(".meta.json")) + logs = _log_files(Path(log) if log else db.with_suffix(".log")) + warnings = [] + + strategy = strategy or meta.get("strategy") or _first_match(logs, _STRATEGY_RE) or _db_strategy(db) + if not strategy: + raise ValueError(f"Couldn't tell which strategy {db.name} ran. Pass it explicitly.") + + if not pairs: + pairs = meta.get("pairs") + if not pairs: + lists = [ast.literal_eval(m) for m in _all_matches(logs, _WHITELIST_RE)] + if not lists: + raise ValueError(f"Couldn't tell which pairs {db.name} traded (no meta file and no whitelist " + "in its log). Pass them explicitly.") + pairs = lists[0] + if any(set(other) != set(pairs) for other in lists[1:]): + warnings.append("The pair list changed during the session (a restart with a new config?). " + "The replay uses the first one.") + + if balance is None: + balance = meta.get("balance") or _load_json(db.with_suffix(".config.json")).get("dry_run_wallet") + if balance is None: + balance = _load_json(USERDIR / "config.json").get("dry_run_wallet", 1000) + warnings.append(f"Starting balance not recorded for this session; assuming {balance} from config.json.") + + start = _utc(start) or _utc(meta.get("started")) or _db_start(db) + if start is None: + raise ValueError(f"Couldn't tell when {db.name} started. Pass the start explicitly.") + if end is None: + # The bot logs a heartbeat every minute, so the newest log write is when + # the session was last alive (about now, if it's still running). + if logs: + end = pd.Timestamp(max(p.stat().st_mtime for p in logs), unit="s", tz="UTC") + else: + end = pd.Timestamp.now(tz="UTC") + warnings.append("No bot log found, so the session is assumed to still be running.") + end = _utc(end) + + recorded = meta.get("code") + if recorded: + current = strategy_fingerprint(strategy) + changed = [name for name, digest in recorded.items() if current.get(name) != digest] + if changed: + warnings.append(f"Changed since the session started: {', '.join(changed)}. " + "The replay runs the current version, so some differences are expected.") + + return SessionInfo(session_id=db.stem, db=db, strategy=strategy, pairs=list(pairs), balance=float(balance), + start=start, end=end, max_open_trades=meta.get("max_open_trades"), warnings=warnings) + + +def _load_json(path: Path) -> dict: + try: + data = json.loads(Path(path).read_text()) + return data if isinstance(data, dict) else {} + except (OSError, ValueError): + return {} + + +def _utc(value) -> Optional[pd.Timestamp]: + if value is None or value == "": + return None + ts = pd.Timestamp(value) + return ts.tz_localize("UTC") if ts.tzinfo is None else ts.tz_convert("UTC") + + +def _log_files(log: Path) -> list[Path]: + """The log and its rotated backups (log.1 is newer than log.2), oldest first.""" + backups = sorted(log.parent.glob(log.name + ".*"), key=lambda p: -int(p.suffix[1:]) if p.suffix[1:].isdigit() else 0) + return [p for p in [*backups, log] if p.is_file()] + + +def _all_matches(logs: list[Path], regex: re.Pattern) -> list[str]: + return [m.group(1) for p in logs for m in regex.finditer(p.read_text(encoding="utf-8", errors="replace"))] + + +def _first_match(logs: list[Path], regex: re.Pattern) -> Optional[str]: + for p in logs: + m = regex.search(p.read_text(encoding="utf-8", errors="replace")) + if m: + return m.group(1) + return None + + +def _db_query(db: Path, sql: str): + if not Path(db).exists(): + return None + with closing(sqlite3.connect(f"file:{Path(db).as_posix()}?mode=ro", uri=True)) as con: + try: + row = con.execute(sql).fetchone() + except sqlite3.Error: + return None + return row[0] if row else None + + +def _db_strategy(db: Path) -> Optional[str]: + return _db_query(db, "SELECT strategy FROM trades WHERE strategy IS NOT NULL LIMIT 1") + + +def _db_start(db: Path) -> Optional[pd.Timestamp]: + # Freqtrade records its first start in the database (naive UTC). + return _utc(_db_query(db, "SELECT datetime_value FROM KeyValueStore WHERE key = 'bot_start_time'")) + + +# ---------------------------------------------------------------- trades + +def load_paper_trades(db: Path) -> pd.DataFrame: + with closing(sqlite3.connect(f"file:{Path(db).as_posix()}?mode=ro", uri=True)) as con: + df = pd.read_sql_query( + "SELECT pair, open_date, close_date, open_rate, close_rate, stake_amount AS stake, " + "close_profit AS profit_ratio, close_profit_abs AS profit_abs, exit_reason, is_open FROM trades", con) + return _normalise(df) + + +def load_replay_trades(directory: Path) -> tuple[pd.DataFrame, dict]: + """Trades from a backtest result directory, plus its start, end and timeframe. + Trades the backtest force-closed at its last candle are still open in + reality, so they come back open, the same way paper shows them.""" + from freqtrade.data.btanalysis import load_backtest_stats + + strat = next(iter(load_backtest_stats(directory)["strategy"].values())) + df = pd.DataFrame(strat["trades"]).reindex(columns=[*TRADE_COLUMNS, "stake_amount"]) + df["stake"] = df.pop("stake_amount") + df = _normalise(df) + end = pd.Timestamp(strat["backtest_end"], tz="UTC") + left_open = (df["exit_reason"] == "force_exit") & (df["close_date"] >= end) + df.loc[left_open, CLOSE_COLUMNS] = None + df.loc[left_open, "is_open"] = True + return df, {"start": pd.Timestamp(strat["backtest_start"], tz="UTC"), "end": end, + "timeframe": strat["timeframe"], "starting_balance": float(strat["starting_balance"])} + + +def _normalise(df: pd.DataFrame) -> pd.DataFrame: + df = df.copy() + for col in ("open_date", "close_date"): + df[col] = pd.to_datetime(df[col], utc=True, errors="coerce") + for col in ("open_rate", "close_rate", "stake", "profit_ratio", "profit_abs"): + df[col] = pd.to_numeric(df[col], errors="coerce") + df["exit_reason"] = df["exit_reason"].astype(object) + df["is_open"] = df["is_open"].fillna(False).astype(bool) + return df[TRADE_COLUMNS].sort_values("open_date").reset_index(drop=True) + + +def match_trades(paper: pd.DataFrame, replay: pd.DataFrame, + tolerance: pd.Timedelta) -> tuple[list[tuple[int, int]], list[int], list[int]]: + """Pair each paper trade with the replay trade on the same pair whose entry + is closest in time, within `tolerance`. Closest pairs are matched first. + Returns (matched index pairs, paper-only indexes, replay-only indexes).""" + candidates = [] + for i, p in paper.iterrows(): + same_pair = replay[replay["pair"] == p["pair"]] + for j, opened in same_pair["open_date"].items(): + gap = abs(p["open_date"] - opened) + if gap <= tolerance: + candidates.append((gap, i, j)) + matched, used_p, used_r = [], set(), set() + for _, i, j in sorted(candidates): + if i not in used_p and j not in used_r: + matched.append((i, j)) + used_p.add(i) + used_r.add(j) + return (sorted(matched), [i for i in paper.index if i not in used_p], + [j for j in replay.index if j not in used_r]) + + +# ---------------------------------------------------------------- compare + +def _check(op: str, value, target) -> bool: + if value is None: + return False + return {">=": value >= target, "<=": value <= target}[op] + + +def _realised(t) -> float: + return 0.0 if t["is_open"] or pd.isna(t["profit_abs"]) else float(t["profit_abs"]) + + +def _r(value, digits: int = 2): + return None if value is None or pd.isna(value) else round(float(value), digits) + + +def _when(ts) -> Optional[str]: + return None if pd.isna(ts) else f"{ts:%Y-%m-%d %H:%M}" + + +def reconcile(paper: pd.DataFrame, replay: pd.DataFrame, *, info: SessionInfo, replay_end: pd.Timestamp, + timeframe: str, events: Optional[list[dict]] = None) -> dict: + """Compare a paper session's trades with a replay of the same period. + + `replay_end` is the open time of the replay's last candle. Paper trades + opened after that candle closes can't be in the replay yet: they're + left out, and paper trades closed after it count as still open. + Fill costs are positive when paper did worse than the replay: it paid more + on entry or received less on exit. + """ + tf = pd.Timedelta(timeframe) + start = info.start.floor(tf) + cutoff = min(info.end, replay_end + tf) + paper, replay = _normalise(paper), _normalise(replay) + + too_recent = paper["open_date"] >= cutoff + paper = paper[~too_recent].copy() + late = paper["close_date"] >= cutoff + paper.loc[late, CLOSE_COLUMNS] = None + paper.loc[late, "is_open"] = True + + matched, paper_only, replay_only = match_trades(paper, replay, tf * MATCH_TOLERANCE_CANDLES) + + rows, entry_costs, exit_costs = [], [], [] + both_closed = same_exit = 0 + gap_matched = 0.0 + for i, j in matched: + p, r = paper.loc[i], replay.loc[j] + entry_cost = (p["open_rate"] / r["open_rate"] - 1) * 100 + entry_costs.append(entry_cost) + exit_cost = None + if not p["is_open"] and not r["is_open"]: + both_closed += 1 + # Exit prices are only comparable when both sides left for the same reason. + if p["exit_reason"] == r["exit_reason"]: + same_exit += 1 + exit_cost = (1 - p["close_rate"] / r["close_rate"]) * 100 + exit_costs.append(exit_cost) + gap_matched += _realised(p) - _realised(r) + rows.append(_row("matched", p, r, entry_cost, exit_cost)) + rows += [_row("paper_only", paper.loc[i], None) for i in paper_only] + rows += [_row("replay_only", None, replay.loc[j]) for j in replay_only] + rows.sort(key=lambda row: row["paper_open"] or row["replay_open"]) + + def side(df: pd.DataFrame) -> dict: + closed = df[~df["is_open"]] + realised = float(closed["profit_abs"].sum()) + return {"trades": len(df), "closed": len(closed), "open": int(df["is_open"].sum()), + "realised_abs": round(realised, 2), "return_pct": round(realised / info.balance * 100, 2)} + + paper_side, replay_side = side(paper), side(replay) + total = len(matched) + len(paper_only) + len(replay_only) + costs = entry_costs + exit_costs + gap = paper_side["return_pct"] - replay_side["return_pct"] + values = { + "days": round((cutoff - info.start).total_seconds() / 86400, 1), + "match_rate_pct": round(100 * len(matched) / total, 1) if total else None, + "return_gap_pp": round(abs(gap), 2), + "fill_cost_pct": _r(sum(costs) / len(costs), 3) if costs else None, + } + checks = [{"key": key, "label": label, "value": values[key], "pass": _check(op, values[key], target)} + for key, label, op, target in CHECKS] + + warnings = list(info.warnings) + if too_recent.any(): + warnings.append(f"{int(too_recent.sum())} paper trade(s) opened after the replay's last candle " + f"({_when(cutoff)} UTC) and aren't compared yet.") + if info.end - (replay_end + tf) > tf: + warnings.append(f"The replay's data stops at {_when(replay_end + tf)} UTC, before the session's last " + f"activity ({_when(info.end)} UTC). Download fresh data and run it again.") + if not total: + warnings.append("No trades on either side yet, so there's nothing to compare.") + unmodelled = [e for e in events or [] if e.get("event") in UNMODELLED_EVENTS + and info.start <= pd.Timestamp(e["ts"]) <= info.end] + if unmodelled: + listed = ", ".join(f"{name} x{n}" for name, n in Counter(e["event"] for e in unmodelled).items()) + warnings.append(f"During the session: {listed}. The replay can't reproduce manual actions or " + "the manual resume after a halt, so expect differences around them.") + + return { + "status": "done", + "generated": datetime.now(timezone.utc).isoformat(timespec="seconds"), + "session": info.to_dict(), + "timeframe": timeframe, + "period": {"start": start.isoformat(), "end": cutoff.isoformat(), "days": values["days"]}, + "paper": paper_side, + "replay": replay_side, + "matching": {"matched": len(matched), "paper_only": len(paper_only), "replay_only": len(replay_only), + "match_rate_pct": values["match_rate_pct"], + "tolerance_hours": tf.total_seconds() * MATCH_TOLERANCE_CANDLES / 3600}, + "fills": { + "entry_cost_pct": _r(sum(entry_costs) / len(entry_costs), 3) if entry_costs else None, + "exit_cost_pct": _r(sum(exit_costs) / len(exit_costs), 3) if exit_costs else None, + "fill_cost_pct": values["fill_cost_pct"], + "same_exit_reason_pct": round(100 * same_exit / both_closed, 1) if both_closed else None, + }, + # Paper minus replay, in stake currency: the sum of the three parts is the total. + "gap": {"total_abs": round(paper_side["realised_abs"] - replay_side["realised_abs"], 2), + "matched_abs": round(gap_matched, 2), + "paper_only_abs": round(sum(_realised(paper.loc[i]) for i in paper_only), 2), + "replay_only_abs": round(-sum(_realised(replay.loc[j]) for j in replay_only), 2), + "return_gap_pp": round(gap, 2)}, + "checks": checks, + "close_to_replay": all(c["pass"] for c in checks), + "warnings": warnings, + "trades": rows, + } + + +def _row(status: str, p, r, entry_cost=None, exit_cost=None) -> dict: + """One line of the trade-by-trade comparison; p or r is None for a one-sided trade.""" + def side(t) -> dict: + if t is None: + return {"open": None, "entry": None, "exit": None, "profit_pct": None} + return {"open": _when(t["open_date"]), "entry": _r(t["open_rate"], 8), + "exit": "open" if t["is_open"] else t["exit_reason"], "profit_pct": _r(t["profit_ratio"] * 100)} + + ps, rs = side(p), side(r) + return { + "pair": (p if p is not None else r)["pair"], "status": status, + "paper_open": ps["open"], "replay_open": rs["open"], + "paper_entry": ps["entry"], "replay_entry": rs["entry"], "entry_cost_pct": _r(entry_cost, 3), + "paper_exit": ps["exit"], "replay_exit": rs["exit"], "exit_cost_pct": _r(exit_cost, 3), + "paper_profit_pct": ps["profit_pct"], "replay_profit_pct": rs["profit_pct"], + } diff --git a/scripts/reconcile.py b/scripts/reconcile.py new file mode 100644 index 0000000..e220011 --- /dev/null +++ b/scripts/reconcile.py @@ -0,0 +1,82 @@ +"""Compare a paper-trading session with a replay of the same weeks. + +The last go-live gate: 4+ weeks of paper trading whose results are close to +a replay (backtest) of the same period, with the same strategy, pairs and +balance. This tops up candle data, runs that replay, matches the trades and +checks how close they are. + +Usage (from the project root, with the venv Python): + python scripts/reconcile.py 20261011-010946 a panel session in user_data/paper/ + python scripts/reconcile.py --db user_data/tradesv3.docker.sqlite --log user_data/logs/bot.log + the Docker bot + +What the session ran is read from its files; --strategy, --pairs, --balance, +--start and --end override it. --no-download uses the data already on disk. + +Writes .reconcile.json next to the database; the panel's Research +tab shows the newest result per strategy. +""" + +import argparse +import json +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(ROOT)) + +from panel.common import USERDIR # noqa: E402 +from panel.replay import reconcile_path, replay_session # noqa: E402 +from ridgeline.reconcile import session_info # noqa: E402 + + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + src = ap.add_mutually_exclusive_group(required=True) + src.add_argument("session", nargs="?", help="panel paper session id (user_data/paper/.sqlite)") + src.add_argument("--db", type=Path, help="any paper/dry-run Freqtrade SQLite database") + ap.add_argument("--log", type=Path, help="the bot's log file (default: .log)") + ap.add_argument("--strategy") + ap.add_argument("--pairs", nargs="+") + ap.add_argument("--balance", type=float) + ap.add_argument("--start", help="UTC, e.g. 2026-10-01 or '2026-10-01 14:00'") + ap.add_argument("--end", help="UTC (default: the bot's last log write)") + ap.add_argument("--no-download", action="store_true", help="don't top up candle data first") + args = ap.parse_args() + + db = args.db or USERDIR / "paper" / f"{args.session}.sqlite" + if not db.exists(): + sys.exit(f"No database at {db}") + info = session_info(db, log=args.log, strategy=args.strategy, pairs=args.pairs, balance=args.balance, + start=args.start, end=args.end) + print(f"{info.session_id}: {info.strategy}, {len(info.pairs)} pairs, {info.balance:g} starting balance, " + f"{info.start:%Y-%m-%d %H:%M} -> {info.end:%Y-%m-%d %H:%M} UTC") + print("Replaying the same period...") + result = replay_session(info, download=not args.no_download) + reconcile_path(db).write_text(json.dumps(result, indent=2, default=str)) + + p, r, m, g = result["paper"], result["replay"], result["matching"], result["gap"] + print(f"\n{'':10}{'trades':>8}{'closed':>8}{'realised':>11}{'return':>9}") + for name, s in (("paper", p), ("replay", r)): + print(f"{name:10}{s['trades']:>8}{s['closed']:>8}{s['realised_abs']:>11.2f}{s['return_pct']:>8.2f}%") + print(f"\nmatched {m['matched']}, paper only {m['paper_only']}, replay only {m['replay_only']}") + print(f"return gap {g['return_gap_pp']:+.2f} points = matched trades {g['matched_abs']:+.2f} " + f"+ paper-only {g['paper_only_abs']:+.2f} + replay-only {g['replay_only_abs']:+.2f} (stake currency)") + for row in result["trades"]: + print(f" {row['status']:<12}{row['pair']:<14}{row['paper_open'] or '-':<18}{row['replay_open'] or '-':<18}" + f"entry {_fmt(row['entry_cost_pct'])} exit {row['paper_exit'] or '-'} / {row['replay_exit'] or '-'}") + print() + for c in result["checks"]: + print(f" [{'PASS' if c['pass'] else 'FAIL'}] {c['label']} (got {c['value']})") + for w in result["warnings"]: + print(f" note: {w}") + verdict = "CLOSE to the replay" if result["close_to_replay"] else "NOT close to the replay (yet)" + print(f"\nPaper trading is {verdict}.\nwritten to {reconcile_path(db)}") + + +def _fmt(cost) -> str: + return "-" if cost is None else f"{cost:+.3f}%" + + +if __name__ == "__main__": + main() diff --git a/tests/test_panel_api.py b/tests/test_panel_api.py index 056d097..283c394 100644 --- a/tests/test_panel_api.py +++ b/tests/test_panel_api.py @@ -1,5 +1,6 @@ """Panel API: input validation, the dry-run safety guard, and the kill switch.""" +import json from types import SimpleNamespace import pytest @@ -66,3 +67,71 @@ def fake_call(method, path, **kw): def test_report_rejects_path_tricks(client): assert client.get("/api/report", params={"session": "../config"}).status_code == 400 + + +# ---------------------------------------------------------------- paper vs replay + +@pytest.fixture +def userdir(tmp_path, monkeypatch): + monkeypatch.setattr(app_mod, "USERDIR", tmp_path) + (tmp_path / "paper").mkdir(exist_ok=True) + return tmp_path + + +def make_session(userdir, session_id, meta=None): + import sqlite3 + + with sqlite3.connect(userdir / "paper" / f"{session_id}.sqlite") as con: + con.execute("CREATE TABLE trades (pair TEXT, strategy TEXT)") + con.close() + if meta: + (userdir / "paper" / f"{session_id}.meta.json").write_text(json.dumps(meta)) + + +def test_reconcile_rejects_bad_and_unknown_sessions(client, userdir): + assert client.post("/api/paper/sessions/bad.id/reconcile").status_code == 400 + assert client.get("/api/paper/sessions/20990101-000000/reconcile").status_code == 404 + + +def test_reconcile_needs_to_know_the_pairs(client, userdir): + make_session(userdir, "s1") + r = client.post("/api/paper/sessions/s1/reconcile") + assert r.status_code == 409 and "which" in r.json()["detail"] + + +def test_reconcile_submits_what_the_session_ran(client, userdir, monkeypatch): + make_session(userdir, "s2", {"strategy": "TrendRider4h", "pairs": ["BTC/USDT"], "balance": 300, + "started": "2026-09-01T00:00:00+00:00"}) + submitted = [] + monkeypatch.setattr(app_mod.session_replays, "submit", + lambda info: submitted.append(info) or {"status": "running", "session_id": info.session_id}) + assert client.post("/api/paper/sessions/s2/reconcile").json()["status"] == "running" + assert (submitted[0].strategy, submitted[0].pairs, submitted[0].balance) == ("TrendRider4h", ["BTC/USDT"], 300) + assert client.get("/api/paper/sessions/s2/reconcile").json() == {"status": "none"} + + +def test_research_shows_newest_reconciliation_per_strategy(client, userdir): + (userdir / "research").mkdir() + (userdir / "research" / "latest.json").write_text(json.dumps({"strategies": {}})) + + def result(session_id, generated, ok, status="done"): + return {"status": status, "generated": generated, "close_to_replay": ok, + "session": {"session_id": session_id, "strategy": "TrendRider4h"}, "period": {"days": 30.0}, + "checks": [{"pass": ok}, {"pass": True}]} + + for sid, gen, ok, status in [("old", "2026-10-01T00:00:00+00:00", False, "done"), + ("new", "2026-10-09T00:00:00+00:00", True, "done"), + ("broken", "2026-10-10T00:00:00+00:00", True, "error")]: + (userdir / "paper" / f"{sid}.reconcile.json").write_text(json.dumps(result(sid, gen, ok, status))) + checks = client.get("/api/research").json()["paper_checks"] + assert checks["TrendRider4h"]["session_id"] == "new" and checks["TrendRider4h"]["passed"] == 2 + + +def test_reconcile_refuses_until_the_first_candle_closes(client, userdir): + from datetime import datetime, timezone + + make_session(userdir, "s3", {"strategy": "TrendRider4h", "pairs": ["BTC/USDT"], "balance": 300, + "started": datetime.now(timezone.utc).isoformat()}) + r = client.post("/api/paper/sessions/s3/reconcile") + assert r.status_code == 409 and "Nothing to replay yet" in r.json()["detail"] + assert not (userdir / "paper" / "s3.reconcile.json").exists() diff --git a/tests/test_reconcile.py b/tests/test_reconcile.py new file mode 100644 index 0000000..852fa7a --- /dev/null +++ b/tests/test_reconcile.py @@ -0,0 +1,199 @@ +"""Paper vs replay reconciliation: session discovery, trade matching, checks.""" + +import json +import sqlite3 + +import pandas as pd +import pytest + +from ridgeline.reconcile import ( + SessionInfo, + load_paper_trades, + load_replay_trades, + match_trades, + reconcile, + session_info, + strategy_fingerprint, + strategy_timeframe, +) + +T = lambda s: pd.Timestamp(s, tz="UTC") # noqa: E731 +H4 = pd.Timedelta("4h") + + +def trade(pair, opened, closed=None, open_rate=100.0, close_rate=None, profit_abs=None, exit_reason=None, stake=100.0): + is_open = closed is None + return {"pair": pair, "open_date": T(opened), "close_date": None if is_open else T(closed), + "open_rate": open_rate, "close_rate": close_rate, "stake": stake, + "profit_ratio": None if is_open else profit_abs / stake, "profit_abs": profit_abs, + "exit_reason": exit_reason, "is_open": is_open} + + +def frame(*trades): + df = pd.DataFrame(list(trades), columns=["pair", "open_date", "close_date", "open_rate", "close_rate", "stake", + "profit_ratio", "profit_abs", "exit_reason", "is_open"]) + for col in ("open_date", "close_date"): + df[col] = pd.to_datetime(df[col], utc=True) + return df + + +def info(start="2026-09-01 14:09", end="2026-10-05 10:00", balance=1000.0): + return SessionInfo(session_id="s1", db=None, strategy="TrendRider4h", pairs=["BTC/USDT", "ETH/USDT"], + balance=balance, start=T(start), end=T(end)) + + +def test_matching_is_by_pair_and_nearest_entry(): + paper = frame(trade("BTC/USDT", "2026-09-02 08:00:20"), trade("ETH/USDT", "2026-09-03 00:00:30"), + trade("BTC/USDT", "2026-09-10 12:01")) + replay = frame(trade("BTC/USDT", "2026-09-02 08:00"), trade("BTC/USDT", "2026-09-02 04:00"), + trade("SOL/USDT", "2026-09-03 00:00"), trade("BTC/USDT", "2026-09-10 00:00")) + matched, paper_only, replay_only = match_trades(paper, replay, H4 * 1.5) + assert matched == [(0, 0)] # the 08:00 entry, not the 04:00 one + assert paper_only == [1, 2] # ETH has no partner; 12h apart is too far + assert replay_only == [1, 2, 3] + + +def test_reconcile_breaks_down_the_gap(): + paper = frame( + # same signal, paper paid 0.2% more and got 0.1% less on the same exit + trade("BTC/USDT", "2026-09-02 08:00:20", "2026-09-05 12:00:05", 100.2, 109.89, 9.0, "exit_signal"), + trade("ETH/USDT", "2026-09-12 00:00:30", "2026-09-14 04:00:10", 50.0, 49.0, -2.0, "stop_loss"), + # opened after the replay's data ends: not compared yet + trade("BTC/USDT", "2026-10-05 09:00"), + ) + replay = frame( + trade("BTC/USDT", "2026-09-02 08:00", "2026-09-05 12:00", 100.0, 110.0, 10.0, "exit_signal"), + trade("SOL/USDT", "2026-09-20 00:00", "2026-09-22 00:00", 20.0, 21.0, 5.0, "exit_signal"), + trade("ETH/USDT", "2026-10-04 20:00"), # left open at the end of the replay + ) + events = [{"ts": "2026-09-15T10:00:00+00:00", "event": "entries_paused"}, + {"ts": "2026-09-15T12:00:00+00:00", "event": "trading_resumed"}, + {"ts": "2026-09-15T12:00:00+00:00", "event": "stake_capped"}, # modelled by the backtest + {"ts": "2026-08-01T00:00:00+00:00", "event": "flatten"}] # before the session + r = reconcile(paper, replay, info=info(), replay_end=T("2026-10-05 04:00"), timeframe="4h", events=events) + + assert r["period"]["start"].startswith("2026-09-01T12:00") # floored to the 4h candle + assert r["matching"] == {"matched": 1, "paper_only": 1, "replay_only": 2, "match_rate_pct": 25.0, "tolerance_hours": 6.0} + assert r["paper"]["trades"] == 2 and r["paper"]["realised_abs"] == 7.0 + assert r["replay"]["open"] == 1 and r["replay"]["realised_abs"] == 15.0 + g = r["gap"] + assert g["total_abs"] == -8.0 + assert g["matched_abs"] + g["paper_only_abs"] + g["replay_only_abs"] == pytest.approx(g["total_abs"]) + assert g["return_gap_pp"] == pytest.approx(-0.8) + assert r["fills"]["entry_cost_pct"] == pytest.approx(0.2) and r["fills"]["exit_cost_pct"] == pytest.approx(0.1) + assert r["fills"]["fill_cost_pct"] == pytest.approx(0.15) + + checks = {c["key"]: c for c in r["checks"]} + assert checks["days"]["pass"] and checks["return_gap_pp"]["pass"] and checks["fill_cost_pct"]["pass"] + assert not checks["match_rate_pct"]["pass"] and r["close_to_replay"] is False + assert any("1 paper trade(s) opened after" in w for w in r["warnings"]) + assert any("entries_paused x1, trading_resumed x1" in w for w in r["warnings"]) + assert not any("flatten" in w or "stake_capped" in w for w in r["warnings"]) + assert [row["status"] for row in r["trades"]] == ["matched", "paper_only", "replay_only", "replay_only"] + assert r["trades"][-1]["replay_exit"] == "open" + + +def test_a_faithful_month_passes(): + days = range(2, 28, 3) + paper = frame(*(trade("BTC/USDT", f"2026-09-{d:02d} 04:00:30", f"2026-09-{d + 1:02d} 08:00:10", + 100.05, 101.0, 1.0, "exit_signal") for d in days)) + replay = frame(*(trade("BTC/USDT", f"2026-09-{d:02d} 04:00", f"2026-09-{d + 1:02d} 08:00", + 100.0, 101.0, 1.05, "exit_signal") for d in days)) + r = reconcile(paper, replay, info=info(start="2026-09-01 00:05"), replay_end=T("2026-10-05 04:00"), timeframe="4h") + assert r["matching"]["match_rate_pct"] == 100.0 + assert r["fills"]["same_exit_reason_pct"] == 100.0 + assert r["close_to_replay"] is True, r["checks"] + + +def test_short_session_without_trades_fails_honestly(): + r = reconcile(frame(), frame(), info=info(start="2026-10-01 00:00"), replay_end=T("2026-10-05 04:00"), timeframe="4h") + assert r["close_to_replay"] is False + assert {c["key"]: c["value"] for c in r["checks"]}["match_rate_pct"] is None + assert any("nothing to compare" in w for w in r["warnings"]) + + +def test_stale_replay_data_is_flagged(): + r = reconcile(frame(), frame(), info=info(), replay_end=T("2026-09-20 00:00"), timeframe="4h") + assert any("Download fresh data" in w for w in r["warnings"]) + + +# ---------------------------------------------------------------- session files + +def make_db(path, start="2026-09-01 14:09:52.1", strategy="TrendRider4h"): + with sqlite3.connect(path) as con: + con.execute("CREATE TABLE KeyValueStore (id INTEGER, key TEXT, value_type TEXT, string_value TEXT, " + "datetime_value DATETIME, float_value FLOAT, int_value INTEGER)") + con.execute("INSERT INTO KeyValueStore VALUES (1, 'bot_start_time', 'datetime', NULL, ?, NULL, NULL)", (start,)) + con.execute("CREATE TABLE trades (pair TEXT, open_date DATETIME, close_date DATETIME, open_rate FLOAT, " + "close_rate FLOAT, stake_amount FLOAT, close_profit FLOAT, close_profit_abs FLOAT, " + "exit_reason TEXT, is_open BOOLEAN, strategy TEXT)") + con.execute("INSERT INTO trades VALUES ('BTC/USDT', '2026-09-02 08:00:20.5', '2026-09-05 12:00:05', " + "100.2, 109.89, 100, 0.09, 9.0, 'exit_signal', 0, ?)", (strategy,)) + con.execute("INSERT INTO trades VALUES ('ETH/USDT', '2026-09-12 00:00:30', NULL, 50, NULL, 100, NULL, NULL, " + "NULL, 1, ?)", (strategy,)) + con.close() + + +def test_session_info_from_log_and_database(tmp_path): + db = tmp_path / "20260901-010946.sqlite" + make_db(db) + (tmp_path / "20260901-010946.config.json").write_text(json.dumps({"dry_run_wallet": 500})) + (tmp_path / "20260901-010946.log.1").write_text( + "... - INFO - Using resolved strategy TrendRider4h from 'x'...\n" + "... - INFO - Whitelist with 2 pairs: ['BTC/USDT', 'ETH/USDT']\n") + (tmp_path / "20260901-010946.log").write_text("... - INFO - Whitelist with 1 pairs: ['BTC/USDT']\n") + s = session_info(db) + assert (s.strategy, s.pairs, s.balance) == ("TrendRider4h", ["BTC/USDT", "ETH/USDT"], 500) # oldest log first + assert s.start == T("2026-09-01 14:09:52.1") + assert abs(s.end - pd.Timestamp.now(tz="UTC")) < pd.Timedelta(minutes=5) # last log write + assert any("pair list changed" in w for w in s.warnings) + + trades = load_paper_trades(db) + assert list(trades["is_open"]) == [False, True] and trades["open_date"].dt.tz is not None + + +def test_meta_file_wins_and_code_changes_are_flagged(tmp_path): + db = tmp_path / "s.sqlite" + make_db(db) + code = strategy_fingerprint("TrendRider4h") + code["TrendRider4h.py"] = "0" * 16 + (tmp_path / "s.meta.json").write_text(json.dumps({ + "strategy": "TrendRider4h", "pairs": ["SOL/USDT"], "balance": 250, "max_open_trades": 2, + "started": "2026-09-03T00:00:00+00:00", "code": code})) + s = session_info(db, end="2026-10-01") + assert (s.pairs, s.balance, s.max_open_trades, s.start) == (["SOL/USDT"], 250, 2, T("2026-09-03")) + assert s.end == T("2026-10-01") + assert any("TrendRider4h.py" in w for w in s.warnings) + assert not any("TrendRider4h.json" in w for w in s.warnings) + + +def test_missing_pairs_need_to_be_given(tmp_path): + db = tmp_path / "s.sqlite" + make_db(db) + with pytest.raises(ValueError, match="which pairs"): + session_info(db) + assert session_info(db, pairs=["BTC/USDT"]).pairs == ["BTC/USDT"] + + +def test_strategy_timeframes(): + assert strategy_timeframe("TrendRider4h") == "4h" + assert strategy_timeframe("EmaRsiMomentum") == "1h" + + +def test_replay_trades_left_open_come_back_open(tmp_path): + def bt_trade(pair, opened, closed, reason): + return {"pair": pair, "open_date": opened, "close_date": closed, "open_rate": 1.0, "close_rate": 1.1, + "stake_amount": 100.0, "profit_ratio": 0.1, "profit_abs": 10.0, "exit_reason": reason, "is_open": False} + + result = {"strategy": {"TrendRider4h": { + "backtest_start": "2026-09-01 12:00:00", "backtest_end": "2026-10-05 04:00:00", "timeframe": "4h", + "starting_balance": 1000, "trades": [ + bt_trade("BTC/USDT", "2026-09-02 08:00:00+00:00", "2026-09-05 12:00:00+00:00", "force_exit"), # flatten-like, mid-run + bt_trade("ETH/USDT", "2026-10-04 20:00:00+00:00", "2026-10-05 04:00:00+00:00", "force_exit"), + ]}}} + (tmp_path / "backtest-result-x.json").write_text(json.dumps(result)) + (tmp_path / ".last_result.json").write_text(json.dumps({"latest_backtest": "backtest-result-x.json"})) + df, meta = load_replay_trades(tmp_path) + assert list(df["is_open"]) == [False, True] + assert pd.isna(df.loc[1, "profit_abs"]) and df.loc[0, "profit_abs"] == 10.0 + assert meta["end"] == T("2026-10-05 04:00") and meta["timeframe"] == "4h" From 0b9d508d007bea40915ca8b1f585edb939e771e1 Mon Sep 17 00:00:00 2001 From: devam <56464719+devam2001@users.noreply.github.com> Date: Sun, 11 Oct 2026 02:25:43 +1100 Subject: [PATCH 2/5] MomentumRotation1d candidate; lookahead check for cross-sectional strategies - MomentumRotation1d: daily cross-sectional momentum rotation (top 3 of the whitelist by 14-day risk-adjusted momentum while BTC is risk-on), with risk-based sizing under the shared portfolio limits. Settings chosen on in-sample data only. - research.py: Freqtrade's lookahead-analysis reloads one pair at a time, so it reports any cross-sectional ranking as biased. Strategies that declare `cross_sectional = True` are checked instead by backtesting with later data removed from every pair and requiring identical earlier trades. - research.py --balance: run the gates at any starting balance (65 USDT is about 100 AUD); results go to latest-.json. - Tests: the ranking never looks ahead when future days are cut from all pairs. --- scripts/research.py | 73 ++++++- tests/test_strategies.py | 54 +++++ user_data/strategies/MomentumRotation1d.py | 223 +++++++++++++++++++++ 3 files changed, 348 insertions(+), 2 deletions(-) create mode 100644 user_data/strategies/MomentumRotation1d.py diff --git a/scripts/research.py b/scripts/research.py index 60938b6..1d1eb90 100644 --- a/scripts/research.py +++ b/scripts/research.py @@ -58,6 +58,7 @@ r"PAXG|WBTC|WBETH|BNSOL|.*UP|.*DOWN|.*BULL|.*BEAR)/" ) STATIC_UNIVERSE = False # set by --static +BALANCE = 1000.0 # set by --balance; 65 USDT is about 100 AUD GATES = [ # (key, label, comparison, target) @@ -124,6 +125,9 @@ def tr(start: str, end: str = "") -> str: def bt(strategy, start, end="", tag="", **kw) -> dict: out = RESEARCH_DIR / "runs" / f"{strategy}-{tag or tr(start, end)}" kw.setdefault("pairs", list(universe_at(start))) + kw.setdefault("balance", BALANCE) + if BALANCE != 1000: + out = out.with_name(f"{out.name}-bal{BALANCE:g}") return run_backtest(strategy, tr(start, end), outdir=out, **kw)["metrics"] @@ -181,7 +185,66 @@ def stress(strategies: list[str]) -> dict: return {s: f.result() for s, f in futures.items()} +def is_cross_sectional(strategy: str) -> bool: + """Strategies whose signals depend on other pairs (e.g. a ranking) say so + with `cross_sectional = True`.""" + source = (USERDIR / "strategies" / f"{strategy}.py").read_text(encoding="utf-8") + return re.search(r"^\s+cross_sectional\s*=\s*True", source, re.M) is not None + + +TRUNCATION_RANGE = ("2024-01-01", "2025-01-01") +TRUNCATION_CUTS = ("2024-04-01", "2024-07-01", "2024-10-01") + + +def truncation_check(strategy: str) -> dict: + """Lookahead check that keeps every pair loaded: backtest the full range, + then the same start with later data removed (from all pairs at once). + Every trade that closed before the cut must be identical in both.""" + start, end = TRUNCATION_RANGE + pairs = list(universe_at(start)) + full = bt(strategy, start, end, tag="bias-full", pairs=pairs) + with ThreadPoolExecutor(WORKERS) as pool: + cuts = {c: pool.submit(bt, strategy, start, c, tag=f"bias-cut-{c}", pairs=pairs) for c in TRUNCATION_CUTS} + keys = ("pair", "open_date", "close_date", "open_rate", "close_rate") + + def closed_before(trades, cut): + # The cut run force-closes whatever is still open on its last candle, + # so only compare trades that closed two days before the cut. + limit = (pd.Timestamp(cut) - pd.Timedelta(days=2)).strftime("%Y-%m-%d") + return [tuple(t[k] for k in keys) for t in trades if t["close_date"] < limit] + + full_trades = run_trades(strategy, "bias-full") + checked, mismatched = 0, [] + for c in cuts: + cuts[c].result() + want = closed_before(full_trades, c) + got = closed_before(run_trades(strategy, f"bias-cut-{c}"), c) + checked += len(want) + if want != got: + mismatched.append(c) + return { + "lookahead_clean": not mismatched and checked > 0, + "lookahead_note": f"cross-sectional: {checked} trades compared with later data removed from all pairs " + f"({full['trades']} in the full run); " + + (f"differences at cuts {', '.join(mismatched)}" if mismatched else "no differences"), + } + + +def run_trades(strategy: str, tag: str) -> list[dict]: + from freqtrade.data.btanalysis import load_backtest_stats + + out = RESEARCH_DIR / "runs" / f"{strategy}-{tag}" + if BALANCE != 1000: + out = out.with_name(f"{out.name}-bal{BALANCE:g}") + trades = load_backtest_stats(out)["strategy"][strategy]["trades"] + return [{**t, "open_date": str(t["open_date"]), "close_date": str(t["close_date"])} for t in trades] + + def lookahead(strategy: str) -> dict: + # Freqtrade's lookahead-analysis re-runs each signal with only that one + # pair loaded, so a cross-sectional ranking always looks "biased" there. + if is_cross_sectional(strategy): + return truncation_check(strategy) out = RESEARCH_DIR / "bias" / strategy out.mkdir(parents=True, exist_ok=True) csv_path = out / "lookahead.csv" @@ -288,9 +351,11 @@ def gates(strategies: list[str]) -> dict: "gates": results, "eligible_for_paper": all(g["pass"] for g in results), } + report["balance"] = BALANCE RESEARCH_DIR.mkdir(parents=True, exist_ok=True) stamp = date.today().isoformat() - for name in ("latest.json", f"report-{stamp}.json"): + names = ("latest.json", f"report-{stamp}.json") if BALANCE == 1000 else (f"latest-{BALANCE:g}.json",) + for name in names: (RESEARCH_DIR / name).write_text(json.dumps(report, indent=2, default=str)) return report @@ -310,12 +375,16 @@ def main() -> None: ap.add_argument("--spaces", nargs="+", default=["buy", "sell"]) ap.add_argument("--loss", default="CalmarHyperOptLoss") ap.add_argument("--static", action="store_true", help="use config.json pairs instead of point-in-time universes") + ap.add_argument("--balance", type=float, default=1000.0, + help="starting balance for backtests (65 USDT is about 100 AUD); gates then writes " + "latest-.json instead of latest.json") ap.add_argument("--download", action="store_true", help="with 'universe': download 1h/4h data for every listed pair") ap.add_argument("--write-config", action="store_true", help="with 'universe': set config.json's pair_whitelist to today's universe (for paper/live)") args = ap.parse_args() - global STATIC_UNIVERSE + global STATIC_UNIVERSE, BALANCE STATIC_UNIVERSE = args.static + BALANCE = args.balance strategies = args.strategies or list_strategies() if args.command == "universe": diff --git a/tests/test_strategies.py b/tests/test_strategies.py index 53bcfb2..a8ea163 100644 --- a/tests/test_strategies.py +++ b/tests/test_strategies.py @@ -90,3 +90,57 @@ def test_stake_capped_and_skipped_below_minimum(strategy, monkeypatch): assert strat.apply_risk_caps("BTC/USDT", 300.0, 0.05, NOW, min_stake=150.0) == 0.0 fixed_state(monkeypatch, strat) assert strat.apply_risk_caps("BTC/USDT", 900.0, 0.01, NOW) == pytest.approx(350.0) # 35% position cap + + +# ---------------------------------------------------------------- cross-sectional + +class FakeDataProvider: + """Just enough of Freqtrade's DataProvider for a strategy that ranks pairs.""" + + def __init__(self, frames): + self.frames = frames + + def current_whitelist(self): + return list(self.frames) + + def get_pair_dataframe(self, pair, timeframe): + return self.frames[pair].copy() + + +def rotation_signals(strat, frames): + strat.dp = FakeDataProvider(frames) + out = {} + for pair, df in frames.items(): + meta = {"pair": pair} + res = strat.populate_exit_trend(strat.populate_entry_trend(strat.populate_indicators(df.copy(), meta), meta), meta) + out[pair] = res[["enter_long", "exit_long", "rank"]].fillna(0).to_numpy() + return out + + +@pytest.fixture +def rotation_frames(ohlcv): + frames = {f"P{i}/USDT": ohlcv(n=700, freq="1d", seed=i) for i in range(5)} + # a pair listed 150 days later than the rest has no rank before then + frames["LATE/USDT"] = ohlcv(n=550, freq="1d", start="2023-05-31", seed=9) + return {p: with_informatives(df, ["btc_close_1d", "btc_ema200_1d"]) for p, df in frames.items()} + + +def test_rotation_ranks_pairs_against_each_other(strategy, rotation_frames): + sig = rotation_signals(strategy("MomentumRotation1d"), rotation_frames) + ranks = np.concatenate([s[:, 2] for s in sig.values()]) + assert set(np.unique(ranks[ranks > 0])) == {1, 2, 3, 4, 5, 6} + assert sum(s[:, 0].sum() for s in sig.values()) > 0, "no entries at all" + assert (sig["LATE/USDT"][:14, 2] == 0).all() # unranked until it has 14 days of history + + +def test_rotation_no_lookahead_across_pairs(strategy, rotation_frames): + """Freqtrade's lookahead-analysis reloads one pair at a time, which can't + check a ranking. Remove later days from EVERY pair at once: no earlier + signal or rank may change.""" + strat = strategy("MomentumRotation1d") + full = rotation_signals(strat, rotation_frames) + for cut_date in ("2023-12-01", "2024-06-01", "2024-11-30"): + cut = {p: df[df["date"] < cut_date].reset_index(drop=True) for p, df in rotation_frames.items()} + part = rotation_signals(strat, cut) + for pair, sig in part.items(): + assert np.array_equal(sig, full[pair][:len(sig)]), f"{pair}: signals before {cut_date} changed" diff --git a/user_data/strategies/MomentumRotation1d.py b/user_data/strategies/MomentumRotation1d.py new file mode 100644 index 0000000..b05c38c --- /dev/null +++ b/user_data/strategies/MomentumRotation1d.py @@ -0,0 +1,223 @@ +# MomentumRotation1d.py +# Cross-sectional momentum rotation for Freqtrade (long-only, spot) +# +# Idea: in crypto uptrends the strongest coins tend to keep leading for a +# while. TrendRider4h waits for each coin's own breakout and so catches only +# part of a bull run; this strategy instead ranks the whole whitelist every day +# and holds the leaders. +# +# Logic: +# Score: momentum over `mom_period` days divided by the volatility over the +# same window (a t-stat-like, risk-adjusted momentum), ranked across +# every pair in the whitelist on each day. +# Entry: the pair ranks in the top `top_n`, its momentum is positive, it is +# above its own daily EMA50, and BTC is above its daily EMA200 +# (crypto-wide risk-on regime). +# Exit: the pair drops below rank `exit_rank` (hysteresis, so it isn't sold +# the moment it slips one place), BTC turns risk-off, or the ATR +# chandelier trailing stop is hit. +# Sizing: risk-based, like TrendRider4h: a stop-out loses ~risk_per_trade of +# equity, under the shared portfolio risk limits. +# +# Daily candles and a handful of positions mean low turnover (small fee drag) +# and positions large enough for Binance's ~5 USDT minimum order even on a +# ~100 AUD account. +# +# Starting point for backtesting, not a profit guarantee. + +import sys +from datetime import datetime +from pathlib import Path +from typing import Optional + +import numpy as np +import pandas as pd +import talib.abstract as ta +from freqtrade.persistence import Trade +from freqtrade.strategy import informative, stoploss_from_absolute +from pandas import DataFrame + +_ROOT = str(Path(__file__).resolve().parents[2]) +if _ROOT not in sys.path: + sys.path.insert(0, _ROOT) + +from ridgeline.freqtrade_risk import RiskMixin # noqa: E402 + + +class MomentumRotation1d(RiskMixin): + INTERFACE_VERSION = 3 + + timeframe = "1d" + # BTC's daily EMA200 is the slowest indicator. EMAs carry a trace of their + # starting value: 210 days left it ~4% off; 360 settles it to ~0.1%. + startup_candle_count = 360 + process_only_new_candles = True + # Signals depend on other pairs (the ranking). research.py checks these + # strategies for lookahead with all pairs loaded; see research.lookahead(). + cross_sectional = True + + minimal_roi = {"0": 100} + # Hard floor; must be at least as wide as atr_stop_max. + stoploss = -0.25 + trailing_stop = False + use_custom_stoploss = True + + risk_per_trade = 0.015 + + # Ranking and holding rules. Plain attributes, not hyperopt parameters: + # the score of every pair feeds every other pair's rank, so they were + # chosen by hand on in-sample data (2023-06 -> 2025-06) only. In-sample + # returns were very sensitive to the lookback (7d -15%, 10d +25%, + # 14d +37%, 21d -4%, 30d -8%), so treat the 14-day choice as fragile. + mom_period = 14 + top_n = 3 + exit_rank = 6 + + atr_period = 14 + chandelier_mult = 3.0 + atr_stop_min = 0.05 + atr_stop_max = 0.25 + + @property + def protections(self): + return [ + {"method": "CooldownPeriod", "stop_duration_candles": 1}, + { + "method": "StoplossGuard", + "lookback_period_candles": 14, + "trade_limit": 2, + "stop_duration_candles": 7, + "only_per_pair": True, + }, + { + "method": "MaxDrawdown", + "lookback_period_candles": 14, + "trade_limit": 4, + "stop_duration_candles": 3, + "max_allowed_drawdown": 0.10, + }, + ] + + @informative("1d", "BTC/{stake}", fmt="btc_{column}_{timeframe}") + def populate_indicators_btc_1d(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + dataframe["ema200"] = ta.EMA(dataframe, timeperiod=200) + return dataframe + + def _score(self, dataframe: DataFrame) -> pd.Series: + n = self.mom_period + momentum = dataframe["close"] / dataframe["close"].shift(n) - 1 + volatility = dataframe["close"].pct_change().rolling(n).std() * np.sqrt(n) + return momentum / volatility.replace(0, np.nan) + + def _rank(self, dataframe: DataFrame, pair: str) -> pd.Series: + """This pair's rank (1 = strongest) among the whitelist on each day. + Only same-day scores are compared, and each score only uses closes up + to that day, so the ranking never looks ahead. Pairs that didn't trade + yet on a day have no score and aren't ranked.""" + scores = {pair: pd.Series(self._score(dataframe).values, index=dataframe["date"])} + for other in self.dp.current_whitelist(): + if other in scores: + continue + df = self.dp.get_pair_dataframe(pair=other, timeframe=self.timeframe) + if df is None or df.empty: + continue + scores[other] = pd.Series(self._score(df).values, index=df["date"]) + ranks = pd.DataFrame(scores).rank(axis=1, ascending=False, method="min")[pair] + return dataframe["date"].map(ranks) + + def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + dataframe["ema50"] = ta.EMA(dataframe, timeperiod=50) + dataframe["atr"] = ta.ATR(dataframe, timeperiod=self.atr_period) + dataframe["atr_pct"] = dataframe["atr"] / dataframe["close"] + dataframe["score"] = self._score(dataframe) + dataframe["rank"] = self._rank(dataframe, metadata["pair"]) + dataframe["btc_risk_on"] = dataframe["btc_close_1d"] > dataframe["btc_ema200_1d"] + return dataframe + + def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + dataframe.loc[ + ( + (dataframe["rank"] <= self.top_n) + & (dataframe["score"] > 0) + & (dataframe["close"] > dataframe["ema50"]) + & dataframe["btc_risk_on"] + & (dataframe["volume"] > 0) + ), + "enter_long", + ] = 1 + return dataframe + + def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + dataframe.loc[ + ( + ((dataframe["rank"] > self.exit_rank) | ~dataframe["btc_risk_on"]) + & (dataframe["volume"] > 0) + ), + "exit_long", + ] = 1 + return dataframe + + def _entry_stop_distance(self, pair: str) -> float: + """Initial stop distance (fraction of price) from the latest ATR.""" + try: + dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) + atr_pct = dataframe["atr_pct"].iloc[-1] + except Exception: + atr_pct = None + if atr_pct is None or atr_pct != atr_pct: + return abs(self.stoploss) + return max(self.atr_stop_min, min(self.atr_stop_max, atr_pct * self.chandelier_mult)) + + def custom_stake_amount( + self, + pair: str, + current_time: datetime, + current_rate: float, + proposed_stake: float, + min_stake: Optional[float], + max_stake: float, + leverage: float, + entry_tag: Optional[str], + side: str, + **kwargs, + ) -> float: + """Position size such that the initial stop loses `risk_per_trade` of equity.""" + try: + total_equity = self.wallets.get_total_stake_amount() + except Exception: + return proposed_stake + distance = self._entry_stop_distance(pair) + if distance <= 0 or total_equity <= 0: + return proposed_stake + stake = total_equity * self.risk_per_trade / distance + if min_stake is not None: + stake = max(stake, min_stake) + stake = min(stake, max_stake) + return self.apply_risk_caps(pair, stake, distance, current_time, min_stake) + + def custom_stoploss( + self, + pair: str, + trade: Trade, + current_time: datetime, + current_rate: float, + current_profit: float, + after_fill: bool, + **kwargs, + ) -> Optional[float]: + """Chandelier stop: max(initial stop, highest high since entry - k*ATR). + The initial distance is pinned at the first call so it matches the + distance custom_stake_amount() sized the position against.""" + pinned = trade.get_custom_data(key="entry_stop_distance") + if pinned is None: + pinned = self._entry_stop_distance(pair) + trade.set_custom_data(key="entry_stop_distance", value=pinned) + stop_price = trade.open_rate * (1 - pinned) + + dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) + since_entry = dataframe.loc[dataframe["date"] >= trade.open_date_utc] + if not since_entry.empty: + atr = since_entry["atr"].iloc[-1] + stop_price = max(stop_price, since_entry["high"].max() - self.chandelier_mult * atr) + + return stoploss_from_absolute(stop_price, current_rate) From e515878262c909167d4a4b701982405f4c2a06ce Mon Sep 17 00:00:00 2001 From: devam <56464719+devam2001@users.noreply.github.com> Date: Sun, 11 Oct 2026 02:42:58 +1100 Subject: [PATCH 3/5] Research for small accounts; case study rewritten as a research paper - Gates re-run with MomentumRotation1d at 1000 and 65 USDT (about 100 AUD, `research.py gates --balance 65` -> latest-65.json). No strategy is eligible yet: TrendRider4h 8/9 (99 of 100 trades), MomentumRotation1d 7/9. - Indicator stability is measured at the strategy's own warm-up or longer; columns with fewer startup candles than the strategy declares test a setup that never runs. No strategy's eligibility changes. - RESEARCH.md: small-account results, the risk-per-trade experiment (more risk added little return and doubled drawdown), the rotation's lookback sensitivity, and both check changes. - scripts/case_study.py builds the case study PDF (black theme, research format: abstract, methodology, results, discussion, limitations, references) from the latest research results. The market background is the earlier case study, condensed with its sources kept. --- .gitignore | 1 + Crypto Trading Bot Case Study.pdf | Bin 204143 -> 415758 bytes RESEARCH.md | 100 +- pyproject.toml | 1 + scripts/case_study.py | 650 +++++++++++++ scripts/research.py | 36 +- tests/test_universe.py | 18 + user_data/research/latest-65.json | 1027 +++++++++++++++++++++ user_data/research/latest.json | 262 +++++- user_data/research/report-2026-10-11.json | 262 +++++- 10 files changed, 2327 insertions(+), 30 deletions(-) create mode 100644 scripts/case_study.py create mode 100644 user_data/research/latest-65.json diff --git a/.gitignore b/.gitignore index 7e4ed46..9d2189f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ user_data/risk_state.json *.reconcile.json .pytest_cache/ .ruff_cache/ +build/ diff --git a/Crypto Trading Bot Case Study.pdf b/Crypto Trading Bot Case Study.pdf index 223c56f056dd1e347134e460ea11ab1029f68455..f5d71b5ac281dc1cec85a49d7be3d6019f811cbe 100644 GIT binary patch literal 415758 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

    Y;>rolrO|&77qeNIP~?1&#@^xHl7UGwzEQ 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сZtZK2{1br!Qg`NKK!1 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

    vT&g_mw$S6<#}9)w#Y30xw?X?CJ- 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 str: + return html.escape(str(text)) + + +def pct(v, digits: int = 1, sign: bool = True) -> str: + if v is None: + return "–" + return f"{v:+.{digits}f}%" if sign else f"{v:.{digits}f}%" + + +def cite(*numbers: int) -> str: + return f'[{", ".join(str(n) for n in numbers)}]' + + +def table(head: list[str], rows: list[list], *, num_from: int = 1, caption: str = "", cls: str = "") -> str: + cells = "".join(f'= num_from else ""}">{h}' for i, h in enumerate(head)) + body = "".join("" + "".join(f'= num_from else ""}">{c}' for i, c in enumerate(r)) + + "" for r in rows) + cap = f"{caption}" if caption else "" + return f'{cap}{cells}{body}
    ' + + +def mark(passed: bool) -> str: + return (f'✓' if passed + else f'✗') + + +# ---------------------------------------------------------------- charts + +def _hbar(x0: float, x1: float, y: float, h: float, color: str, r: float = 4) -> str: + """Horizontal bar from baseline x0 to x1, rounded at the data end only.""" + left, right = min(x0, x1), max(x0, x1) + r = min(r, (right - left) / 2, h / 2) + if x1 >= x0: # rounded on the right + d = (f"M{left:.1f},{y:.1f} H{right - r:.1f} Q{right:.1f},{y:.1f} {right:.1f},{y + r:.1f} " + f"V{y + h - r:.1f} Q{right:.1f},{y + h:.1f} {right - r:.1f},{y + h:.1f} H{left:.1f} Z") + else: # rounded on the left + d = (f"M{right:.1f},{y:.1f} H{left + r:.1f} Q{left:.1f},{y:.1f} {left:.1f},{y + r:.1f} " + f"V{y + h - r:.1f} Q{left:.1f},{y + h:.1f} {left + r:.1f},{y + h:.1f} H{right:.1f} Z") + return f'' + + +def _vbar(x: float, base: float, top: float, w: float, color: str, r: float = 4) -> str: + """Vertical bar from baseline y=base to y=top, rounded at the data end only.""" + hi, lo = min(base, top), max(base, top) + r = min(r, (lo - hi) / 2, w / 2) + if top <= base: # positive: rounded at the top + d = (f"M{x:.1f},{lo:.1f} V{hi + r:.1f} Q{x:.1f},{hi:.1f} {x + r:.1f},{hi:.1f} " + f"H{x + w - r:.1f} Q{x + w:.1f},{hi:.1f} {x + w:.1f},{hi + r:.1f} V{lo:.1f} Z") + else: # negative: rounded at the bottom + d = (f"M{x:.1f},{hi:.1f} V{lo - r:.1f} Q{x:.1f},{lo:.1f} {x + r:.1f},{lo:.1f} " + f"H{x + w - r:.1f} Q{x + w:.1f},{lo:.1f} {x + w:.1f},{lo - r:.1f} V{hi:.1f} Z") + return f'' + + +def chart_oos_returns(rows: list[tuple[str, float]], refs: list[tuple[str, float]]) -> str: + """Out-of-sample return per strategy, with buy-and-hold reference lines.""" + width, label_w, pad_r, bar_h, gap = 720, 150, 60, 22, 14 + plot_bottom = 30 + len(rows) * (bar_h + gap) + height = plot_bottom + 14 * len(refs) + 8 + lo = min([0.0, *(v for _, v in rows), *(v for _, v in refs)]) - 5 + hi = max([0.0, *(v for _, v in rows)]) + 5 + + def x(v): + return label_w + (width - label_w - pad_r) * (v - lo) / (hi - lo) + + parts = [f''] + for t in range(int(lo // 10) * 10, int(hi) + 1, 10): + if t < lo: + continue + parts.append(f'' + f'{t:+d}%') + parts.append(f'') + for k, (name, v) in enumerate(refs): + label_y = plot_bottom + 12 + 14 * k + parts.append(f'' + f'{esc(name)} {v:+.1f}%') + for i, (name, v) in enumerate(rows): + y = 34 + i * (bar_h + gap) + parts.append(f'{esc(name)}') + parts.append(_hbar(x(0), x(v), y, bar_h, BLUE)) + # positive: label past the bar end; negative: inside the bar end, clear of the reference lines + tx = x(v) + 6 + parts.append(f'{v:+.1f}%') + parts.append("") + return "".join(parts) + + +def chart_walkforward(windows: list[str], a: tuple[str, list[float]], b: tuple[str, list[float]], + market: list[float]) -> str: + """Return per walk-forward window for two strategies (grouped bars).""" + width, pad_l, pad_r, top, plot_h = 720, 44, 8, 34, 190 + height = top + plot_h + 54 + values = a[1] + b[1] + lo, hi = min(0.0, *values) - 2, max(0.0, *values) + 2 + n = len(windows) + band = (width - pad_l - pad_r) / n + bar_w = min(12.0, (band - 8) / 2) + + def y(v): + return top + plot_h * (hi - v) / (hi - lo) + + parts = [f''] + parts.append(f'' + f'{esc(a[0])}' + f'' + f'{esc(b[0])}') + step = 10 if hi - lo > 40 else 5 + for t in range(int(lo // step) * step, int(hi) + 1, step): + if t < lo: + continue + parts.append(f'' + f'{t:+d}%') + parts.append(f'') + for i, label in enumerate(windows): + cx = pad_l + band * i + band / 2 + parts.append(_vbar(cx - bar_w - 1, y(0), y(a[1][i]), bar_w, BLUE)) + parts.append(_vbar(cx + 1, y(0), y(b[1][i]), bar_w, ORANGE)) + parts.append(f'{esc(label)}' + f'{market[i]:+.0f}%') + parts.append(f'mkt') + parts.append("") + return "".join(parts) + + +# ---------------------------------------------------------------- document + +CSS = """ +@page { size: A4; margin: 17mm 16mm 18mm; background: #000; + @bottom-center { content: "Ridgeline case study · page " counter(page) " of " counter(pages); + color: #8a8a86; font: 8pt "Segoe UI", system-ui, sans-serif; } } +html, body { background: #000; } +* { -webkit-print-color-adjust: exact; print-color-adjust: exact; box-sizing: border-box; } +body { margin: 0; color: #e4e4e1; font: 10.4pt/1.55 Cambria, Georgia, "Times New Roman", serif; } +h1, h2, h3, .sans, caption, table, .chart text, .meta, .abstract h2 { font-family: "Segoe UI", system-ui, sans-serif; } +h1 { font-size: 21pt; line-height: 1.2; margin: 0 0 6pt; color: #fff; font-weight: 650; } +.subtitle { font-size: 12pt; color: #c3c2b7; margin: 0 0 14pt; } +.meta { color: #a3a29a; font-size: 9pt; margin-bottom: 16pt; } +h2 { font-size: 13pt; color: #fff; margin: 20pt 0 6pt; padding-bottom: 3pt; border-bottom: 1px solid #333; break-after: avoid; } +h3 { font-size: 10.8pt; color: #f2f2ee; margin: 13pt 0 4pt; break-after: avoid; } +p { margin: 0 0 7pt; text-align: justify; hyphens: auto; } +ul, ol { margin: 0 0 8pt; padding-left: 18pt; } li { margin-bottom: 2pt; } +a { color: #86b6ef; text-decoration: none; overflow-wrap: anywhere; } +.cite { color: #86b6ef; font-size: 7pt; } +.abstract { border: 1px solid #333; border-radius: 6px; padding: 10pt 13pt; margin: 0 0 12pt; background: #0d0d0d; } +.abstract h2 { margin: 0 0 4pt; border: 0; font-size: 10pt; text-transform: uppercase; letter-spacing: .06em; color: #c3c2b7; } +.keywords { font-size: 9pt; color: #a3a29a; margin-top: 6pt; } +table { width: 100%; border-collapse: collapse; margin: 6pt 0 12pt; font-size: 8.6pt; break-inside: avoid; } +caption { caption-side: top; text-align: left; color: #c3c2b7; font-size: 8.6pt; padding-bottom: 4pt; } +th, td { padding: 3.5pt 6pt; border-bottom: 1px solid #262626; text-align: left; vertical-align: top; } +th { color: #a3a29a; font-weight: 500; border-bottom-color: #444; } +td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; } +.mark { font-weight: 700; } +figure { margin: 8pt 0 14pt; break-inside: avoid; } +figcaption { font: 8.6pt "Segoe UI", system-ui, sans-serif; color: #c3c2b7; margin-top: 4pt; } +.chart { width: 100%; height: auto; } +.chart .grid { stroke: #262626; } .chart .zero { stroke: #8a8a86; } +.chart .ref { stroke: #a3a29a; stroke-dasharray: 4 3; } +.chart .ref-label, .chart .axis { font-size: 10px; fill: #a3a29a; } .chart .muted { fill: #6f6e69; } +.chart .label { font-size: 11px; fill: #e4e4e1; } .chart .value { font-size: 11px; fill: #fff; font-weight: 600; } +.callout { border-left: 3px solid #3987e5; background: #0d0d0d; padding: 7pt 11pt; margin: 8pt 0 12pt; } +.small { font-size: 8.6pt; color: #a3a29a; } +.refs { font-size: 8.2pt; color: #c3c2b7; padding-left: 22pt; } .refs li { margin-bottom: 2.5pt; } +.pagebreak { break-before: page; } +""" + + +def build_html(report: dict, small: dict | None) -> str: + strategies = report["strategies"] + bm = report["benchmarks"] + is_range, oos_range = report["periods"]["is"], report["periods"]["oos"] + order = sorted(strategies, key=lambda s: -sum(g["pass"] for g in strategies[s]["gates"])) + best = order[0] + b = strategies[best] + n_gates = len(b["gates"]) + eligible = [s for s in order if strategies[s]["eligible_for_paper"]] + rot = strategies.get("MomentumRotation1d") + today = date.today().strftime("%d %B %Y") + + def passed(s): + return sum(g["pass"] for g in strategies[s]["gates"]) + + summary_rows = [[f"{esc(s)}" if s == best else esc(s), + pct(strategies[s]["is"]["profit_pct"]), pct(strategies[s]["oos"]["profit_pct"]), + pct(strategies[s]["oos"]["max_drawdown_pct"], sign=False), f'{strategies[s]["oos"]["profit_factor"]:.2f}', + strategies[s]["oos"]["trades"], pct(strategies[s]["walkforward"]["pct_profitable"], 0, sign=False), + f"{passed(s)} / {n_gates}"] for s in order] + gate_rows = [] + for i, g in enumerate(b["gates"]): + gate_rows.append([esc(g["label"])] + [f'{mark(strategies[s]["gates"][i]["pass"])} {esc(_short(strategies[s]["gates"][i]["value"]))}' + for s in order]) + wf_windows = [w["window"] for w in b["walkforward"]["windows"]] + wf_labels = [_window_label(w) for w in wf_windows] + wf_table = [[esc(w.replace(" -> ", " → "))] + [pct(strategies[s]["walkforward"]["windows"][i]["profit_pct"]) for s in order] + + [pct(b["walkforward"]["windows"][i]["market_change_pct"], 0)] for i, w in enumerate(wf_windows)] + + small_section = "" + if small: + rows = [] + for s in order: + if s not in small["strategies"]: + continue + o = small["strategies"][s]["oos"] + rows.append([esc(s), f'{o["starting_balance"]:.0f} → {o["final_balance"]:.2f}', pct(o["profit_pct"]), + pct(strategies[s]["oos"]["profit_pct"]), pct(o["max_drawdown_pct"], sign=False), o["trades"], + f'{sum(g["pass"] for g in small["strategies"][s]["gates"])} / {n_gates}']) + small_section = table(["Strategy", "OOS balance (USDT)", "OOS return at 65", "OOS return at 1000", "Max DD", "Trades", "Gates"], + rows, caption="Table 6. The same out-of-sample test with a 65 USDT (≈100 AUD) account.") + + figure1 = chart_oos_returns([(s, strategies[s]["oos"]["profit_pct"]) for s in order], + [("Equal-weight buy & hold", bm["oos"]["equal_weight_pct"]), ("BTC", bm["oos"]["btc_pct"])]) + figure2 = "" + if rot is not None and best != "MomentumRotation1d": + figure2 = chart_walkforward( + wf_labels, (best, [w["profit_pct"] for w in b["walkforward"]["windows"]]), + ("MomentumRotation1d", [w["profit_pct"] for w in rot["walkforward"]["windows"]]), + [w["market_change_pct"] for w in b["walkforward"]["windows"]]) + + wf_b = b["walkforward"]["windows"] + up = max(range(len(wf_b)), key=lambda i: wf_b[i]["market_change_pct"]) + down = min(range(len(wf_b)), key=lambda i: wf_b[i]["market_change_pct"]) + regime_text = (f"{esc(best)}'s edge is mainly not losing money in downturns: in the market's worst quarter " + f"({wf_b[down]['window'][:7]}, {pct(wf_b[down]['market_change_pct'], 0)}) it returned {pct(wf_b[down]['profit_pct'])}, " + f"because the BTC regime filter keeps it out of broad declines. In the strongest quarter " + f"({wf_b[up]['window'][:7]}, {pct(wf_b[up]['market_change_pct'], 0)}) it made {pct(wf_b[up]['profit_pct'])}, " + "catching only part of the move.") + if rot is not None: + wf_r = rot["walkforward"]["windows"] + regime_text += (f" MomentumRotation1d was designed to hold the leaders through rallies, but the walk-forward does not show " + f"that: it made only {pct(wf_r[up]['profit_pct'])} in that strongest quarter (and {pct(wf_r[down]['profit_pct'])} " + "in the worst one). Its rally-capture rationale is not supported by these results.") + + verdict = (f"{len(eligible)} of {len(strategies)} strategies passed every gate" if eligible + else f"none of the {len(strategies)} strategies passed every gate, so none is eligible for real money") + rot_text = "" + if rot is not None: + rot_text = (f"A new cross-sectional momentum-rotation candidate returned {pct(rot['oos']['profit_pct'])} out of sample " + f"with a {pct(rot['oos']['max_drawdown_pct'], sign=False)} maximum drawdown and passed {passed('MomentumRotation1d')} of " + f"{n_gates} gates, but its in-sample results were highly sensitive to its one key parameter. ") + + return f""" +Ridgeline case study + +

    Automated Cryptocurrency Trading for Retail Accounts

    +

    A market case study and an out-of-sample evaluation of an open-source, self-hosted trading system

    +
    devam2001 · Ridgeline project{cite(REPO_REF)} · {today} · software v{__version__}
    +Research format revision of the earlier product case study “The 2026 Landscape of Automated Cryptocurrency Trading Platforms”.
    + +

    Abstract

    +

    Algorithmic execution has become mainstream in cryptocurrency markets: the trading-bot sector was valued at an estimated +US$47.43 billion in 2026, with roughly 42% of active traders automating to some degree{cite(1)}. Commercial platforms sell +infrastructure, templates and strategy marketplaces, but their fixed subscription costs weigh heavily on small accounts, and +marketplace strategies are often curve-fitted to past data{cite(4, 17)}. This paper first condenses a landscape analysis of bot +architectures, platforms, security failures and Australian regulation. It then evaluates Ridgeline, an open-source system built on +Freqtrade{cite(FREQTRADE_REF)}, under a deliberately strict protocol: point-in-time pair selection, a strict in-sample / +out-of-sample split ({esc(is_range[0])} to {esc(is_range[1])} / {esc(oos_range[0])} to {esc(oos_range[1])}), quarterly walk-forward windows, +fee stress, lookahead and warm-up checks, and nine pass/fail go-live gates, all under portfolio risk limits. Over an +out-of-sample period in which an equal-weight basket of the same coins fell {pct(bm['oos']['equal_weight_pct'])}, the best +strategy, {esc(best)}, returned {pct(b['oos']['profit_pct'])} with a {pct(b['oos']['max_drawdown_pct'], sign=False)} maximum drawdown. +It passed {passed(best)} of {n_gates} gates. {rot_text}Overall, {verdict}. An account of about 100 AUD trades the same +signals with the same percentage results, but doubling the risk per trade added little return while doubling drawdown.

    +

    Keywords: algorithmic trading, cryptocurrency, backtesting, out-of-sample testing, walk-forward analysis, +point-in-time universe, risk management, Freqtrade, retail investors, Australia

    + +

    1. Introduction

    +

    Unlike equity and foreign-exchange venues, cryptocurrency exchanges trade continuously across a fragmented global liquidity +network{cite(2)}. Manual traders face fatigue and well-documented behavioural failures (panic selling in drawdowns, chasing +parabolic rallies, revenge trading after losses), which automated, rule-based execution removes{cite(2)}. The industry has grown +from open-source command-line scripts into software-as-a-service ecosystems with visual strategy builders, backtesting engines and, +increasingly, agentic AI layers{cite(4)}. That growth brought second-order problems: centralised storage of exchange API keys created +large attack surfaces{cite(6)}, and retail automation now meets financial-services licensing, tax and anti-money-laundering rules{cite(8)}.

    +

    Marketing for trading bots tends to report backtests, which are easy to make look good. This study asks whether a strategy still +shows an edge when it is tested the way a sceptical reviewer would test it, and whether that holds for a very small account. +Four questions guide it:

    +
      +
    1. RQ1. How is the 2026 automated-trading market structured, and what risks does it carry for retail users?
    2. +
    3. RQ2. Does any of four rule-based strategies show an edge that survives point-in-time, out-of-sample testing and nine go-live gates?
    4. +
    5. RQ3. Can the system trade an account of about 100 AUD, and with what results?
    6. +
    7. RQ4. Does taking more risk per trade produce proportionally more profit?
    8. +
    + +

    2. Background: the automated-trading landscape

    +

    2.1 Algorithmic architectures

    +

    Bots are specialised tools that suit particular market regimes{cite(2)}. Grid bots layer limit orders around a price and harvest +range-bound oscillation, but in a sustained trend they either accumulate a falling asset or sell out of a rally too early{cite(2, 3, 12)}. +Dollar-cost-averaging (DCA) bots add geometrically scaled “safety orders” as price moves against a position; this lowers the average +entry but can consume capital rapidly in a crash, so professional use needs drawdown thresholds and caps on safety orders{cite(12, 13, 14)}. +Signal bots execute alerts from external charting platforms and depend on fragile webhook plumbing{cite(3, 12)}. Arbitrage and +market-making bots chase spreads that institutional high-frequency firms close in milliseconds, which makes them the highest-risk +category for retail users{cite(3, 17)}. Trend-following bots ride momentum but are whipsawed in sideways markets{cite(2)}.

    +{table(["Architecture", "Mechanism", "Best market", "Main systemic risk", "Complexity"], [ + ["Grid", "Layered limit orders above and below price", "Sideways, ranging", "Breakouts into a one-way trend", "Low to medium"], + ["DCA", "Scaled buying into adverse moves", "Choppy, mildly bearish", "Runaway capital use in crashes", "Low"], + ["Signal", "Executes external webhook alerts", "Depends on the signal", "Latency and delivery failures", "Medium"], + ["Arbitrage", "Cross-venue price spreads", "Volatile, inefficient", "Spreads eroded by fees and latency", "Very high"], + ["Trend-following", "Breakouts and moving averages", "Strong directional trends", "Whipsaw losses in sideways chop", "Medium to high"], +], num_from=99, caption="Table 1. Taxonomy of trading-bot architectures (after the original case study" + cite(2, 3, 12, 13) + ").")} + +

    2.2 Commercial platforms

    +

    The commercial market has stratified by user experience, custody model and pricing{cite(4)}. 3Commas, the most widely adopted +API-driven platform (over 624,000 registered traders), restructured its plans in 2025–26 into Starter, Pro and Expert tiers at +US$20, US$50 and US$140 a month, gating full developer API access behind the top tier, and launched the agentic QuantPilot +environment{cite(4, 11, 14)}. Cryptohopper differentiates on a no-code designer and a strategy marketplace whose incentives +reward curve-fitted strategies{cite(4, 16, 17)}. Pionex embeds free bots in its own exchange, earning a 0.05% trading fee at the +cost of ecosystem lock-in{cite(4, 11, 25)}. Bitsgap focuses on multi-exchange portfolio management and a futures “COMBO” bot{cite(2, 4, 11)}. +At the technical extreme, HaasOnline offers walk-forward backtesting (up to US$749 a month), Gunbot is self-hosted on a one-time +licence, and open-source frameworks such as Freqtrade are free but demand programming skill{cite(4, 11, 33)}.

    +
    Fixed costs and small accounts. A US$29 monthly subscription on a US$1,000 account needs a 34.8% annual +net return just to break even on software{cite(17)}. On a 100 AUD account no subscription is viable at all, which is why this study +evaluates a self-hosted, open-source system with no fixed cost.
    + +

    2.3 Security

    +

    Cloud bots hold exchange API keys centrally, which makes them single points of failure{cite(22)}. In late 2022 3Commas users +reported unauthorised trades. The company first attributed them to phishing, until a threat actor published about 100,000 API keys +on 28 December 2022 and the CEO confirmed the leak{cite(34, 35, 36)}. Estimated losses exceeded US$20 million. Because the keys +could not withdraw, attackers used “contra-trading”: they forced victim accounts to buy illiquid coins at inflated prices from the +attackers' own sell orders{cite(6)}. The industry responded with OAuth-style “Fast Connect” authorisation and mandatory IP +whitelisting, yet 3Commas suffered a further breach in October 2023{cite(36, 38, 40)}. Self-hosting keeps keys on the user's own +machine, which is the model Ridgeline follows. Its setup guide restricts keys to spot trading with withdrawals disabled, and keys are +needed only for live trading.

    + +

    2.4 Regulation and tax in Australia

    +

    Running a bot on one's own account is generally permitted without a licence, but selling algorithms with performance claims, +offering copy-trading, or pooling client funds can require an Australian Financial Services Licence and may form a managed +investment scheme{cite(8, 9, 42)}. ASIC's no-action position for digital-asset businesses required licence applications by 30 June +2026 and ended on 30 September 2026{cite(41, 43, 44)}, and ASIC has updated its market-integrity rules to strengthen safeguards +around AI-enabled trading{cite(45)}. The ATO treats crypto as a capital-gains-tax asset, so every automated trade is a separate CGT +event that must be recorded{cite(10, 48)}. In the United States, platforms that transmit customer funds must register with FinCEN +and hold state licences; Pionex.US reached consent orders with four states in May 2025{cite(25, 27)}.

    + +

    2.5 Toward agentic AI

    +

    LLM-based agents can read news, policy statements and on-chain flows, but they can also hallucinate, for example mistaking satire for a +bankruptcy and liquidating a portfolio{cite(4, 13)}. The emerging consensus is that deterministic risk controls (hard stops, drawdown +thresholds and volume filters) must govern final execution whatever proposes the trade{cite(4, 32)}. Ridgeline applies that principle +to rule-based strategies: a separate risk layer can veto or shrink any trade.

    + +

    3. System design

    +

    Ridgeline{cite(REPO_REF)} is built on Freqtrade{cite(FREQTRADE_REF)} and trades Binance spot USDT pairs, long only. It has four parts:

    +
      +
    • Strategies. Each strategy sizes positions so that a stop-out loses about 1.5% of equity, using ATR-based stops.
    • +
    • Portfolio risk layer. Shared by every strategy and enforced in backtests too: +
        +
      • at most 35% of equity in one position
      • +
      • at most 4.5% of equity at risk across open stops
      • +
      • a 3% daily loss limit
      • +
      • a 15% drawdown halt that only a human can lift
      • +
    • +
    • Operations. +
        +
      • a paper-trading control panel with a kill switch
      • +
      • a hash-chained audit trail
      • +
      • investor-style tear sheets
      • +
      • a watchdog with alerts
      • +
      • Docker deployment and a Windows installer
      • +
    • +
    • Research pipeline (Section 4). It ends with the gates in Table 2 and a paper-versus-replay check.
    • +
    +

    The panel can only run dry-run (paper) bots. Live trading is a separate, manual step that the software never takes on its own.

    + +

    4. Methodology

    +

    4.1 Data and universe

    +

    The study uses daily, 4-hour and 1-hour Binance spot candles from June 2022 to {esc(oos_range[1])}. Choosing pairs by today's +trading volume leaks the future into a backtest, because coins that later rallied are over-represented. In an earlier run, a +today's-top-26 list inflated the out-of-sample return to +35.7%{cite(REPO_REF)}. Each backtest window therefore trades the top 25 USDT +pairs by quote volume over the 30 days before it starts. Stablecoins (by name, or price within ±5% of US$1 for 90 days), wrapped and +leveraged tokens, and coins listed less than 210 days earlier are excluded. Delisted coins cannot be downloaded, so some survivorship +bias remains.

    +

    4.2 Protocol

    +

    The in-sample period ({esc(is_range[0])} to {esc(is_range[1])}) is the only data used for design and tuning. The out-of-sample period +({esc(oos_range[0])} to {esc(oos_range[1])}) is used only to judge the result. Every backtest:

    +
      +
    • starts with 1,000 USDT
    • +
    • allows at most three open trades
    • +
    • pays a 0.1% fee per side
    • +
    • has Freqtrade's protections and the portfolio risk limits switched on
    • +
    +

    Walk-forward analysis repeats the test in rolling three-month windows, each with its own point-in-time universe.

    +

    The bias checks are:

    +
      +
    • Lookahead. Freqtrade's lookahead analysis.
    • +
    • Indicator warm-up stability. Freqtrade's recursive analysis, measured at the strategy's own warm-up length or longer.
    • +
    • Lookahead for cross-sectional strategies. The Freqtrade tool reloads one pair at a time, which cannot evaluate a ranking +across pairs. For those strategies, the backtest is re-run with later data removed from every pair at once, and every earlier +trade must be identical.
    • +
    +{table(["Gate", "Target"], [[esc(g[0]), esc(g[1])] for g in [ + ("Out-of-sample profit", "> 0%"), ("Out-of-sample profit factor", "≥ 1.3"), ("Out-of-sample maximum drawdown", "≤ 20%"), + ("Out-of-sample Calmar ratio", "≥ 1.0"), ("Out-of-sample trades", "≥ 100"), ("Profitable walk-forward windows", "≥ 60%"), + ("Out-of-sample profit with fees +50%", "> 0%"), ("Lookahead bias", "none"), ("Indicator deviation at the strategy's warm-up", "≤ 1%"), + ("Paper trading (4+ weeks) vs replay of the same weeks", "4 checks: ≥ 28 days, ≥ 80% trades matched, return within 2 points, fills ≤ 0.3% per side"), +]], num_from=99, caption="Table 2. Go-live gates. A strategy must pass all nine backtest gates, then the paper-trading check, before any real money is used.")} +

    Two further experiments address RQ3 and RQ4. The full gate suite is re-run with a 65 USDT starting balance (about 100 AUD at roughly +0.65 USD per AUD, an assumed rate). The best strategy is also re-run at two and three times the risk per trade, with proportionally +looser portfolio caps.

    + +

    4.3 Strategies

    +
      +
    • TrendRider4h: a 4-hour Donchian breakout with an ADX trend filter. It trades only when the coin is above its daily EMA200 and +BTC is above its own daily EMA200, and exits on an ATR “chandelier” trailing stop with no profit cap.
    • +
    • MomentumRotation1d (new): each day it ranks the whole universe by 14-day volatility-adjusted momentum and holds the top +three while BTC is in an uptrend. A position is sold when its coin drops out of the top six, or on its trailing stop. All settings +were chosen on in-sample data only.
    • +
    • EmaRsiMomentum: a 1-hour EMA crossover with RSI, ADX and 4-hour EMA200 filters and a take-profit ladder.
    • +
    • TrendDipBuyer1h: buys 1-hour pullbacks inside an established uptrend (mean reversion).
    • +
    + +

    5. Results

    +

    5.1 Headline results

    +

    The two periods were very different markets. In-sample, an equal-weight buy-and-hold of the same point-in-time coins returned +{pct(bm['is']['equal_weight_pct'])} and BTC {pct(bm['is']['btc_pct'])}. Out of sample, the equal-weight basket lost +{pct(bm['oos']['equal_weight_pct'])} and BTC {pct(bm['oos']['btc_pct'])}.

    +{table(["Strategy", "IS return", "OOS return", "OOS max DD", "OOS PF", "OOS trades", "WF profitable", "Gates"], summary_rows, + caption="Table 3. In-sample (IS) and out-of-sample (OOS) results with portfolio risk limits (1,000 USDT start). PF = profit factor; WF = walk-forward.")} +
    {figure1} +
    Figure 1. Out-of-sample return by strategy. Dashed lines mark buy-and-hold of the same coins over the same period.
    + +

    5.2 Go-live gates

    +{table(["Gate"] + [esc(s) for s in order], gate_rows, caption="Table 4. Gate results (✓ pass, ✗ fail), with the measured value.", cls="gates")} +

    {esc(best)} fails only the sample-size gate ({b['oos']['trades']} trades against 100). The gate stays as it is. Each additional +month of data adds roughly six out-of-sample trades, so the monthly re-run will settle it honestly. +{"MomentumRotation1d fails the sample-size and walk-forward gates." if rot is not None else ""}

    + +

    5.3 Consistency across market regimes

    +{f'
    {figure2}
    Figure 2. Return per three-month walk-forward window. The row under the labels shows the equal-weight market change (“mkt”). The full table is in Appendix A.
    ' if figure2 else ""} +

    {regime_text}

    + +

    5.4 Small accounts (RQ3)

    +

    Binance requires a minimum order value. With 65 USDT, the risk-based position sizes ranged from about 6 to 26 USDT (median about 8), +which stayed above that minimum, so the strategies placed almost exactly the same trades as with 1,000 USDT and percentage +results are nearly identical. Exchange fees are proportional, and a self-hosted system has no subscription, so a small account carries no +structural cost penalty here. In absolute terms, though, +17% over the 16-month out-of-sample period on 100 AUD is about 17 AUD.

    +{small_section} + +

    5.5 More risk per trade (RQ4)

    +{table(["Risk per trade", "Caps (position / open risk / daily loss / halt)", "IS return", "OOS return", "OOS max DD", "OOS PF"], + [[esc(r[0]), esc(r[1]), pct(r[2]), pct(r[3]), pct(r[4], sign=False), f"{r[5]:.2f}"] for r in RISK_SCALING], + num_from=2, caption="Table 5. TrendRider4h at higher risk (65 USDT start).")} +

    Doubling the risk added about three points of out-of-sample return but doubled the drawdown and pushed the profit factor +below the 1.3 gate. Tripling it lost money in-sample. More risk did not create more edge. It mostly scaled losses and triggered the +drawdown halts.

    + +

    5.6 Parameter sensitivity of the rotation strategy

    +{table(["Momentum lookback (days)"] + [str(n) for n, _ in ROTATION_LOOKBACK], [["In-sample return"] + [pct(v) for _, v in ROTATION_LOOKBACK]], + caption="Table 7. MomentumRotation1d in-sample return by lookback (top 3, 65 USDT start, measured before the warm-up fix).")} +

    The 14-day setting was the in-sample best, but neighbouring settings fell sharply, from +37% at 14 days to −4% at 21 days. A +peak this narrow suggests part of the in-sample result is luck, so its out-of-sample figure should be read with that caution.

    + +

    6. Discussion

    +

    RQ1. The market sells infrastructure rather than proven edges. Fixed fees, curve-fitted marketplace strategies and centralised +key storage all work against small retail users{cite(4, 6, 17)}, and Australian rules leave own-account automation largely untouched +but regulate selling it to others{cite(8, 9)}.

    +

    RQ2. Under strict testing, edges are small and fragile. The protocol itself mattered more than any single strategy idea:

    +
      +
    • moving from hand-picked to point-in-time pairs cut TrendRider4h's in-sample return from +82.5% to +10.8% (before risk limits)
    • +
    • the risk layer then cost some return on the good strategy and halved the losses of the bad one{cite(REPO_REF)}
    • +
    +

    The best strategy's out-of-sample result is respectable against a falling market, but it rests on about 100 trades.

    +

    RQ3. A 100 AUD account is technically viable on Binance spot with this design. What it cannot do is produce large absolute +profits. RQ4. Raising risk is not a shortcut to “high profit”: return per unit of drawdown got worse.

    + +

    7. Limitations

    +
      +
    • Survivorship bias. Coins delisted before the data was downloaded are missing.
    • +
    • No slippage model. Backtests fill at candle prices plus fees. Paper trading and the paper-versus-replay gate exist to measure the gap.
    • +
    • Small samples and in-sample selection. Both are discussed above. TrendRider4h's parameters were also tuned on an earlier +hand-picked pair list.
    • +
    • Untested assumptions. The 65 USDT conversion uses an assumed exchange rate.
    • +
    • Unverified market sources. The figures in Section 2 come from the secondary web sources listed and were not independently verified.
    • +
    + +

    8. Conclusion

    +

    Automated trading moves execution from a person to a machine; it does not remove market risk. Measured honestly, with +point-in-time pairs, untouched out-of-sample data, walk-forward windows, stress and bias checks, {verdict}. The best candidate +is close, and the remaining steps are procedural:

    +
      +
    1. keep re-running the gates monthly
    2. +
    3. paper-trade it for at least four weeks
    4. +
    5. require the paper results to match a replay of the same weeks
    6. +
    +

    For small accounts, the practical lessons are to avoid fixed costs, keep risk per trade small, and judge any strategy on data it was +not designed on.

    +

    This document describes software and research results. It is not financial advice, and backtests do not predict +future returns. Only risk money you can afford to lose.

    + +

    Appendix A. Walk-forward windows

    +{table(["Window"] + [esc(s) for s in order] + ["Market"], wf_table, caption="Table A1. Return per three-month window (point-in-time pairs, risk limits on, 1,000 USDT start).")} + +

    References

    +
      {"".join(f'
    1. {esc(t)}. {esc(u)}
    2. ' for t, u in REFERENCES)}
    +""" + + +def _short(value) -> str: + if isinstance(value, bool): + return "yes" if value else "no" + if isinstance(value, float): + return f"{value:g}" + return str(value) + + +def _window_label(window: str) -> str: + start = window.split(" -> ")[0] + year, month = start[2:4], int(start[5:7]) + return f"Q{(month - 1) // 3 + 1} {year}" + + +def find_browser(explicit: str | None) -> str: + candidates = [explicit] if explicit else [ + os.path.expandvars(r"%ProgramFiles(x86)%\Microsoft\Edge\Application\msedge.exe"), + os.path.expandvars(r"%ProgramFiles%\Microsoft\Edge\Application\msedge.exe"), + os.path.expandvars(r"%ProgramFiles%\Google\Chrome\Application\chrome.exe"), + shutil.which("google-chrome") or "", shutil.which("chromium") or "", shutil.which("chromium-browser") or "", + ] + for c in candidates: + if c and Path(c).exists(): + return c + sys.exit("No Edge/Chrome/Chromium found to print the PDF; pass --browser PATH.") + + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--browser", help="Edge, Chrome or Chromium executable") + ap.add_argument("-o", "--out", type=Path, default=OUT) + args = ap.parse_args() + + report = json.loads((RESEARCH / "latest.json").read_text()) + small_path = RESEARCH / "latest-65.json" + small = json.loads(small_path.read_text()) if small_path.exists() else None + BUILD.mkdir(parents=True, exist_ok=True) + page = BUILD / "case-study.html" + page.write_text(build_html(report, small), encoding="utf-8") + + browser = find_browser(args.browser) + with tempfile.TemporaryDirectory() as profile: + subprocess.run([browser, "--headless=new", "--disable-gpu", "--no-pdf-header-footer", f"--user-data-dir={profile}", + f"--print-to-pdf={args.out.resolve()}", page.resolve().as_uri()], + check=True, capture_output=True, timeout=180) + print(args.out) + + +if __name__ == "__main__": + main() diff --git a/scripts/research.py b/scripts/research.py index 1d1eb90..69517dd 100644 --- a/scripts/research.py +++ b/scripts/research.py @@ -281,14 +281,37 @@ def recursive(strategy: str) -> dict: out = RESEARCH_DIR / "bias" / strategy out.mkdir(parents=True, exist_ok=True) (out / "recursive.log").write_text(text) - # Table rows look like "| rsi | 0.005% | ..." - take the worst deviation. - pcts = [abs(float(m)) for m in re.findall(r"(-?\d+\.\d+)%", text)] if log.returncode != 0: return {"recursive_max_diff_pct": None, "recursive_note": "analysis failed, see recursive.log"} - if not pcts and "No variance on indicator" in text: + worst = worst_recursive_deviation(text) + if worst is None and "No variance on indicator" in text: return {"recursive_max_diff_pct": 0.0, "recursive_note": "no variance"} - return {"recursive_max_diff_pct": round(max(pcts), 4) if pcts else 0.0, - "recursive_note": "worst indicator deviation with fewer startup candles"} + return {"recursive_max_diff_pct": worst or 0.0, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more"} + + +def worst_recursive_deviation(text: str): + """Worst indicator deviation in recursive-analysis output, at the + strategy's own startup candle count or more. Columns with fewer candles + than the strategy declares test a setup that never runs: Freqtrade always + loads the declared startup candles first.""" + rows = [[c.strip() for c in line.strip().strip("|").split("|")] + for line in text.splitlines() if line.startswith("|")] + header = next((r for r in rows if r and r[0] == "Indicators"), None) + if header is None: + return None + counts = [int(re.match(r"\d+", h).group()) for h in header[1:]] + own = next((c for h, c in zip(header[1:], counts) if "from strategy" in h), min(counts)) + keep = [i + 1 for i, c in enumerate(counts) if c >= own] + worst = 0.0 + for row in rows: + if row is header or len(row) != len(header): + continue + for i in keep: + m = re.fullmatch(r"(-?\d+\.\d+)%", row[i]) + if m: + worst = max(worst, abs(float(m.group(1)))) + return round(worst, 4) def bias(strategies: list[str]) -> dict: @@ -428,7 +451,8 @@ def main() -> None: print(f"\n{s}: {verdict}") for g in r["gates"]: print(f" [{'PASS' if g['pass'] else 'FAIL'}] {g['label']} (got {g['value']})") - print(f"\nwritten to {RESEARCH_DIR / 'latest.json'}") + name = "latest.json" if BALANCE == 1000 else f"latest-{BALANCE:g}.json" + print(f"\nwritten to {RESEARCH_DIR / name}") if __name__ == "__main__": diff --git a/tests/test_universe.py b/tests/test_universe.py index 4dadb19..c5ee9f6 100644 --- a/tests/test_universe.py +++ b/tests/test_universe.py @@ -48,3 +48,21 @@ def test_filters(datadir): assert "USDC/USDT" not in universe # blacklisted assert "NEW/USDT" not in universe # < 210 days of history assert "DEAD/USDT" not in universe # not trading in the lookback window + + +RECURSIVE_TABLE = """ +| Indicators | 199 | 360 (from strategy) | 399 | 499 | 999 | 1999 | +|---------------+---------+---------------------+---------+---------+--------+--------| +| btc_ema200_1d | -5.978% | 0.392% | -0.118% | -0.148% | 0.041% | 0.041% | +| ema50 | -0.003% | -0.000% | 0.000% | -0.000% | 0.000% | 0.000% | +| atr | -0.000% | 0.000% | 0.000% | - | - | - | +| score | - | - | nan% | 0.000% | 0.000% | 0.000% | +""" + + +def test_recursive_gate_ignores_fewer_startup_candles_than_the_strategy_uses(): + import research + + # 5.978% is at 199 candles, below the 360 the strategy always gets. + assert research.worst_recursive_deviation(RECURSIVE_TABLE) == 0.392 + assert research.worst_recursive_deviation("no table here") is None diff --git a/user_data/research/latest-65.json b/user_data/research/latest-65.json new file mode 100644 index 0000000..dd3cde7 --- /dev/null +++ b/user_data/research/latest-65.json @@ -0,0 +1,1027 @@ +{ + "generated": "2026-10-10T15:41:02+00:00", + "periods": { + "is": [ + "2023-06-01", + "2025-06-01" + ], + "oos": [ + "2025-06-01", + "2026-10-10" + ] + }, + "benchmarks": { + "is": { + "equal_weight_pct": 89.11, + "btc_pct": 293.93 + }, + "oos": { + "equal_weight_pct": -32.82, + "btc_pct": -21.78 + } + }, + "universe": { + "method": "point-in-time top 25 by 30d volume", + "is": [ + "BTC/USDT", + "ETH/USDT", + "XRP/USDT", + "BNB/USDT", + "LTC/USDT", + "SOL/USDT", + "CFX/USDT", + "DOGE/USDT", + "ARPA/USDT", + "ADA/USDT", + "GALA/USDT", + "RAD/USDT", + "APT/USDT", + "OP/USDT", + "TRX/USDT", + "INJ/USDT", + "LDO/USDT", + "AVAX/USDT", + "FIL/USDT", + "SHIB/USDT", + "MASK/USDT", + "LINK/USDT", + "FET/USDT", + "JASMY/USDT", + "STX/USDT" + ], + "oos": [ + "BTC/USDT", + "ETH/USDT", + "SOL/USDT", + "PEPE/USDT", + "XRP/USDT", + "DOGE/USDT", + "SUI/USDT", + "BNB/USDT", + "TRX/USDT", + "WIF/USDT", + "ADA/USDT", + "NEIRO/USDT", + "ENA/USDT", + "WLD/USDT", + "AVAX/USDT", + "LINK/USDT", + "LTC/USDT", + "BONK/USDT", + "UNI/USDT", + "AAVE/USDT", + "ETHFI/USDT", + "TAO/USDT", + "SHIB/USDT", + "NEAR/USDT", + "ARB/USDT" + ] + }, + "strategies": { + "EmaRsiMomentum": { + "is": { + "strategy": "EmaRsiMomentum", + "timerange": "20230601-20250601", + "start": "2023-06-01 00:00:00", + "end": "2025-06-01 00:00:00", + "starting_balance": 65.0, + "final_balance": 70.09, + "profit_pct": 7.82, + "market_change_pct": 85.52, + "max_drawdown_pct": 21.42, + "profit_factor": 1.07, + "winrate_pct": 52.9, + "trades": 189, + "calmar": 0.95, + "sharpe": 0.14, + "cagr_pct": 3.83, + "exit_reasons": { + "roi": { + "count": 110, + "profit_abs": 73.38 + }, + "trailing_stop_loss": { + "count": 79, + "profit_abs": -68.29 + } + } + }, + "oos": { + "strategy": "EmaRsiMomentum", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-10 00:00:00", + "starting_balance": 65.0, + "final_balance": 68.29, + "profit_pct": 5.07, + "market_change_pct": -31.67, + "max_drawdown_pct": 18.09, + "profit_factor": 1.13, + "winrate_pct": 58.1, + "trades": 74, + "calmar": 1.08, + "sharpe": 0.15, + "cagr_pct": 3.7, + "exit_reasons": { + "roi": { + "count": 43, + "profit_abs": 28.76 + }, + "trailing_stop_loss": { + "count": 31, + "profit_abs": -25.47 + } + } + }, + "stress": { + "strategy": "EmaRsiMomentum", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-10 00:00:00", + "starting_balance": 65.0, + "final_balance": 67.0, + "profit_pct": 3.08, + "market_change_pct": -31.67, + "max_drawdown_pct": 18.34, + "profit_factor": 1.08, + "winrate_pct": 52.7, + "trades": 74, + "calmar": 0.65, + "sharpe": 0.09, + "cagr_pct": 2.26, + "exit_reasons": { + "roi": { + "count": 43, + "profit_abs": 27.43 + }, + "trailing_stop_loss": { + "count": 31, + "profit_abs": -25.43 + } + } + }, + "walkforward": { + "windows": [ + { + "window": "2023-06-01 -> 2023-09-01", + "profit_pct": -5.74, + "trades": 18, + "market_change_pct": -20.06 + }, + { + "window": "2023-09-01 -> 2023-12-01", + "profit_pct": 6.28, + "trades": 23, + "market_change_pct": 51.5 + }, + { + "window": "2023-12-01 -> 2024-03-01", + "profit_pct": 8.97, + "trades": 47, + "market_change_pct": 57.02 + }, + { + "window": "2024-03-01 -> 2024-06-01", + "profit_pct": -7.06, + "trades": 23, + "market_change_pct": 20.51 + }, + { + "window": "2024-06-01 -> 2024-09-01", + "profit_pct": -8.41, + "trades": 17, + "market_change_pct": -37.21 + }, + { + "window": "2024-09-01 -> 2024-12-01", + "profit_pct": 1.33, + "trades": 22, + "market_change_pct": 97.44 + }, + { + "window": "2024-12-01 -> 2025-03-01", + "profit_pct": -2.17, + "trades": 14, + "market_change_pct": -42.39 + }, + { + "window": "2025-03-01 -> 2025-06-01", + "profit_pct": -1.86, + "trades": 18, + "market_change_pct": 5.71 + }, + { + "window": "2025-06-01 -> 2025-09-01", + "profit_pct": 4.7, + "trades": 20, + "market_change_pct": 19.44 + }, + { + "window": "2025-09-01 -> 2025-12-01", + "profit_pct": -2.56, + "trades": 13, + "market_change_pct": -42.63 + }, + { + "window": "2025-12-01 -> 2026-03-01", + "profit_pct": -7.76, + "trades": 7, + "market_change_pct": -33.34 + }, + { + "window": "2026-03-01 -> 2026-06-01", + "profit_pct": -6.13, + "trades": 16, + "market_change_pct": 7.44 + }, + { + "window": "2026-06-01 -> 2026-09-01", + "profit_pct": 1.74, + "trades": 10, + "market_change_pct": -0.87 + }, + { + "window": "2026-09-01 -> 2026-10-10", + "profit_pct": 13.7, + "trades": 15, + "market_change_pct": 19.98 + } + ], + "pct_profitable": 42.9, + "worst_pct": -8.41 + }, + "bias": { + "lookahead_clean": true, + "lookahead_note": "20 signals checked; biased indicators: none", + "recursive_max_diff_pct": 0.001, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" + }, + "gates": [ + { + "label": "OOS profit > 0%", + "value": 5.07, + "pass": true + }, + { + "label": "OOS profit factor >= 1.3", + "value": 1.13, + "pass": false + }, + { + "label": "OOS max drawdown <= 20%", + "value": 18.09, + "pass": true + }, + { + "label": "OOS Calmar >= 1.0", + "value": 1.08, + "pass": true + }, + { + "label": "OOS trades >= 100", + "value": 74, + "pass": false + }, + { + "label": "Profitable in >= 60% of walk-forward windows", + "value": 42.9, + "pass": false + }, + { + "label": "OOS still profitable with +50% fees", + "value": 3.08, + "pass": true + }, + { + "label": "No lookahead bias", + "value": true, + "pass": true + }, + { + "label": "Indicators stable vs startup candles (<= 1%)", + "value": 0.001, + "pass": true + } + ], + "eligible_for_paper": false + }, + "MomentumRotation1d": { + "is": { + "strategy": "MomentumRotation1d", + "timerange": "20230601-20250601", + "start": "2023-06-01 00:00:00", + "end": "2025-06-01 00:00:00", + "starting_balance": 65.0, + "final_balance": 86.86, + "profit_pct": 33.64, + "market_change_pct": 89.11, + "max_drawdown_pct": 12.79, + "profit_factor": 1.41, + "winrate_pct": 43.9, + "trades": 198, + "calmar": 6.87, + "sharpe": 0.56, + "cagr_pct": 15.58, + "exit_reasons": { + "exit_signal": { + "count": 149, + "profit_abs": 20.39 + }, + "trailing_stop_loss": { + "count": 42, + "profit_abs": 10.34 + }, + "stop_loss": { + "count": 7, + "profit_abs": -8.87 + } + } + }, + "oos": { + "strategy": "MomentumRotation1d", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-09 00:00:00", + "starting_balance": 65.0, + "final_balance": 74.08, + "profit_pct": 13.98, + "market_change_pct": -32.82, + "max_drawdown_pct": 7.06, + "profit_factor": 1.62, + "winrate_pct": 43.8, + "trades": 64, + "calmar": 7.64, + "sharpe": 0.34, + "cagr_pct": 10.13, + "exit_reasons": { + "exit_signal": { + "count": 44, + "profit_abs": 12.79 + }, + "force_exit": { + "count": 1, + "profit_abs": -0.44 + }, + "trailing_stop_loss": { + "count": 17, + "profit_abs": -1.23 + }, + "stop_loss": { + "count": 2, + "profit_abs": -2.03 + } + } + }, + "stress": { + "strategy": "MomentumRotation1d", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-09 00:00:00", + "starting_balance": 65.0, + "final_balance": 73.43, + "profit_pct": 12.97, + "market_change_pct": -32.82, + "max_drawdown_pct": 6.6, + "profit_factor": 1.59, + "winrate_pct": 45.2, + "trades": 62, + "calmar": 7.58, + "sharpe": 0.32, + "cagr_pct": 9.41, + "exit_reasons": { + "exit_signal": { + "count": 41, + "profit_abs": 12.46 + }, + "trailing_stop_loss": { + "count": 17, + "profit_abs": -0.45 + }, + "force_exit": { + "count": 2, + "profit_abs": -1.55 + }, + "stop_loss": { + "count": 2, + "profit_abs": -2.04 + } + } + }, + "walkforward": { + "windows": [ + { + "window": "2023-06-01 -> 2023-09-01", + "profit_pct": -3.36, + "trades": 25, + "market_change_pct": -21.36 + }, + { + "window": "2023-09-01 -> 2023-12-01", + "profit_pct": 5.23, + "trades": 23, + "market_change_pct": 57.28 + }, + { + "window": "2023-12-01 -> 2024-03-01", + "profit_pct": 13.98, + "trades": 29, + "market_change_pct": 59.77 + }, + { + "window": "2024-03-01 -> 2024-06-01", + "profit_pct": -4.3, + "trades": 26, + "market_change_pct": 9.47 + }, + { + "window": "2024-06-01 -> 2024-09-01", + "profit_pct": -9.31, + "trades": 24, + "market_change_pct": -40.81 + }, + { + "window": "2024-09-01 -> 2024-12-01", + "profit_pct": 3.11, + "trades": 27, + "market_change_pct": 114.33 + }, + { + "window": "2024-12-01 -> 2025-03-01", + "profit_pct": -15.39, + "trades": 24, + "market_change_pct": -43.91 + }, + { + "window": "2025-03-01 -> 2025-06-01", + "profit_pct": -4.05, + "trades": 23, + "market_change_pct": 5.5 + }, + { + "window": "2025-06-01 -> 2025-09-01", + "profit_pct": 7.24, + "trades": 23, + "market_change_pct": 15.51 + }, + { + "window": "2025-09-01 -> 2025-12-01", + "profit_pct": 1.77, + "trades": 15, + "market_change_pct": -42.47 + }, + { + "window": "2025-12-01 -> 2026-03-01", + "profit_pct": 0.0, + "trades": 0, + "market_change_pct": -33.6 + }, + { + "window": "2026-03-01 -> 2026-06-01", + "profit_pct": -0.53, + "trades": 2, + "market_change_pct": 7.9 + }, + { + "window": "2026-06-01 -> 2026-09-01", + "profit_pct": 4.84, + "trades": 4, + "market_change_pct": -0.46 + }, + { + "window": "2026-09-01 -> 2026-10-10", + "profit_pct": 13.23, + "trades": 12, + "market_change_pct": 19.59 + } + ], + "pct_profitable": 50.0, + "worst_pct": -15.39 + }, + "bias": { + "lookahead_clean": true, + "lookahead_note": "cross-sectional: 129 trades compared with later data removed from all pairs (87 in the full run); no differences", + "recursive_max_diff_pct": 0.392, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" + }, + "gates": [ + { + "label": "OOS profit > 0%", + "value": 13.98, + "pass": true + }, + { + "label": "OOS profit factor >= 1.3", + "value": 1.62, + "pass": true + }, + { + "label": "OOS max drawdown <= 20%", + "value": 7.06, + "pass": true + }, + { + "label": "OOS Calmar >= 1.0", + "value": 7.64, + "pass": true + }, + { + "label": "OOS trades >= 100", + "value": 64, + "pass": false + }, + { + "label": "Profitable in >= 60% of walk-forward windows", + "value": 50.0, + "pass": false + }, + { + "label": "OOS still profitable with +50% fees", + "value": 12.97, + "pass": true + }, + { + "label": "No lookahead bias", + "value": true, + "pass": true + }, + { + "label": "Indicators stable vs startup candles (<= 1%)", + "value": 0.392, + "pass": true + } + ], + "eligible_for_paper": false + }, + "TrendDipBuyer1h": { + "is": { + "strategy": "TrendDipBuyer1h", + "timerange": "20230601-20250601", + "start": "2023-06-01 00:00:00", + "end": "2025-06-01 00:00:00", + "starting_balance": 65.0, + "final_balance": 59.8, + "profit_pct": -7.99, + "market_change_pct": 85.52, + "max_drawdown_pct": 26.28, + "profit_factor": 0.96, + "winrate_pct": 64.3, + "trades": 932, + "calmar": -0.79, + "sharpe": -0.35, + "cagr_pct": -4.07, + "exit_reasons": { + "exit_signal": { + "count": 732, + "profit_abs": 56.07 + }, + "roi": { + "count": 92, + "profit_abs": 35.53 + }, + "trailing_stop_loss": { + "count": 108, + "profit_abs": -96.79 + } + } + }, + "oos": { + "strategy": "TrendDipBuyer1h", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-10 00:00:00", + "starting_balance": 65.0, + "final_balance": 53.49, + "profit_pct": -17.71, + "market_change_pct": -31.67, + "max_drawdown_pct": 19.11, + "profit_factor": 0.73, + "winrate_pct": 62.7, + "trades": 300, + "calmar": -3.57, + "sharpe": -1.28, + "cagr_pct": -13.37, + "exit_reasons": { + "roi": { + "count": 25, + "profit_abs": 8.09 + }, + "exit_signal": { + "count": 242, + "profit_abs": 7.82 + }, + "trailing_stop_loss": { + "count": 33, + "profit_abs": -27.42 + } + } + }, + "stress": { + "strategy": "TrendDipBuyer1h", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-10 00:00:00", + "starting_balance": 65.0, + "final_balance": 49.02, + "profit_pct": -24.59, + "market_change_pct": -31.67, + "max_drawdown_pct": 25.69, + "profit_factor": 0.62, + "winrate_pct": 59.2, + "trades": 284, + "calmar": -3.69, + "sharpe": -1.83, + "cagr_pct": -18.75, + "exit_reasons": { + "roi": { + "count": 22, + "profit_abs": 6.99 + }, + "exit_signal": { + "count": 228, + "profit_abs": 4.25 + }, + "trailing_stop_loss": { + "count": 34, + "profit_abs": -27.23 + } + } + }, + "walkforward": { + "windows": [ + { + "window": "2023-06-01 -> 2023-09-01", + "profit_pct": -7.65, + "trades": 116, + "market_change_pct": -20.06 + }, + { + "window": "2023-09-01 -> 2023-12-01", + "profit_pct": 3.33, + "trades": 119, + "market_change_pct": 51.5 + }, + { + "window": "2023-12-01 -> 2024-03-01", + "profit_pct": 7.12, + "trades": 171, + "market_change_pct": 57.02 + }, + { + "window": "2024-03-01 -> 2024-06-01", + "profit_pct": -0.35, + "trades": 135, + "market_change_pct": 20.51 + }, + { + "window": "2024-06-01 -> 2024-09-01", + "profit_pct": -5.6, + "trades": 79, + "market_change_pct": -37.21 + }, + { + "window": "2024-09-01 -> 2024-12-01", + "profit_pct": 7.33, + "trades": 140, + "market_change_pct": 97.44 + }, + { + "window": "2024-12-01 -> 2025-03-01", + "profit_pct": 6.54, + "trades": 116, + "market_change_pct": -42.39 + }, + { + "window": "2025-03-01 -> 2025-06-01", + "profit_pct": -2.38, + "trades": 93, + "market_change_pct": 5.71 + }, + { + "window": "2025-06-01 -> 2025-09-01", + "profit_pct": -8.81, + "trades": 135, + "market_change_pct": 19.44 + }, + { + "window": "2025-09-01 -> 2025-12-01", + "profit_pct": -4.8, + "trades": 74, + "market_change_pct": -42.63 + }, + { + "window": "2025-12-01 -> 2026-03-01", + "profit_pct": 0.0, + "trades": 0, + "market_change_pct": -33.34 + }, + { + "window": "2026-03-01 -> 2026-06-01", + "profit_pct": 0.28, + "trades": 1, + "market_change_pct": 7.44 + }, + { + "window": "2026-06-01 -> 2026-09-01", + "profit_pct": -0.81, + "trades": 18, + "market_change_pct": -0.87 + }, + { + "window": "2026-09-01 -> 2026-10-10", + "profit_pct": -0.11, + "trades": 86, + "market_change_pct": 19.98 + } + ], + "pct_profitable": 35.7, + "worst_pct": -8.81 + }, + "bias": { + "lookahead_clean": true, + "lookahead_note": "20 signals checked; biased indicators: none", + "recursive_max_diff_pct": 0.0, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" + }, + "gates": [ + { + "label": "OOS profit > 0%", + "value": -17.71, + "pass": false + }, + { + "label": "OOS profit factor >= 1.3", + "value": 0.73, + "pass": false + }, + { + "label": "OOS max drawdown <= 20%", + "value": 19.11, + "pass": true + }, + { + "label": "OOS Calmar >= 1.0", + "value": -3.57, + "pass": false + }, + { + "label": "OOS trades >= 100", + "value": 300, + "pass": true + }, + { + "label": "Profitable in >= 60% of walk-forward windows", + "value": 35.7, + "pass": false + }, + { + "label": "OOS still profitable with +50% fees", + "value": -24.59, + "pass": false + }, + { + "label": "No lookahead bias", + "value": true, + "pass": true + }, + { + "label": "Indicators stable vs startup candles (<= 1%)", + "value": 0.0, + "pass": true + } + ], + "eligible_for_paper": false + }, + "TrendRider4h": { + "is": { + "strategy": "TrendRider4h", + "timerange": "20230601-20250601", + "start": "2023-06-01 00:00:00", + "end": "2025-06-01 00:00:00", + "starting_balance": 65.0, + "final_balance": 68.74, + "profit_pct": 5.76, + "market_change_pct": 85.76, + "max_drawdown_pct": 15.08, + "profit_factor": 1.06, + "winrate_pct": 35.8, + "trades": 274, + "calmar": 1.0, + "sharpe": 0.11, + "cagr_pct": 2.83, + "exit_reasons": { + "exit_signal": { + "count": 242, + "profit_abs": 12.32 + }, + "trailing_stop_loss": { + "count": 26, + "profit_abs": -2.56 + }, + "stop_loss": { + "count": 6, + "profit_abs": -6.02 + } + } + }, + "oos": { + "strategy": "TrendRider4h", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-10 00:00:00", + "starting_balance": 65.0, + "final_balance": 76.35, + "profit_pct": 17.47, + "market_change_pct": -31.1, + "max_drawdown_pct": 9.66, + "profit_factor": 1.44, + "winrate_pct": 34.3, + "trades": 99, + "calmar": 6.97, + "sharpe": 0.49, + "cagr_pct": 12.58, + "exit_reasons": { + "exit_signal": { + "count": 93, + "profit_abs": 14.33 + }, + "trailing_stop_loss": { + "count": 6, + "profit_abs": -2.97 + } + } + }, + "stress": { + "strategy": "TrendRider4h", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-10 00:00:00", + "starting_balance": 65.0, + "final_balance": 74.93, + "profit_pct": 15.28, + "market_change_pct": -31.1, + "max_drawdown_pct": 9.9, + "profit_factor": 1.38, + "winrate_pct": 34.3, + "trades": 99, + "calmar": 5.94, + "sharpe": 0.43, + "cagr_pct": 11.03, + "exit_reasons": { + "exit_signal": { + "count": 93, + "profit_abs": 12.95 + }, + "trailing_stop_loss": { + "count": 6, + "profit_abs": -3.01 + } + } + }, + "walkforward": { + "windows": [ + { + "window": "2023-06-01 -> 2023-09-01", + "profit_pct": -6.95, + "trades": 35, + "market_change_pct": -19.69 + }, + { + "window": "2023-09-01 -> 2023-12-01", + "profit_pct": 0.74, + "trades": 34, + "market_change_pct": 54.45 + }, + { + "window": "2023-12-01 -> 2024-03-01", + "profit_pct": 22.22, + "trades": 48, + "market_change_pct": 54.6 + }, + { + "window": "2024-03-01 -> 2024-06-01", + "profit_pct": 2.41, + "trades": 47, + "market_change_pct": 21.27 + }, + { + "window": "2024-06-01 -> 2024-09-01", + "profit_pct": -5.45, + "trades": 25, + "market_change_pct": -37.95 + }, + { + "window": "2024-09-01 -> 2024-12-01", + "profit_pct": 30.46, + "trades": 43, + "market_change_pct": 97.89 + }, + { + "window": "2024-12-01 -> 2025-03-01", + "profit_pct": 0.62, + "trades": 32, + "market_change_pct": -41.03 + }, + { + "window": "2025-03-01 -> 2025-06-01", + "profit_pct": 0.75, + "trades": 21, + "market_change_pct": 3.16 + }, + { + "window": "2025-06-01 -> 2025-09-01", + "profit_pct": 5.53, + "trades": 46, + "market_change_pct": 18.99 + }, + { + "window": "2025-09-01 -> 2025-12-01", + "profit_pct": -1.0, + "trades": 27, + "market_change_pct": -42.56 + }, + { + "window": "2025-12-01 -> 2026-03-01", + "profit_pct": 0.0, + "trades": 0, + "market_change_pct": -31.3 + }, + { + "window": "2026-03-01 -> 2026-06-01", + "profit_pct": -0.85, + "trades": 1, + "market_change_pct": 5.11 + }, + { + "window": "2026-06-01 -> 2026-09-01", + "profit_pct": 6.04, + "trades": 7, + "market_change_pct": -0.76 + }, + { + "window": "2026-09-01 -> 2026-10-10", + "profit_pct": 0.24, + "trades": 21, + "market_change_pct": 20.38 + } + ], + "pct_profitable": 64.3, + "worst_pct": -6.95 + }, + "bias": { + "lookahead_clean": true, + "lookahead_note": "20 signals checked; biased indicators: none", + "recursive_max_diff_pct": 0.0, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" + }, + "gates": [ + { + "label": "OOS profit > 0%", + "value": 17.47, + "pass": true + }, + { + "label": "OOS profit factor >= 1.3", + "value": 1.44, + "pass": true + }, + { + "label": "OOS max drawdown <= 20%", + "value": 9.66, + "pass": true + }, + { + "label": "OOS Calmar >= 1.0", + "value": 6.97, + "pass": true + }, + { + "label": "OOS trades >= 100", + "value": 99, + "pass": false + }, + { + "label": "Profitable in >= 60% of walk-forward windows", + "value": 64.3, + "pass": true + }, + { + "label": "OOS still profitable with +50% fees", + "value": 15.28, + "pass": true + }, + { + "label": "No lookahead bias", + "value": true, + "pass": true + }, + { + "label": "Indicators stable vs startup candles (<= 1%)", + "value": 0.0, + "pass": true + } + ], + "eligible_for_paper": false + } + }, + "balance": 65.0 +} \ No newline at end of file diff --git a/user_data/research/latest.json b/user_data/research/latest.json index bd69fa7..2da0dbf 100644 --- a/user_data/research/latest.json +++ b/user_data/research/latest.json @@ -1,5 +1,5 @@ { - "generated": "2026-10-10T14:06:21+00:00", + "generated": "2026-10-10T15:37:03+00:00", "periods": { "is": [ "2023-06-01", @@ -253,8 +253,8 @@ "bias": { "lookahead_clean": true, "lookahead_note": "20 signals checked; biased indicators: none", - "recursive_max_diff_pct": 0.338, - "recursive_note": "worst indicator deviation with fewer startup candles" + "recursive_max_diff_pct": 0.001, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" }, "gates": [ { @@ -299,7 +299,246 @@ }, { "label": "Indicators stable vs startup candles (<= 1%)", - "value": 0.338, + "value": 0.001, + "pass": true + } + ], + "eligible_for_paper": false + }, + "MomentumRotation1d": { + "is": { + "strategy": "MomentumRotation1d", + "timerange": "20230601-20250601", + "start": "2023-06-01 00:00:00", + "end": "2025-06-01 00:00:00", + "starting_balance": 1000.0, + "final_balance": 1244.39, + "profit_pct": 24.44, + "market_change_pct": 89.11, + "max_drawdown_pct": 14.77, + "profit_factor": 1.29, + "winrate_pct": 40.8, + "trades": 201, + "calmar": 4.32, + "sharpe": 0.41, + "cagr_pct": 11.54, + "exit_reasons": { + "exit_signal": { + "count": 149, + "profit_abs": 222.64 + }, + "trailing_stop_loss": { + "count": 45, + "profit_abs": 149.39 + }, + "stop_loss": { + "count": 7, + "profit_abs": -127.63 + } + } + }, + "oos": { + "strategy": "MomentumRotation1d", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-09 00:00:00", + "starting_balance": 1000.0, + "final_balance": 1131.24, + "profit_pct": 13.12, + "market_change_pct": -32.82, + "max_drawdown_pct": 5.21, + "profit_factor": 1.59, + "winrate_pct": 42.9, + "trades": 63, + "calmar": 9.72, + "sharpe": 0.32, + "cagr_pct": 9.52, + "exit_reasons": { + "exit_signal": { + "count": 44, + "profit_abs": 202.89 + }, + "force_exit": { + "count": 2, + "profit_abs": -20.52 + }, + "trailing_stop_loss": { + "count": 17, + "profit_abs": -51.13 + } + } + }, + "stress": { + "strategy": "MomentumRotation1d", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-09 00:00:00", + "starting_balance": 1000.0, + "final_balance": 1123.73, + "profit_pct": 12.37, + "market_change_pct": -32.82, + "max_drawdown_pct": 5.35, + "profit_factor": 1.54, + "winrate_pct": 42.9, + "trades": 63, + "calmar": 8.92, + "sharpe": 0.3, + "cagr_pct": 8.98, + "exit_reasons": { + "exit_signal": { + "count": 44, + "profit_abs": 197.48 + }, + "force_exit": { + "count": 2, + "profit_abs": -20.53 + }, + "trailing_stop_loss": { + "count": 17, + "profit_abs": -53.22 + } + } + }, + "walkforward": { + "windows": [ + { + "window": "2023-06-01 -> 2023-09-01", + "profit_pct": -1.77, + "trades": 25, + "market_change_pct": -21.36 + }, + { + "window": "2023-09-01 -> 2023-12-01", + "profit_pct": 5.56, + "trades": 23, + "market_change_pct": 57.28 + }, + { + "window": "2023-12-01 -> 2024-03-01", + "profit_pct": 13.85, + "trades": 30, + "market_change_pct": 59.77 + }, + { + "window": "2024-03-01 -> 2024-06-01", + "profit_pct": 3.75, + "trades": 24, + "market_change_pct": 9.47 + }, + { + "window": "2024-06-01 -> 2024-09-01", + "profit_pct": -8.01, + "trades": 25, + "market_change_pct": -40.81 + }, + { + "window": "2024-09-01 -> 2024-12-01", + "profit_pct": 0.75, + "trades": 29, + "market_change_pct": 114.33 + }, + { + "window": "2024-12-01 -> 2025-03-01", + "profit_pct": -10.7, + "trades": 26, + "market_change_pct": -43.91 + }, + { + "window": "2025-03-01 -> 2025-06-01", + "profit_pct": -3.86, + "trades": 24, + "market_change_pct": 5.5 + }, + { + "window": "2025-06-01 -> 2025-09-01", + "profit_pct": 9.29, + "trades": 24, + "market_change_pct": 15.51 + }, + { + "window": "2025-09-01 -> 2025-12-01", + "profit_pct": 2.03, + "trades": 15, + "market_change_pct": -42.47 + }, + { + "window": "2025-12-01 -> 2026-03-01", + "profit_pct": 0.0, + "trades": 0, + "market_change_pct": -33.6 + }, + { + "window": "2026-03-01 -> 2026-06-01", + "profit_pct": -0.69, + "trades": 3, + "market_change_pct": 7.9 + }, + { + "window": "2026-06-01 -> 2026-09-01", + "profit_pct": 4.91, + "trades": 4, + "market_change_pct": -0.46 + }, + { + "window": "2026-09-01 -> 2026-10-10", + "profit_pct": 10.19, + "trades": 13, + "market_change_pct": 19.59 + } + ], + "pct_profitable": 57.1, + "worst_pct": -10.7 + }, + "bias": { + "lookahead_clean": true, + "lookahead_note": "cross-sectional: 132 trades compared with later data removed from all pairs (94 in the full run); no differences", + "recursive_max_diff_pct": 0.392, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" + }, + "gates": [ + { + "label": "OOS profit > 0%", + "value": 13.12, + "pass": true + }, + { + "label": "OOS profit factor >= 1.3", + "value": 1.59, + "pass": true + }, + { + "label": "OOS max drawdown <= 20%", + "value": 5.21, + "pass": true + }, + { + "label": "OOS Calmar >= 1.0", + "value": 9.72, + "pass": true + }, + { + "label": "OOS trades >= 100", + "value": 63, + "pass": false + }, + { + "label": "Profitable in >= 60% of walk-forward windows", + "value": 57.1, + "pass": false + }, + { + "label": "OOS still profitable with +50% fees", + "value": 12.37, + "pass": true + }, + { + "label": "No lookahead bias", + "value": true, + "pass": true + }, + { + "label": "Indicators stable vs startup candles (<= 1%)", + "value": 0.392, "pass": true } ], @@ -492,8 +731,8 @@ "bias": { "lookahead_clean": true, "lookahead_note": "20 signals checked; biased indicators: none", - "recursive_max_diff_pct": 0.338, - "recursive_note": "worst indicator deviation with fewer startup candles" + "recursive_max_diff_pct": 0.0, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" }, "gates": [ { @@ -538,7 +777,7 @@ }, { "label": "Indicators stable vs startup candles (<= 1%)", - "value": 0.338, + "value": 0.0, "pass": true } ], @@ -723,8 +962,8 @@ "bias": { "lookahead_clean": true, "lookahead_note": "20 signals checked; biased indicators: none", - "recursive_max_diff_pct": 0.196, - "recursive_note": "worst indicator deviation with fewer startup candles" + "recursive_max_diff_pct": 0.0, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" }, "gates": [ { @@ -769,11 +1008,12 @@ }, { "label": "Indicators stable vs startup candles (<= 1%)", - "value": 0.196, + "value": 0.0, "pass": true } ], "eligible_for_paper": false } - } + }, + "balance": 1000.0 } \ No newline at end of file diff --git a/user_data/research/report-2026-10-11.json b/user_data/research/report-2026-10-11.json index bd69fa7..2da0dbf 100644 --- a/user_data/research/report-2026-10-11.json +++ b/user_data/research/report-2026-10-11.json @@ -1,5 +1,5 @@ { - "generated": "2026-10-10T14:06:21+00:00", + "generated": "2026-10-10T15:37:03+00:00", "periods": { "is": [ "2023-06-01", @@ -253,8 +253,8 @@ "bias": { "lookahead_clean": true, "lookahead_note": "20 signals checked; biased indicators: none", - "recursive_max_diff_pct": 0.338, - "recursive_note": "worst indicator deviation with fewer startup candles" + "recursive_max_diff_pct": 0.001, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" }, "gates": [ { @@ -299,7 +299,246 @@ }, { "label": "Indicators stable vs startup candles (<= 1%)", - "value": 0.338, + "value": 0.001, + "pass": true + } + ], + "eligible_for_paper": false + }, + "MomentumRotation1d": { + "is": { + "strategy": "MomentumRotation1d", + "timerange": "20230601-20250601", + "start": "2023-06-01 00:00:00", + "end": "2025-06-01 00:00:00", + "starting_balance": 1000.0, + "final_balance": 1244.39, + "profit_pct": 24.44, + "market_change_pct": 89.11, + "max_drawdown_pct": 14.77, + "profit_factor": 1.29, + "winrate_pct": 40.8, + "trades": 201, + "calmar": 4.32, + "sharpe": 0.41, + "cagr_pct": 11.54, + "exit_reasons": { + "exit_signal": { + "count": 149, + "profit_abs": 222.64 + }, + "trailing_stop_loss": { + "count": 45, + "profit_abs": 149.39 + }, + "stop_loss": { + "count": 7, + "profit_abs": -127.63 + } + } + }, + "oos": { + "strategy": "MomentumRotation1d", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-09 00:00:00", + "starting_balance": 1000.0, + "final_balance": 1131.24, + "profit_pct": 13.12, + "market_change_pct": -32.82, + "max_drawdown_pct": 5.21, + "profit_factor": 1.59, + "winrate_pct": 42.9, + "trades": 63, + "calmar": 9.72, + "sharpe": 0.32, + "cagr_pct": 9.52, + "exit_reasons": { + "exit_signal": { + "count": 44, + "profit_abs": 202.89 + }, + "force_exit": { + "count": 2, + "profit_abs": -20.52 + }, + "trailing_stop_loss": { + "count": 17, + "profit_abs": -51.13 + } + } + }, + "stress": { + "strategy": "MomentumRotation1d", + "timerange": "20250601-20261010", + "start": "2025-06-01 00:00:00", + "end": "2026-10-09 00:00:00", + "starting_balance": 1000.0, + "final_balance": 1123.73, + "profit_pct": 12.37, + "market_change_pct": -32.82, + "max_drawdown_pct": 5.35, + "profit_factor": 1.54, + "winrate_pct": 42.9, + "trades": 63, + "calmar": 8.92, + "sharpe": 0.3, + "cagr_pct": 8.98, + "exit_reasons": { + "exit_signal": { + "count": 44, + "profit_abs": 197.48 + }, + "force_exit": { + "count": 2, + "profit_abs": -20.53 + }, + "trailing_stop_loss": { + "count": 17, + "profit_abs": -53.22 + } + } + }, + "walkforward": { + "windows": [ + { + "window": "2023-06-01 -> 2023-09-01", + "profit_pct": -1.77, + "trades": 25, + "market_change_pct": -21.36 + }, + { + "window": "2023-09-01 -> 2023-12-01", + "profit_pct": 5.56, + "trades": 23, + "market_change_pct": 57.28 + }, + { + "window": "2023-12-01 -> 2024-03-01", + "profit_pct": 13.85, + "trades": 30, + "market_change_pct": 59.77 + }, + { + "window": "2024-03-01 -> 2024-06-01", + "profit_pct": 3.75, + "trades": 24, + "market_change_pct": 9.47 + }, + { + "window": "2024-06-01 -> 2024-09-01", + "profit_pct": -8.01, + "trades": 25, + "market_change_pct": -40.81 + }, + { + "window": "2024-09-01 -> 2024-12-01", + "profit_pct": 0.75, + "trades": 29, + "market_change_pct": 114.33 + }, + { + "window": "2024-12-01 -> 2025-03-01", + "profit_pct": -10.7, + "trades": 26, + "market_change_pct": -43.91 + }, + { + "window": "2025-03-01 -> 2025-06-01", + "profit_pct": -3.86, + "trades": 24, + "market_change_pct": 5.5 + }, + { + "window": "2025-06-01 -> 2025-09-01", + "profit_pct": 9.29, + "trades": 24, + "market_change_pct": 15.51 + }, + { + "window": "2025-09-01 -> 2025-12-01", + "profit_pct": 2.03, + "trades": 15, + "market_change_pct": -42.47 + }, + { + "window": "2025-12-01 -> 2026-03-01", + "profit_pct": 0.0, + "trades": 0, + "market_change_pct": -33.6 + }, + { + "window": "2026-03-01 -> 2026-06-01", + "profit_pct": -0.69, + "trades": 3, + "market_change_pct": 7.9 + }, + { + "window": "2026-06-01 -> 2026-09-01", + "profit_pct": 4.91, + "trades": 4, + "market_change_pct": -0.46 + }, + { + "window": "2026-09-01 -> 2026-10-10", + "profit_pct": 10.19, + "trades": 13, + "market_change_pct": 19.59 + } + ], + "pct_profitable": 57.1, + "worst_pct": -10.7 + }, + "bias": { + "lookahead_clean": true, + "lookahead_note": "cross-sectional: 132 trades compared with later data removed from all pairs (94 in the full run); no differences", + "recursive_max_diff_pct": 0.392, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" + }, + "gates": [ + { + "label": "OOS profit > 0%", + "value": 13.12, + "pass": true + }, + { + "label": "OOS profit factor >= 1.3", + "value": 1.59, + "pass": true + }, + { + "label": "OOS max drawdown <= 20%", + "value": 5.21, + "pass": true + }, + { + "label": "OOS Calmar >= 1.0", + "value": 9.72, + "pass": true + }, + { + "label": "OOS trades >= 100", + "value": 63, + "pass": false + }, + { + "label": "Profitable in >= 60% of walk-forward windows", + "value": 57.1, + "pass": false + }, + { + "label": "OOS still profitable with +50% fees", + "value": 12.37, + "pass": true + }, + { + "label": "No lookahead bias", + "value": true, + "pass": true + }, + { + "label": "Indicators stable vs startup candles (<= 1%)", + "value": 0.392, "pass": true } ], @@ -492,8 +731,8 @@ "bias": { "lookahead_clean": true, "lookahead_note": "20 signals checked; biased indicators: none", - "recursive_max_diff_pct": 0.338, - "recursive_note": "worst indicator deviation with fewer startup candles" + "recursive_max_diff_pct": 0.0, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" }, "gates": [ { @@ -538,7 +777,7 @@ }, { "label": "Indicators stable vs startup candles (<= 1%)", - "value": 0.338, + "value": 0.0, "pass": true } ], @@ -723,8 +962,8 @@ "bias": { "lookahead_clean": true, "lookahead_note": "20 signals checked; biased indicators: none", - "recursive_max_diff_pct": 0.196, - "recursive_note": "worst indicator deviation with fewer startup candles" + "recursive_max_diff_pct": 0.0, + "recursive_note": "worst indicator deviation at the strategy's startup candle count or more" }, "gates": [ { @@ -769,11 +1008,12 @@ }, { "label": "Indicators stable vs startup candles (<= 1%)", - "value": 0.196, + "value": 0.0, "pass": true } ], "eligible_for_paper": false } - } + }, + "balance": 1000.0 } \ No newline at end of file From 87e412bb9e55f9aa83d48d33dc0c9b45f77fb8f2 Mon Sep 17 00:00:00 2001 From: devam <56464719+devam2001@users.noreply.github.com> Date: Sun, 11 Oct 2026 02:42:58 +1100 Subject: [PATCH 4/5] Release packaging: Windows installer, Docker image, release workflow (v0.1.0) - installer/: Inno Setup installer with a private Python, Freqtrade and FreqUI; per-user install, Start-menu shortcuts for the panel and for updating market data. user_data (private config, sessions, data, audit) survives upgrades and uninstall; config.json is never overwritten. smoke-test.ps1 installs it silently, starts the panel and uninstalls. - Docker image now carries the code; compose mounts only user_data and can pull ghcr.io/devam2001/ridgeline instead of building. - .github/workflows/release.yml: a v* tag builds and smoke-tests both, publishes the image and creates the GitHub release with the installer and case study attached. Pull requests touching packaging build and test both. - requirements.txt pins the runtime; scripts/update_data.py runs the README's data steps; the panel shows the version. --- .dockerignore | 20 +++++- .gitattributes | 5 ++ .github/workflows/release.yml | 109 +++++++++++++++++++++++++++++++ Dockerfile | 22 +++++-- README.md | 37 +++++++++-- docker-compose.yml | 11 +++- docs/OPERATIONS.md | 11 +++- docs/releases/v0.1.0.md | 56 ++++++++++++++++ installer/INSTALL-NOTES.txt | 23 +++++++ installer/Ridgeline.cmd | 11 ++++ installer/Update market data.cmd | 9 +++ installer/build.ps1 | 66 +++++++++++++++++++ installer/ridgeline.iss | 71 ++++++++++++++++++++ installer/smoke-test.ps1 | 53 +++++++++++++++ panel/app.py | 4 +- panel/static/app.js | 4 +- panel/static/index.html | 1 + requirements.txt | 6 ++ ridgeline/__init__.py | 3 + scripts/update_data.py | 44 +++++++++++++ tests/test_repo_hygiene.py | 10 +++ 21 files changed, 557 insertions(+), 19 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/workflows/release.yml create mode 100644 docs/releases/v0.1.0.md create mode 100644 installer/INSTALL-NOTES.txt create mode 100644 installer/Ridgeline.cmd create mode 100644 installer/Update market data.cmd create mode 100644 installer/build.ps1 create mode 100644 installer/ridgeline.iss create mode 100644 installer/smoke-test.ps1 create mode 100644 requirements.txt create mode 100644 scripts/update_data.py diff --git a/.dockerignore b/.dockerignore index 42920cb..bc17919 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,21 @@ -# The image only needs the Dockerfile; the repo is mounted at runtime. +# The image carries the code; docker-compose mounts user_data/ from the host. * !Dockerfile +!panel +!ridgeline +!scripts +!user_data +user_data/config.private.json +user_data/data +user_data/paper +user_data/replays +user_data/logs +user_data/audit +user_data/backtest_results +user_data/hyperopt_results +user_data/research/runs +user_data/research/bias +user_data/plot +user_data/risk_state.json +**/*.sqlite* +**/__pycache__ diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..86d8efb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Windows scripts need CRLF line endings to run reliably from cmd/PowerShell. +*.cmd text eol=crlf +*.bat text eol=crlf +*.ps1 text eol=crlf +*.iss text eol=crlf diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..fe4ee8a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,109 @@ +name: Release + +# Pushing a tag like v0.1.0 builds and smoke-tests the Windows installer and +# the Docker image, publishes the image to ghcr.io/devam2001/ridgeline and +# creates the GitHub release with the installer attached. +# Pull requests that touch packaging build and test both without publishing. + +on: + push: + tags: ["v*"] + pull_request: + paths: + - "installer/**" + - "Dockerfile" + - ".dockerignore" + - "docker-compose.yml" + - "requirements.txt" + - ".github/workflows/release.yml" + +permissions: + contents: read + +env: + IMAGE: ghcr.io/devam2001/ridgeline + +jobs: + windows-installer: + runs-on: windows-latest + timeout-minutes: 45 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Version + shell: pwsh + run: | + $v = (Select-String -Path pyproject.toml -Pattern '^version = "(.+)"').Matches[0].Groups[1].Value + if ($env:GITHUB_REF_TYPE -eq "tag" -and $env:GITHUB_REF_NAME -ne "v$v") { + throw "tag $env:GITHUB_REF_NAME doesn't match pyproject.toml version $v" + } + "VERSION=$v" >> $env:GITHUB_ENV + + - name: Build installer + shell: pwsh + run: ./installer/build.ps1 -Python (Split-Path (Get-Command python).Source) -Version $env:VERSION + + - name: Smoke-test installer + shell: pwsh + run: ./installer/smoke-test.ps1 -Installer "build/installer/Ridgeline-Setup-$env:VERSION.exe" + + - uses: actions/upload-artifact@v4 + with: + name: windows-installer + path: build/installer/*.exe + if-no-files-found: error + + docker: + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v4 + + - name: Version + run: echo "VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' pyproject.toml)" >> "$GITHUB_ENV" + + - name: Build + run: docker build --build-arg VERSION="$VERSION" -t "$IMAGE:$VERSION" -t "$IMAGE:latest" . + + - name: Smoke-test image + run: | + docker run --rm "$IMAGE:$VERSION" sh -c ' + python scripts/init_private_config.py > /dev/null && + freqtrade list-strategies --userdir user_data -c user_data/config.json && + python -c "import panel.app; print(\"panel imports ok\")"' + + - name: Publish + if: github.ref_type == 'tag' + run: | + echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{ github.actor }}" --password-stdin + docker push "$IMAGE:$VERSION" + docker push "$IMAGE:latest" + + release: + if: github.ref_type == 'tag' + needs: [windows-installer, docker] + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - uses: actions/download-artifact@v4 + with: + name: windows-installer + path: dist + + - name: Create release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release create "$GITHUB_REF_NAME" dist/*.exe "Crypto Trading Bot Case Study.pdf" \ + --title "Ridgeline $GITHUB_REF_NAME" \ + --notes-file "docs/releases/$GITHUB_REF_NAME.md" diff --git a/Dockerfile b/Dockerfile index 1ba6b81..ae6f308 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,24 @@ -# ridgeline runtime: the official Freqtrade image plus the few extras the -# panel and watchdog use. The repository itself is mounted at /ridgeline by -# docker-compose, so data, databases, logs and the audit trail live on the host. +# ridgeline runtime: the official Freqtrade image, the few extras the panel and +# watchdog use, and the ridgeline code itself. Releases publish it as +# ghcr.io/devam2001/ridgeline, so a server can pull it instead of building. +# docker-compose mounts user_data/ from the host: config, strategies, data, +# databases, logs and the audit trail stay there. FROM freqtradeorg/freqtrade:2026.8 +ARG VERSION=dev +LABEL org.opencontainers.image.title="ridgeline" \ + org.opencontainers.image.description="Freqtrade bot with paper trading, research gates, risk controls and reporting" \ + org.opencontainers.image.source="https://github.com/devam2001/ridgeline" \ + org.opencontainers.image.version="${VERSION}" + # joblib 1.6 dropped a module Freqtrade's hyperopt imports -RUN pip install --no-cache-dir "joblib<1.6" httpx psutil +RUN pip install --no-cache-dir "joblib<1.6" "httpx>=0.27" "psutil>=5.9" WORKDIR /ridgeline +COPY panel/ panel/ +COPY ridgeline/ ridgeline/ +COPY scripts/ scripts/ +# Defaults for a container started without the user_data mount. +COPY --chown=ftuser:ftuser user_data/ user_data/ + ENTRYPOINT [] diff --git a/README.md b/README.md index 355bcce..a3c0087 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ panel cannot start a live bot at all. | `user_data/strategies/TrendRider4h.py` | 4h Donchian breakout trend-follower, BTC bear-market filter, ATR chandelier exit | | `user_data/strategies/TrendDipBuyer1h.py` | 1h buy-the-dip inside an uptrend (mean reversion) | | `user_data/strategies/EmaRsiMomentum.py` | original 1h EMA-crossover + RSI strategy (hyperoptable) | +| `user_data/strategies/MomentumRotation1d.py` | daily rotation into the 3 strongest coins by risk-adjusted momentum while BTC is in an uptrend (candidate) | | `user_data/config.json` | exchange, pairs, risk settings - **no secrets** | | `user_data/config.private.json` | API login, JWT secret, exchange keys - **never share/commit** (loaded automatically via `add_config_files`) | | `panel/` | control panel (FastAPI + plain JS) | @@ -32,6 +33,9 @@ panel cannot start a live bot at all. | `ridgeline/` | shared package: risk limits (`risk.py`, `freqtrade_risk.py`), audit trail, tear-sheet reports, paper-vs-replay reconciliation, alerts | | `scripts/report.py`, `scripts/watchdog.py` | tear-sheet generator; health/risk watchdog with Telegram alerts | | `scripts/reconcile.py` | the last go-live gate: compares a paper session with a replay of the same weeks | +| `scripts/update_data.py` | downloads/refreshes market data and the live pair list (monthly) | +| `scripts/case_study.py` | builds the research-format case study PDF from the latest results | +| `installer/`, `.github/workflows/release.yml` | Windows installer and the release pipeline (installer + Docker image) | | `tests/`, `.github/workflows/ci.yml` | test suite (risk, audit, lookahead, universe, panel, hygiene) run by GitHub Actions | | `Dockerfile`, `docker-compose.yml` | 24/7 deployment: bot + monitor-mode panel + watchdog | | `docs/OPERATIONS.md` | runbook: risk limits, kill switch, alerts, VPS deployment, incidents, monthly routine | @@ -39,16 +43,35 @@ panel cannot start a live bot at all. ## 1. Install +### Windows installer (easiest) + +Download `Ridgeline-Setup-.exe` from the +[latest release](https://github.com/devam2001/ridgeline/releases/latest) and run it. +- It installs for your user only, so no admin rights are needed. +- It brings its own Python, Freqtrade and FreqUI. +- It adds **Ridgeline** (the panel) and **Update market data** to the Start menu. +- The installer isn't code-signed, so Windows SmartScreen may warn the first + time. Choose **More info → Run anyway**. +- Your `user_data` (private config, paper sessions, data, audit trail) is kept + when you upgrade or uninstall. + +### Docker (servers) + +A server can pull the released image instead of building it. See +[docs/OPERATIONS.md](docs/OPERATIONS.md#deploying-on-a-vps-docker). + +### From source + ```bash python -m venv .venv .venv\Scripts\activate # macOS/Linux: source .venv/bin/activate -pip install "freqtrade[hyperopt]" "joblib<1.6" +pip install -r requirements.txt freqtrade install-ui # downloads FreqUI -freqtrade list-strategies --userdir user_data # all three should show OK +freqtrade list-strategies --userdir user_data # all four should show OK ``` -`joblib<1.6` is needed because joblib 1.6 removed a module Freqtrade's -hyperopt still imports. +`requirements.txt` pins Freqtrade and `joblib<1.6`. The joblib pin is needed +because joblib 1.6 removed a module Freqtrade's hyperopt still imports. Create the private config (API secrets, gitignored). This never overwrites an existing file: @@ -80,8 +103,9 @@ terminal, stop that one first (Ctrl+C) before using Start. ## 3. Data Research picks pairs **point-in-time**, so it needs daily candles for every -Binance USDT pair, not just today's favourites. Do this once, then top up -occasionally: +Binance USDT pair, not just today's favourites. `python scripts/update_data.py` +runs all of the steps below (it's also the installer's **Update market data** +shortcut). Do this once, then top up monthly: ```bash freqtrade list-pairs --userdir user_data --quote USDT --trading-mode spot --print-json > all_usdt.json @@ -239,6 +263,7 @@ The panel has the same: **Performance tear sheet** on Paper trading, and **Open ```bash python scripts/init_private_config.py docker compose up -d --build # bot + panel (monitor mode) + watchdog +# or, without building: docker compose pull && docker compose up -d ``` The watchdog sends Telegram alerts when: diff --git a/docker-compose.yml b/docker-compose.yml index 775e8be..bda8677 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,12 @@ # 24/7 deployment: trading bot + monitor-mode panel + watchdog. # # python scripts/init_private_config.py # once: API secrets (gitignored) -# docker compose up -d --build +# docker compose up -d --build # build from this checkout, or: +# docker compose pull && docker compose up -d # use the released image +# +# The code comes from the image; only user_data/ (config, strategies, data, +# databases, logs, audit trail) is mounted from the host. RIDGELINE_VERSION +# picks a released image tag (default: latest). # # Trades in whatever mode user_data/config.json says - dry_run: true (paper) # unless you deliberately change it. Ports are published on 127.0.0.1 only; @@ -9,10 +14,10 @@ x-ridgeline: &ridgeline build: . - image: ridgeline:latest + image: ghcr.io/devam2001/ridgeline:${RIDGELINE_VERSION:-latest} restart: unless-stopped volumes: - - .:/ridgeline + - ./user_data:/ridgeline/user_data working_dir: /ridgeline logging: driver: json-file diff --git a/docs/OPERATIONS.md b/docs/OPERATIONS.md index 55a795c..24cbe00 100644 --- a/docs/OPERATIONS.md +++ b/docs/OPERATIONS.md @@ -106,10 +106,16 @@ sudo apt-get update && sudo apt-get install -y docker.io docker-compose-v2 git git clone https://github.com/devam2001/ridgeline.git && cd ridgeline python3 scripts/init_private_config.py # API secrets; then add Telegram keys mkdir -p user_data/logs && sudo chown -R 1000:1000 user_data # the image runs as uid 1000 -docker compose up -d --build +docker compose pull # the released image, ghcr.io/devam2001/ridgeline +docker compose up -d # (or: docker compose up -d --build to build from the checkout) docker compose ps # bot should become "healthy" within ~3 min ``` +The image contains the code. Only `user_data/` is mounted from the host: +config, strategies, data, databases, logs and the audit trail. To pin a +release, set `RIDGELINE_VERSION=0.1.0` (in `.env` or the shell). The default +is `latest`. + Data and the strategy's pair list (see the README's Data section) can be downloaded inside the container: @@ -135,7 +141,8 @@ Then the panel is at http://127.0.0.1:8090 and FreqUI at http://127.0.0.1:8080. **Updating:** ```bash -git pull && docker compose up -d --build +git pull && docker compose pull && docker compose up -d # released image +git pull && docker compose up -d --build # or build from the checkout ``` ## Incident checklist diff --git a/docs/releases/v0.1.0.md b/docs/releases/v0.1.0.md new file mode 100644 index 0000000..deddf04 --- /dev/null +++ b/docs/releases/v0.1.0.md @@ -0,0 +1,56 @@ +First release of Ridgeline: a Freqtrade bot for Binance spot with paper trading, an honest research pipeline, portfolio risk controls and reporting. + +**Paper money only.** The panel runs Freqtrade in dry-run mode with a fake wallet and cannot start a live bot. No strategy is eligible for real money yet (see below). + +## Install + +- **Windows:** download `Ridgeline-Setup-0.1.0.exe` below and run it. + - It installs for your user only (no admin rights) with its own Python, Freqtrade and FreqUI. + - Start **Ridgeline** from the Start menu; the panel opens at http://127.0.0.1:8090. + - Run **Update market data** once before using Replay or Research. It downloads several GB. + - The installer isn't code-signed, so SmartScreen may warn: choose *More info → Run anyway*. +- **Docker (servers):** `docker compose pull && docker compose up -d` uses `ghcr.io/devam2001/ridgeline:0.1.0`. See `docs/OPERATIONS.md`. +- **From source:** `pip install -r requirements.txt`. See the README. + +## What's included + +- **Control panel** + - Live paper trading with a fake wallet you choose. + - Fast historical replay. + - The research gate checklist. + - Risk controls with a kill switch. + - A hash-chained audit log. +- **Paper vs replay** (the last go-live gate): replays the exact weeks a paper session ran and matches the trades one by one. It checks four things: + - 28+ days of paper trading + - 80%+ of trades matched + - return within 2 points of the replay + - fills within 0.3% per side +- **Research pipeline**: + - point-in-time pair universes + - in-sample / out-of-sample split and walk-forward windows + - fee stress and bias checks + - nine go-live gates + - `--balance` to run all of it for small accounts + - a lookahead check that also works for strategies that rank pairs against each other +- **Four strategies**: TrendRider4h, MomentumRotation1d (new candidate), EmaRsiMomentum, TrendDipBuyer1h. +- **Portfolio risk limits**, enforced in backtests too: 35% max position, 4.5% max open risk, 3% daily loss limit, 15% drawdown halt. +- **Reports**: investor-style tear sheets, and the case study as a research paper (PDF, attached). +- **Operations**: watchdog with Telegram alerts, Docker deployment, CI. + +## Research results (out of sample, 2025-06-01 → 2026-10-10) + +The market fell 32.8% (equal-weight basket of the same coins) in this period. + +| Strategy | Return | Max drawdown | Gates | +|---|---|---|---| +| TrendRider4h | +17.3% | 9.8% | 8 / 9 (99 trades, needs 100) | +| MomentumRotation1d | +13.1% | 5.2% | 7 / 9 | +| EmaRsiMomentum | +5.1% | 18.1% | 6 / 9 | +| TrendDipBuyer1h | −17.8% | 19.2% | 4 / 9 | + +- **100 AUD (≈65 USDT) accounts work.** Percentage results match the 1,000 USDT runs. +- **More risk didn't help.** Doubling the risk per trade added ~3 points of return and doubled the drawdown. + +Details are in `RESEARCH.md` and the attached case study. + +Backtests are not a promise of future results. This is software, not financial advice. diff --git a/installer/INSTALL-NOTES.txt b/installer/INSTALL-NOTES.txt new file mode 100644 index 0000000..15891d3 --- /dev/null +++ b/installer/INSTALL-NOTES.txt @@ -0,0 +1,23 @@ +Ridgeline - paper-trading bot, research pipeline and control panel + +PAPER MONEY ONLY. The panel runs Freqtrade in dry-run mode with a fake +wallet. It cannot start a live bot, and nothing it does reaches your +exchange account. + +After installing: + 1. Start "Ridgeline" from the Start menu or desktop. The panel opens at + http://127.0.0.1:8090 in your browser. + 2. Paper trading works straight away: pick a starting balance and a + strategy, then press Start. + 3. Replay and research need historical candles. Run "Update market data" + from the Start menu once (it downloads several GB), then monthly. + +Your files live in the install folder's user_data\ directory: + - config.private.json: your own API credentials, created on first start + - paper\: paper-trading sessions + - data\: downloaded candles + - audit\: the audit trail +They are kept when you upgrade or uninstall. + +Backtests and paper results are not a promise of future profits. This is +software, not financial advice. Only ever risk money you can afford to lose. diff --git a/installer/Ridgeline.cmd b/installer/Ridgeline.cmd new file mode 100644 index 0000000..fc1c4eb --- /dev/null +++ b/installer/Ridgeline.cmd @@ -0,0 +1,11 @@ +@echo off +rem Starts the Ridgeline panel at http://127.0.0.1:8090 and opens it in your browser. +rem Close this window (or press Ctrl+C) to stop the panel. A paper-trading bot +rem started from the panel keeps running; stop it from the panel first. +title Ridgeline panel +cd /d "%~dp0" +if not exist "user_data\config.private.json" "python\python.exe" scripts\init_private_config.py +start "" /b cmd /c "timeout /t 4 /nobreak >nul & start "" http://127.0.0.1:8090" +echo Ridgeline panel: http://127.0.0.1:8090 (close this window to stop it) +"python\python.exe" -m uvicorn panel.app:app --host 127.0.0.1 --port 8090 +if errorlevel 1 pause diff --git a/installer/Update market data.cmd b/installer/Update market data.cmd new file mode 100644 index 0000000..9304d50 --- /dev/null +++ b/installer/Update market data.cmd @@ -0,0 +1,9 @@ +@echo off +rem Downloads Binance candles and refreshes the live pair list (README, "Data"). +rem The first run downloads several GB and can take a while; later runs only top up. +rem Run it monthly, then restart any paper session to pick up the new pair list. +title Ridgeline - update market data +cd /d "%~dp0" +if not exist "user_data\config.private.json" "python\python.exe" scripts\init_private_config.py +"python\python.exe" scripts\update_data.py +pause diff --git a/installer/build.ps1 b/installer/build.ps1 new file mode 100644 index 0000000..d4e8421 --- /dev/null +++ b/installer/build.ps1 @@ -0,0 +1,66 @@ +<# +Builds the Ridgeline Windows installer (build\installer\Ridgeline-Setup-.exe). + + .\installer\build.ps1 -Python C:\Path\To\Python312 -Version 0.1.0 + +-Python folder of a Python 3.12 install to bundle (a full Windows install is + relocatable). Default: the folder of `py -3.12`. +-Version version shown in the installer (default: pyproject.toml's). + +Needs Inno Setup 6 (iscc.exe on PATH or in its default folder). GitHub's +Windows runners have it; the release workflow runs this script. +#> +param( + [string]$Python, + [string]$Version +) +$ErrorActionPreference = "Stop" +$root = Split-Path $PSScriptRoot -Parent +$build = Join-Path $root "build" +$stage = Join-Path $build "stage" + +if (-not $Version) { + $Version = (Select-String -Path (Join-Path $root "pyproject.toml") -Pattern '^version = "(.+)"').Matches[0].Groups[1].Value +} +if (-not $Python) { + $Python = Split-Path (& py -3.12 -c "import sys; print(sys.executable)") +} +Write-Host "Building Ridgeline $Version with Python from $Python" + +if (Test-Path $stage) { Remove-Item -Recurse -Force $stage } +New-Item -ItemType Directory -Force $stage | Out-Null + +# 1. Private Python with every dependency and FreqUI. +Copy-Item -Recurse (Join-Path $Python "*") (Join-Path $stage "python") +$py = Join-Path $stage "python\python.exe" +& $py -m pip install --disable-pip-version-check --no-warn-script-location -r (Join-Path $root "requirements.txt") +if ($LASTEXITCODE) { throw "pip install failed" } +& $py -m freqtrade install-ui +if ($LASTEXITCODE) { throw "freqtrade install-ui failed" } +# Caches and tests don't need to ship. +Get-ChildItem (Join-Path $stage "python") -Recurse -Directory -Filter "__pycache__" | Remove-Item -Recurse -Force + +# 2. The app. user_data ships only its tracked defaults: config, strategies, +# hyperopt loss, research results. Never private config, data or databases. +foreach ($dir in "panel", "ridgeline", "scripts", "docs") { + Copy-Item -Recurse (Join-Path $root $dir) (Join-Path $stage $dir) +} +foreach ($file in "README.md", "RESEARCH.md", "Crypto Trading Bot Case Study.pdf") { + Copy-Item (Join-Path $root $file) $stage +} +$ud = Join-Path $stage "user_data" +New-Item -ItemType Directory -Force (Join-Path $ud "research"), (Join-Path $ud "hyperopts") | Out-Null +Copy-Item (Join-Path $root "user_data\config.json") $ud +Copy-Item -Recurse (Join-Path $root "user_data\strategies") $ud +Copy-Item (Join-Path $root "user_data\hyperopts\*.py") (Join-Path $ud "hyperopts") +Copy-Item (Join-Path $root "user_data\research\*.json") (Join-Path $ud "research") +Get-ChildItem $stage -Recurse -Directory -Filter "__pycache__" | Remove-Item -Recurse -Force +Copy-Item (Join-Path $PSScriptRoot "Ridgeline.cmd"), (Join-Path $PSScriptRoot "Update market data.cmd"), (Join-Path $PSScriptRoot "INSTALL-NOTES.txt") $stage + +# 3. Compile. +$iscc = (Get-Command iscc -ErrorAction SilentlyContinue).Source +if (-not $iscc) { $iscc = Join-Path ${env:ProgramFiles(x86)} "Inno Setup 6\ISCC.exe" } +if (-not (Test-Path $iscc)) { throw "Inno Setup 6 not found (iscc.exe)" } +& $iscc "/DAppVersion=$Version" "/DStageDir=$stage" "/DOutputDir=$(Join-Path $build 'installer')" (Join-Path $PSScriptRoot "ridgeline.iss") +if ($LASTEXITCODE) { throw "Inno Setup failed" } +Get-ChildItem (Join-Path $build "installer") -Filter "*.exe" | ForEach-Object { Write-Host ("{0} {1:N0} MB" -f $_.FullName, ($_.Length / 1MB)) } diff --git a/installer/ridgeline.iss b/installer/ridgeline.iss new file mode 100644 index 0000000..366177d --- /dev/null +++ b/installer/ridgeline.iss @@ -0,0 +1,71 @@ +; Inno Setup script for the Ridgeline Windows installer. +; Build it with installer\build.ps1, which stages a private Python with every +; dependency, FreqUI and the app files, then compiles this script. +; +; Installs per user (no admin rights) into %LOCALAPPDATA%\Programs\Ridgeline. +; Everything under user_data\ that you create (private config, paper +; sessions, market data, audit trail) is kept on upgrade and on uninstall. + +#ifndef AppVersion + #define AppVersion "0.0.0-dev" +#endif +#ifndef StageDir + #define StageDir "..\build\stage" +#endif +#ifndef OutputDir + #define OutputDir "..\build\installer" +#endif + +[Setup] +AppId={{6F7C2B1E-3A54-4F0B-9C8D-2E51A9D47B10} +AppName=Ridgeline +AppVersion={#AppVersion} +AppVerName=Ridgeline {#AppVersion} +AppPublisher=devam2001 +AppPublisherURL=https://github.com/devam2001/ridgeline +AppSupportURL=https://github.com/devam2001/ridgeline/issues +DefaultDirName={localappdata}\Programs\Ridgeline +DisableProgramGroupPage=yes +PrivilegesRequired=lowest +ArchitecturesAllowed=x64compatible +ArchitecturesInstallIn64BitMode=x64compatible +OutputDir={#OutputDir} +OutputBaseFilename=Ridgeline-Setup-{#AppVersion} +Compression=lzma2/ultra64 +SolidCompression=yes +WizardStyle=modern +UninstallDisplayName=Ridgeline {#AppVersion} +UninstallDisplayIcon={app}\python\python.exe +InfoBeforeFile={#StageDir}\INSTALL-NOTES.txt + +[Tasks] +Name: "desktopicon"; Description: "Create a desktop shortcut"; GroupDescription: "Shortcuts:" + +[InstallDelete] +; Start each version with a clean Python environment. +Type: filesandordirs; Name: "{app}\python" + +[Files] +Source: "{#StageDir}\*"; DestDir: "{app}"; Excludes: "user_data\config.json"; Flags: recursesubdirs createallsubdirs ignoreversion +; config.json holds your live pair list and settings: install it once, never overwrite it. +Source: "{#StageDir}\user_data\config.json"; DestDir: "{app}\user_data"; Flags: onlyifdoesntexist uninsneveruninstall + +[Icons] +Name: "{autoprograms}\Ridgeline\Ridgeline"; Filename: "{app}\Ridgeline.cmd"; WorkingDir: "{app}"; Comment: "Start the Ridgeline panel (paper trading, replay, research)" +Name: "{autoprograms}\Ridgeline\Update market data"; Filename: "{app}\Update market data.cmd"; WorkingDir: "{app}"; Comment: "Download candles and refresh the live pair list (monthly)" +Name: "{autoprograms}\Ridgeline\Ridgeline folder"; Filename: "{app}" +Name: "{autoprograms}\Ridgeline\Uninstall Ridgeline"; Filename: "{uninstallexe}" +Name: "{autodesktop}\Ridgeline"; Filename: "{app}\Ridgeline.cmd"; WorkingDir: "{app}"; Tasks: desktopicon + +[Run] +; Creates user_data\config.private.json with random API credentials (never overwrites). +Filename: "{app}\python\python.exe"; Parameters: "scripts\init_private_config.py"; WorkingDir: "{app}"; Flags: runhidden; StatusMsg: "Creating your private settings..." +Filename: "{app}\Ridgeline.cmd"; WorkingDir: "{app}"; Description: "Start Ridgeline now"; Flags: postinstall nowait skipifsilent shellexec + +[UninstallDelete] +; Files Python creates at runtime; your user_data is left alone. +Type: filesandordirs; Name: "{app}\python" +Type: filesandordirs; Name: "{app}\panel\__pycache__" +Type: filesandordirs; Name: "{app}\ridgeline\__pycache__" +Type: filesandordirs; Name: "{app}\scripts\__pycache__" +Type: filesandordirs; Name: "{app}\user_data\strategies\__pycache__" diff --git a/installer/smoke-test.ps1 b/installer/smoke-test.ps1 new file mode 100644 index 0000000..7de40bd --- /dev/null +++ b/installer/smoke-test.ps1 @@ -0,0 +1,53 @@ +<# +Installs a built Ridgeline installer silently into a temporary folder and +checks that it works: private config created, FreqUI bundled, strategies +load, the panel starts and answers, and uninstalling keeps user_data. + + .\installer\smoke-test.ps1 -Installer build\installer\Ridgeline-Setup-0.1.0.exe + +The release workflow runs this on every build. +#> +param([Parameter(Mandatory = $true)][string]$Installer) +$ErrorActionPreference = "Stop" +$dir = Join-Path ([IO.Path]::GetTempPath()) "ridgeline-smoke" +if (Test-Path $dir) { Remove-Item -Recurse -Force $dir } + +$setup = Start-Process -Wait -PassThru (Resolve-Path $Installer) -ArgumentList "/VERYSILENT", "/SUPPRESSMSGBOXES", "/NORESTART", "/TASKS=", "/DIR=`"$dir`"" +if ($setup.ExitCode) { throw "installer exited with $($setup.ExitCode)" } + +$py = Join-Path $dir "python\python.exe" +foreach ($path in "user_data\config.private.json", "user_data\config.json", "Ridgeline.cmd", + "python\Lib\site-packages\freqtrade\rpc\api_server\ui\installed\index.html") { + if (-not (Test-Path (Join-Path $dir $path))) { throw "missing after install: $path" } +} + +Push-Location $dir +try { + & $py -m freqtrade list-strategies --userdir user_data -c user_data\config.json + if ($LASTEXITCODE) { throw "strategies failed to load" } + + $panel = Start-Process -PassThru -NoNewWindow $py -ArgumentList "-m", "uvicorn", "panel.app:app", "--host", "127.0.0.1", "--port", "8090" + try { + $strategies = $null + for ($i = 0; $i -lt 45 -and -not $strategies; $i++) { + Start-Sleep -Seconds 2 + try { $strategies = Invoke-RestMethod "http://127.0.0.1:8090/api/strategies" } catch { } + } + if ($strategies -notcontains "TrendRider4h") { throw "panel did not list the strategies: $strategies" } + $mode = Invoke-RestMethod "http://127.0.0.1:8090/api/mode" + Write-Host "panel ok, version $($mode.version): $($strategies -join ', ')" + } + finally { + Stop-Process -Id $panel.Id -Force -ErrorAction SilentlyContinue + } +} +finally { + Pop-Location +} + +$uninstall = Start-Process -Wait -PassThru (Join-Path $dir "unins000.exe") -ArgumentList "/VERYSILENT", "/SUPPRESSMSGBOXES", "/NORESTART" +if ($uninstall.ExitCode) { throw "uninstaller exited with $($uninstall.ExitCode)" } +Start-Sleep -Seconds 3 # the uninstaller finishes in a helper process +if (Test-Path (Join-Path $dir "python")) { throw "uninstall left the Python environment behind" } +if (-not (Test-Path (Join-Path $dir "user_data\config.private.json"))) { throw "uninstall removed the private config" } +Write-Host "install, panel and uninstall ok" diff --git a/panel/app.py b/panel/app.py index fae8ff7..709a99f 100644 --- a/panel/app.py +++ b/panel/app.py @@ -13,7 +13,7 @@ from panel.bot import MONITOR_MODE, PaperBot, PaperBotError from panel.common import USERDIR, list_strategies, load_json from panel.replay import REPLAY_DIR, BacktestError, ReplayJobs, SessionReplays -from ridgeline import audit +from ridgeline import __version__, audit from ridgeline.reconcile import session_info from ridgeline.report import build_tearsheet, load_trades_backtest, load_trades_db, session_balance @@ -102,7 +102,7 @@ def paper_reset(req: PaperReset): @app.get("/api/mode") def mode(): - return {"monitor": MONITOR_MODE} + return {"monitor": MONITOR_MODE, "version": __version__} @app.get("/api/risk") diff --git a/panel/static/app.js b/panel/static/app.js index f7c4099..6a673c9 100644 --- a/panel/static/app.js +++ b/panel/static/app.js @@ -586,7 +586,9 @@ $("#risk-flatten").addEventListener("click", () => { // ---------- boot ---------- (async function init() { - monitorMode = (await api("/api/mode").catch(() => ({}))).monitor === true; + const appMode = await api("/api/mode").catch(() => ({})); + monitorMode = appMode.monitor === true; + if (appMode.version) $("#app-version").textContent = `v${appMode.version}`; if (monitorMode) { $("#paper-form").insertAdjacentHTML("beforeend", `

    Monitor mode: the bot runs as a Docker service, so Start/Stop/Reset are disabled here. Risk controls still work.

    `); diff --git a/panel/static/index.html b/panel/static/index.html index e6d86fb..a99af99 100644 --- a/panel/static/index.html +++ b/panel/static/index.html @@ -12,6 +12,7 @@
    ridgeline + PAPER MONEY ONLY