TradeClaw

Open-source AI market intelligence for traders who prefer evidence over noise.

Self-hosted by default

Product

  • Dashboard
  • Screener
  • Backtest
  • Track record
  • Live demo

Transparency

  • What we tested and killed
  • Methodology
  • Why long-term
  • Open data
  • Calibration

Resources

  • Blog
  • Docs
  • API reference
  • How it works
  • FAQ
  • Glossary

Community

  • Discord
  • Weekly digest
  • Contribute
  • Contributors
  • Sponsors

Open source

  • GitHub repo
  • Star history
  • Self-host guide
  • Security
  • Data freshness
  • Roadmap

© 2026 TradeClaw. MIT licensed.

Terms|Privacy|Trading involves risk. Signals are informational only and are not financial advice.
DashboardScreenerCopilotTrack Record
TradeClaw
DashboardScreenerTrack RecordResearch
Live signalsStar

Methodology

How the public
numbers are made

This page documents the public signal study. Read the steps below and you can rebuild its OHLCV-resolved outcomes, modeled costs, and sequential equity simulation from the published signal data.

No live broker or customer-account results appear here. This page explains the research calculation, and the track record shows the recorded-signal study it produced.

Informational only. This study combines recorded signals, outcomes resolved from provider OHLCV, and modeled cost/sizing assumptions. It is not a broker-fill record, customer portfolio, financial advice, or profit claim. Historical signal outcomes do not predict future results.

01What an R-multiple is

An R-multiple states a trade result as a multiple of the risk that trade took, not as a raw percentage move. Risk is the distance from the entry price to the stop-loss: the amount the trade was set up to lose if it went wrong. One unit of that risk is 1R.

R = pnl% ÷ risk% risk% = |entry − stop| ÷ entry × 100

Worked example, plain arithmetic. Entry at 100, stop at 98: the risk is 2%. If price reaches 104, a 4% move, the result is 4 ÷ 2 = +2R. A clean stop-out lands near −1R.

R is used instead of raw percent because it makes trades with different stop distances comparable. A wide-stop trade and a tight-stop trade each risk the same 1R, so their outcomes can be averaged together honestly. A high win rate at small R can still lose money, and a low win rate at large R can still make it. R keeps that visible.

02Which trades count

There are two populations, and they are not the same. Keeping them separate is what stops the win rate and the equity curve from telling different stories.

Counted resolved is the win-rate population. A signal counts when the resolver has a usable 24-hour OHLCV outcome: a take-profit hit, stop-loss hit, or nonzero 24-hour close after neither was hit. That last case remains a counted miss rather than disappearing. Excluded rows are simulated, gate-blocked (the engine emitted a signal but its full-risk gate refused entry), still pending, or zero/missing force-expiry placeholders with no usable market outcome. A single predicate, isCountedResolved, enforces this definition.

Sized is the stricter equity population. A trade enters the curve only if it has a recorded stop-loss. Without a stop there is no defined risk, and without defined risk there is no position size, so the trade cannot be sized onto the curve. Older rows missing a stop still count toward the win rate, but not toward the equity curve or the R-statistics. The sized set is the subset that carries a stop.

One caveat the counts do not flatter away: the engine fires across many symbols and timeframes at once, and the default population is the eligible engine stream. It does not establish which signals any subscriber received or executed. The raw count describes recorded signal rows, not a tradable account.

Public history reads are capped at 10,000 source rows. The cost-field endpoint reports the loaded count, read limit, and a potential-truncation flag. Unless completeness is independently established, this documentation calls the result the current archive, not all historical signals.

03The modeled cost deduction

Every eligible sized signal receives a modeled cost deduction before it enters the simulation. The value is selected per asset class from static fee and slippage assumptions and stored on the signal row; it is not measured from a broker fill. Round-trip cost is modeled as 2 times the assumed fee plus slippage per side.

Modeled round-trip cost deducted from each eligible sized signal, by asset class, computed from the cost model constants.
Asset classMatched symbolsFee assumption / sideSlippage assumption / sideModeled round tripFunding assumption / 8h (excluded)
Crypto perpsBTC, ETH, SOL, BNB, XRP, ADA, DOGE, DOT, LINK, AVAX, or any pair ending in USDT0.05%0.15%0.40%0.01%
MetalsXAU, XAG (gold and silver)0.00%0.05%0.10%0.00%
FX / fallbackEvery other pair, including unsupported or unclassified symbols0.00%0.02%0.04%0.00%

The model assigns crypto the largest deduction, roughly ten times its FX assumption, based on the stated taker-fee and slippage constants. This assumption materially affects the result and should be replaced when venue-specific fill evidence exists.

The model also defines perp funding, 0.01% of notional per 8 hours held, shown in the last column. It is not added to the per-trade charge, because when a signal fires the engine does not yet know how long the position will be held. Funding is therefore excluded, which makes the cost model incomplete and can move a real result in either direction. Each newer row stores the selected cost estimate; rows written before that field existed fall back to the same asset-class model.

04How the sequential simulation compounds

The hypothetical curve starts from 10,000, orders eligible sized signals by timestamp, and risks 1% of current modeled equity on every signal. This is a fixed-fractional research rule, not evidence that an account placed those trades.

