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

Public evidence archive

Every number here
is an endpoint
you can call.

TradeClaw publishes the signal-study data: recorded signal rows, OHLCV-resolved outcomes, modeled per-trade costs, and the sequential equity simulation used by the public research charts. Backtest artifacts are committed to the repo as JSON. These datasets are public and untiered; call them, cache them, fork them, and audit the assumptions.

The full reference lives at /api-docs. Everything below runs against https://tradeclaw.win.

Live endpoints

Read-only GET routes. Responses carry public cache headers (s-maxage of 60 seconds on the signal and cost-field routes) so a reverse proxy or your own cache can absorb repeat calls.

GET/api/research/cost-fieldnew

One entry per counted 24h outcome with a valid stop: gross R from its OHLCV-resolved outcome, the stored modeled round-trip cost in R, and asset class. Net modeled R is grossR[i] minus costR[i]. costR uses fee/slippage assumptions, not broker fills. The response reports its source-read limit and potential window truncation.

scope = pro | broadcast
eligible engine stream (default) or gate-approved rows recorded since 2026-06-10
period
optional window filter, same grammar as the history route
include = provenance
include per-row outcome, risk, modeled-cost source, and broadcast-decision fields

Response shape

{ classes: ["crypto","metals","fx_or_fallback"], count, resolvedTotal, ids[], t[], grossR[], costR[], cls[], methodology, window, provenance?[] }
curl https://tradeclaw.win/api/research/cost-field
GET/api/signals/equity

Hypothetical sequential equity simulation plus a summary block. It orders eligible sized signals by timestamp, risks 1% of current equity on every signal, caps extreme R outcomes, and deducts modeled per-asset fee/slippage assumptions. It does not model broker fills, overlapping exposure, margin, leverage, latency, funding, or subscriber selection; it is not an actual portfolio return.

summaryOnly = 1 | true
drop the point array, return summary and rolling win rates only
scope = pro | broadcast
eligible engine stream (default) or gate-approved rows recorded since 2026-06-10
band = premium | standard | all
filter by confidence band
category
asset-category filter (e.g. crypto, fx)
period
optional window filter
smooth = median2x | median3x
opt-in R-cap on the curve; off by default

Response shape

{ points[], summary: { totalReturn, maxDrawdown, winRate, sizedTrades, expectancyR, netExpectancyR, avgCostR, roundTripCostPct, breakEvenWinRate, sharpeRatio, hardRCap, ... }, rollingWinRates: { "7d","30d","90d" }, band, scope, category, smooth }
curl 'https://tradeclaw.win/api/signals/equity?summaryOnly=1&scope=pro'
GET/api/signals/history

Recorded signal history, paginated, with OHLCV-resolved outcome fields and the same counted-row definition used by the other signal-study surfaces. Add format=csv to stream the currently stored rows matching the filters. This is a signal ledger, not an order or broker-fill ledger.

format = json | csv
JSON page (default) or a downloadable CSV of currently stored rows matching the filters
pair
single symbol, e.g. BTCUSD
direction = BUY | SELL
filter by trade side
outcome = win | loss | pending
filter by resolved outcome
limit = max 200
page size, default 50
offset
pagination offset
scope / category / period / sort
record scope, asset category, time window, ordering (sort=resolved-first)

Response shape

{ records[], total, offset, limit, scope, category, earliestTimestamp, latestTimestamp, stats: { totalSignals, resolved, wins, losses, winRate, avgConfidence, streak, bestSignal, ... } }
curl 'https://tradeclaw.win/api/signals/history?limit=50&outcome=win'

CSV export (16 columns, opens in any spreadsheet)

curl 'https://tradeclaw.win/api/signals/history?format=csv' -o tradeclaw-history.csv
GET/api/calibration

The reliability data behind the /calibration page. Signals are bucketed into five confidence bands and each band reports its observed OHLCV-resolved win rate. Includes Brier score and expected calibration error over the counted resolved population. Cached 5 minutes (revalidate 300).

(none)
no query params; measures counted resolved rows in the current archive

Response shape

{ buckets: [5 confidence bands], overallAccuracy, totalSignals, brier, ece, calibration, windowStart, windowEnd, insufficientData, minStableSignals, updatedAt }
curl https://tradeclaw.win/api/calibration

Rendered on /calibration.

GET/feed.json

The 50 most recent signals as a subscribable feed. Also served as RSS 2.0 at /feed.xml and Atom 1.0 at /atom.xml for any reader.

(none)
point a JSON Feed, RSS, or Atom reader at the URL

Response shape

JSON Feed 1.1: { version, title, feed_url, items: [ { id, url, title, content_html, summary, date_published, tags } ] }
curl https://tradeclaw.win/feed.json

Committed research artifacts

The 2026 signal archive is committed to data/ at the repo root, and every verdict on /research is backed by a deterministic backtest JSON in docs/research/experiments/. Each experiment file holds its registered spec and results, so a given candle store state reproduces the same numbers byte for byte.

data/signal-log.jsontimestamped log

The historical git-committed signal log, frozen 2026-05-02 when in-repo logging was retired. Each record carries entry, tp1, sl, confidence, strategy, and 4h/24h outcomes, and for that window git history is the look-ahead proof: each commit timestamps a signal before its outcome was known. Newer runs are recorded in the signal_run_log database table with a SHA-256 audit trail.

data/SIGNAL-LOG.mdhuman-readable

