Skip to the page
StrategyGradeLibraryGurusLearnPricing

StrategyGrade

The backtest the video didn't show you. Every trade, every assumption and every check, on the record.

Product

  • New autopsy
  • Library
  • Gurus
  • Graveyard
  • Requests
  • Learn
  • Accuracy
  • Our data
  • Pricing
  • Test your idea
  • Paper trading
  • Compare
  • Developers

The fine print

Hypothetical simulated results with the limitations of CFD data feeds. Education, not investment advice. Every report discloses its assumptions and controls.

TermsPrivacy

API

Developers

Everything the site does, from your own code: test a video, a typed idea or a script, read the verdict and every trade, price it at your broker, and paper-trade it with alerts to your webhook. A key acts as you: same plan, same allowances.

Your keys

Quick start

Send the key as a bearer token. 120 requests a minute per key.

Test a video

curl -X POST https://strategygrade.com/api/runs \
  -H "Authorization: Bearer sg_your_key" -H "Content-Type: application/json" \
  -d '{"url": "https://www.youtube.com/watch?v=..."}'

Test your own rules, a Pine script or strategy code (ChatGPT's, backtrader, MQL5…)

curl -X POST https://strategygrade.com/api/runs/idea \
  -H "Authorization: Bearer sg_your_key" -H "Content-Type: application/json" \
  -d '{"kind": "code", "market": "EURUSD", "timeframe": "1h", "text": "<your code>"}'

Wait for the verdict, then take everything

import time, requests
H = {"Authorization": "Bearer sg_your_key"}
run = requests.post("https://strategygrade.com/api/runs", json={"url": "https://youtu.be/..."}, headers=H).json()
while run["status"] not in ("done", "untestable", "failed"):
    time.sleep(10); run = requests.get(f"https://strategygrade.com/api/runs/{run['id']}", headers=H).json()
print(run["verdict"]["code"], run["verdict"]["mean_bp"], run["rules"])
trades_csv = requests.get(f"https://strategygrade.com/api/runs/{run['id']}/trades.csv", headers=H).text
rules      = requests.get(f"https://strategygrade.com/api/runs/{run['id']}/rules.json", headers=H).json()
brokers    = requests.get(f"https://strategygrade.com/api/runs/{run['id']}/brokers", headers=H).json()   # cheapest venue first

Endpoints

POST /api/runstest a video link (YouTube, TikTok, X, Instagram, Reddit)
POST /api/runs/ideatest typed rules, a Pine script or strategy code; market and timeframe optional
GET /api/runs/{id}status, verdict, rules in plain English
GET /api/runs/{id}/trades.csvevery simulated trade
GET /api/runs/{id}/rules.jsonthe exact rule spec that was simulated
GET /api/runs/{id}/erasyear by year
GET /api/runs/{id}/equity-monthlythe account curve at month ends
GET /api/runs/{id}/brokersthe same trades at every venue's own fees
GET /api/runs/{id}/propprop-firm pass and payout odds
GET /api/runs/{id}/pine?kind=strategyTradingView Pine v6
GET /api/runs/publicthe public library
POST /api/paperpaper-trade a report: {"run_id": ...}
GET /api/paper/{id}paper ledger, open position, pending signal
PUT /api/paper/channelsyour webhook for alerts: {"webhook_url": "https://..."}

Alert webhooks

Paper-trading alerts POST JSON to your URL: event.kind is signal, opened, closed or drift. Each request is signed with your webhook secret (on Paper trading); check it before you act on anything:

import hmac, hashlib
def is_from_strategygrade(secret: str, body: bytes, header: str) -> bool:
    want = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(want, header)          # header = X-StrategyGrade-Signature

Results are hypothetical backtests and paper trades for education. Nothing here is trading advice, and nothing is traded for you.