At 1% modeled risk, one signal moves simulated equity by about its R-multiple times 1%, minus the modeled cost in R. A +2R outcome adds roughly 2%; a −1R outcome removes roughly 1%, with the modeled deduction applied to both.

equity change per trade ≈ ( capped R − cost R ) × 1% cost R = cost% ÷ risk%

The simulation processes every eligible signal sequentially. It does not model overlapping positions, correlated exposure, account margin, leverage limits, order rejection, latency, broker fills, or subscriber selection. Its return and drawdown are hypothetical model outputs, not observed portfolio performance.

For the money path only, each trade R is capped at 8R, the parameter named HARD_R_CAP. That cap sits just above the 99th percentile of the recorded OHLCV-resolved absolute-R distribution and clips roughly 1% of modeled outcomes. A different cap changes the simulated path. The cap applies only to that path; average winning R and expectancy use the uncapped OHLCV-resolved R values.

The curve also reports the simulation's worst peak-to-trough drop. This maximum drawdown describes the hypothetical sequential path, not a broker or customer account.

05Net expectancy and break-even win rate

Expectancy is the average result of one trade, measured in R. Gross expectancy weighs the average winning R and the average losing R by how often each happens. It measures engine quality before costs.

gross R = winRate × avgRWin + lossRate × avgRLoss net R = gross R − avgCostR

Net expectancy subtracts the average modeled cost in R. It is the value used by the sequential simulation and can be negative when observed gross expectancy is positive. In the current counted sample, the stated cost assumptions exceed the observed gross expectancy. This conclusion is conditional on the published population and model.

The break-even win rate is the win rate that would make expectancy exactly zero, given the observed average win and loss sizes.

break-even win rate = −avgRLoss ÷ ( avgRWin − avgRLoss )

If the observed OHLCV-resolved win rate sits above this line, the study has positive modeled expectancy, even below 50%. If it sits below the line, it does not under the same assumptions. The signal record shows the observed rate next to this modeled break-even line.

06Where the data lives

A finding is only as good as its inputs, so the study data and assumptions are public and machine-readable. The figures above can be recomputed from these endpoints and files.

  • /api/research/cost-field

    The unaggregated sized-signal dataset: identifiers, timestamp, OHLCV-resolved gross R, modeled cost R, and asset class. Add include=provenance for outcome inputs, modeled-cost source, and broadcast decision. The response flags potential truncation.

  • /api/signals/equity

    The hypothetical sequential equity simulation and its summary: observed win rate, gross and modeled net expectancy, break-even win rate, modeled average cost, and simulated drawdown.

  • /track-record

    The rendered results, shown with sample size and date range next to every number.

Source code for each step

  • Equity route: sizing, cost deduction, expectancyapps/web/app/api/signals/equity/route.ts
  • Signal history: which trades countapps/web/lib/signal-history.ts
  • Modeled cost helper: stored estimate and fallbackapps/web/lib/modeled-trade-cost.ts
  • Cost model: the per-asset constantspackages/strategies/src/backtest-options.ts
  • Cost-field route: the per-trade datasetapps/web/app/api/research/cost-field/route.ts

Every public number here obeys a written honesty contract: a provenance label, the sample size and window it covers, the cost disclosed next to the figure, and the win rate shown against its break-even line. You can read the contract in full on GitHub.

07Independent reconstruction coverage

The rebuild promise above is not uniform across the record, and this section states exactly where it ends. Outcome data is published for every counted signal, but re-deriving a signal's entry context — the daily chart it fired on — requires the repository's own candle store to hold D1 bars for that pair. Today the store covers crypto only.

The 2026-08-05 regime study measured this limit on its counted population, window 2026-06-10 to 2026-08-04: 1,162 of its 3,157 counted trades (36.8%), all crypto, could have their entry context independently rebuilt from the store. The remaining 1,995 trades across 20 non-crypto pairs have no D1 candle coverage in the repository candle store, because the daily backfill for those pairs is blocked upstream. Until a licensed daily feed exists they stay excluded, with the count published as of that study rather than smoothed over.

Counted trades excluded from independent entry-context reconstruction, by asset class, with every excluded pair and its trade count.
Asset classExcluded pairs (trades)PairsTrades
FXUSDCHF (204) · AUDUSD (193) · USDCAD (190) · NZDUSD (184) · GBPUSD (132) · USDJPY (132) · EURUSD (112)71,147
OilWTIUSD (100)1100
MetalsXAGUSD (92) · XAUUSD (81)2173
US stocksMSFTUSD (77) · AMZNUSD (69) · AMDUSD (68) · TSLAUSD (66) · METAUSD (57) · AAPLUSD (55) · NVDAUSD (54) · GOOGLUSD (48) · JPMUSD (48) · BACUSD (33)10575

Exclusion here is a statement about inputs, not outcomes. The 1,995 excluded rows are still counted, resolved, real trades: their results were resolved from provider OHLCV under the same rules as every other counted signal in section 02. What is missing is only the candle-based independent reconstruction of their entry context, because the candles themselves are not in the store.

The figures come from the committed study artifact regime-expectancy-live-record-crypto-D1-2026-08-05.json and the study entry on the research page. When a licensed daily feed closes the gap, this section updates from the next study's artifact — the number moves, the disclosure stays.