The same historical log in a readable table, covering the same frozen window. Verify provenance yourself with git log --oneline data/signal-log.json.

REGISTRY.mdrun ledger

Append-only ledger of every backtest. One line per run with its spec and headline result. Read it before re-testing a hypothesis; if the spec ran before, the answer is here.

BTCUSD-H1-2024-06-10-2026-06-09-live-crypto-classic_regime-aware_hmm-top3_vwap-ema-bb_full-risk-f4.json9.5 KB

BTCUSD H1, five entry strategies scored under the stated crypto fee/slippage assumptions. Best run (regime-aware) 0.6% at 50% win rate; classic loses 11.1%.

BTCUSD-H1-2024-06-10-2026-06-09-legacy-zero-classic_regime-aware_hmm-top3_vwap-ema-bb_full-risk-f4.json9.4 KB

Same BTCUSD H1 window with zero costs and legacy fixed 2:1 sizing. The cost-free counterfactual to the live-crypto run above.

carry-validation-10majors-f4.json300 KB

Carry strategy across 10 majors with two-leg costs. All three variants (always-on, threshold, top-3 rotation) fail the deployment gate.

daily-momentum-validation-BTCUSD_ETHUSD_SOLUSD_BNBUSD_XRPUSD_ADAUSD_DOGEUSD_DOTUSD_LINKUSD_AVAXUSD-D1-f4.json141 KB

Daily time-series momentum across 10 crypto majors, D1. No config survives ~0.4% crypto costs robustly; the two positive symbols are flukes.

daily-momentum-validation-BTCUSD-D1-f4.json20 KB

Daily momentum isolated to BTCUSD, D1. Single-symbol slice of the majors validation for a focused read.

regime-hmm-walkforward-BTCUSD_ETHUSD_SOLUSD-H1-2024-06-12-2026-06-11.json13 KB

Three-state structural regime HMM (trend, volatile, range) on BTC/ETH/SOL H1, walk-forward. States price magnitude, not drift; no directional premium.

regime-routed-walkforward-BTCUSD_ETHUSD_SOLUSD-H1-2024-06-01-2026-06-01-f4.json52 KB

Per-regime routed entries on BTC/ETH/SOL H1 walk-forward. The only non-thin routed cell is negative on all three symbols; the gate fails on paper.

slow-gate-BTCUSD_ETHUSD-D1-2017-09-01-2026-07-16-f4.json26 KBsandbox onlynon-livemodeled backtestno broker fillsinformational only

Fixed-parameter BTC/ETH daily long/flat sandbox study under modeled spot costs. The 50/50 vol-targeted portfolio trailed buy-and-hold CAGR (22.75% vs 28.09%) but improved modeled Calmar (0.61 vs 0.32) and max drawdown (37.42% vs 86.49%). EMA200 had isolated raw-CAGR wins, so the study did not establish uniform raw-return outperformance across both assets; HMM sizing underperformed buy-and-hold on drawdown-adjusted metrics. This is not live performance, does not represent broker fills, and is not a recommendation.

xsection-validation-30majors-D1-lb14-rb7-top5-f4.json9.3 KB

Cross-sectional momentum, 30 majors D1, top-5. Long-only and long-short both fail against the basket benchmark over the full window.

Use it

Three recipes against the live routes. Each references only fields that actually appear in the responses above.

1. Shell: count net-positive trades

# Count net-positive trades in the cost field (net R = grossR - costR)
curl -s https://tradeclaw.win/api/research/cost-field \
  | jq '[.grossR as $g | .costR as $c
         | range(0; .count)
         | select($g[.] - $c[.] > 0)] | length'

2. JavaScript: read the net edge per trade

// Load the cost-adjusted equity summary and print the net edge per trade
const res = await fetch(
  'https://tradeclaw.win/api/signals/equity?summaryOnly=1&scope=pro'
);
const { summary } = await res.json();

console.log('net expectancy  R/trade:', summary.netExpectancyR);
console.log('gross expectancy R/trade:', summary.expectancyR);
console.log('avg round-trip cost R:', summary.avgCostR);

3. Python: mean net R by asset class

# Load the cost field into a DataFrame and compute mean net R
import requests, pandas as pd

d = requests.get('https://tradeclaw.win/api/research/cost-field').json()
df = pd.DataFrame({
    't': d['t'],
    'grossR': d['grossR'],
    'costR': d['costR'],
    'cls': d['cls'],
})
df['netR'] = df['grossR'] - df['costR']
df['asset'] = df['cls'].map(dict(enumerate(d['classes'])))

print('mean net R/trade:', df['netR'].mean())
print(df.groupby('asset')['netR'].mean())

License and terms

The code is MIT licensed. Use, modify, and redistribute it freely, including the API routes and the research pipeline. The datasets carry the same spirit: take them, cite them, build on them. Source is at github.com/naimkatiman/tradeclaw.

No API key is required. Public routes use fair-use rate limits to protect shared availability. Cache responses on your side rather than polling in a tight loop; the s-maxage headers make that cheap.

Informational only, not advice.

This data combines recorded signal rows, OHLCV-resolved outcomes, and modeled fee/slippage assumptions. It contains no broker-fill or customer-account ledger. Under the published assumptions, the counted signal study has negative net expectancy; that is not a claim about realized subscriber losses. Treat every number as a research result to audit, not a recommendation to trade.

Read next

MethodologyWhat we tested and killedSignal study