How TradeDiscuss grades every call
This page is the specification, not a summary of one. Everything a call's outcome depends on is described here, including the cases where the answer is genuinely uncertain and what we do about it. If any of it looks wrong to you, that is a useful thing to tell us — the rules matter more than any individual result they produce.
Grading method version g1.1.0 · every graded call records the version it was graded under, so a change to these rules is visible on every affected page.
What a record here does and does not prove
TradeDiscuss records predictions and computes their outcomes. That is a narrower claim than most trading platforms make, and the narrowness is the point. A correctly graded call establishes four things:
- The prediction existed at the displayed timestamp, before its outcome was known.
- Its levels have not changed since — they are frozen at publication.
- The outcome was computed from market data under the rules on this page.
- Nothing has been removed: losses, expiries and unentered calls all remain visible.
It does not establish that anyone placed the trade, and it never will unless a broker connection is actually made. It does not establish a return: R is a ratio to the risk the trader defined, not a percentage of an account. Position sizing, concurrency, financing and costs are not modelled anywhere on this site.
The call lifecycle
A call moves through explicit states, and which state it ends in matters as much as the number attached to it.
published → pending_entry → entered → resolved
│ │
cancelled_before_entry ├─ stop_hit
expired_no_entry ├─ closed_early (graded)
├─ expired_at_close
└─ resolution_pendingThere are two kinds of entry. A market call is entered at the price TradeDiscuss observes at the instant the call is accepted — the trader does not supply that number and cannot influence it. A conditional call names a level and sits in pending_entry until the level trades. If it never does, the call ends as expired_no_entry: excluded from R statistics entirely, and counted toward the trader's public unentered rate.
A call can only be cancelled before it is entered. Once entered, the only way out is a graded exit — a target, the stop, an early close priced from market data, or expiry. This single rule is what stops the record from becoming a highlight reel.
Where the price comes from
A candle close is not “the price at the posting instant”, and treating it as one would quietly flatter every trader with a faster feed than ours. Each call therefore stores the venue, the instrument identifier, the provider's event time, our receipt time, the server acceptance time, whether the number is a bid, ask, mid or last, the bid and ask themselves, and how old the observation was in milliseconds. All of it is printed on the call page.
Each instrument also carries a freshness budget. If our feed for that instrument is older than the budget, new calls on it are refused, with the reason shown. Without this, anyone watching a faster feed could post into a move we had not yet observed and be credited with foresight.
Risk, R and weighted outcomes
Risk is the distance from entry to stop: risk = |entry − stop|. Everything is expressed as a multiple of it. For a long, the R of any price is (price − entry) / risk; for a short it is (entry − price) / risk.
A call can define up to three targets and split the position across them. The default split is 50% at TP1, 30% at TP2, 20% at TP3, and a trader can set their own — but only at publication, after which it is frozen with everything else. The final result is the weighted sum of every leg:
final R = Σ (portion_i × R(fill_price_i))
If the trader enabled “move stop to breakeven after TP1”, the effective stop becomes the entry price — but only from the candle after the TP1 fill. Arming it within the same bar would let a wick that printed before the target retroactively close the position, which is not what happens in a real book.
Only candles that open strictly after the entry instant are considered. A bar straddling the post can contain movement that occurred before the prediction existed, so its high and low are never used to fill anything.
Four worked examples
These are the exact cases in the test suite. A change to any of them is a change to a public promise, so they are pinned there deliberately. Each example uses entry 100, stop 90 (so risk = 10) and targets at 110, 120 and 130, split 50/30/20 — giving R values of 1, 2 and 3.
0.5 × R(110) = 0.5 × 1.00 = 0.50
0.5 × R(100) = 0.5 × 0.00 = 0.00
final R = +0.50R grade CHalf the position banked 1R at the first target; the rest exited flat when the stop moved up. A profitable call that a naive “did it hit target?” framing would score as a full winner.
0.5 × 1.00 = 0.50 0.3 × 2.00 = 0.60 0.2 × 3.00 = 0.60 final R = +1.70R grade B
Note that a full sweep to a 3R target does not produce 3R. Scaling out is a real cost, and the record shows it.
1.0 × R(90) = −1.00
final R = −1.00R grade Fcandle opens at 85, below the 90 stop
1.0 × R(85) = −1.50
final R = −1.50R grade FThe loss is not capped at the stop. This is the single most commonly fudged case in published track records, and getting it wrong inflates every long-run average on a platform.
The gap rule, in both directions
When a candle opens beyond a level, the fill takes the open rather than the level. That cuts both ways by design: a favourable gap pays more than the target, and an adverse gap loses more than 1R.
Paying uncapped upside on favourable gaps while capping downside at the stop would systematically overstate every record on the board. So we do neither. Gapped fills are flagged on the call page and in the fill ledger.
Intrabar ambiguity
Sometimes one candle contains both the effective stop and the next target. At that resolution the order of events is genuinely unknowable — the data does not say which came first, and any answer is a guess.
We do three things, in order:
- Re-run on finer data if we hold any for that instrument.
- Otherwise apply the conservative convention: the stop is treated as hitting first.
- Mark the call
ambiguous, show that on its page, and include it in the trader's published ambiguity rate.
Publishing the rate matters as much as the convention. A trader whose calls are frequently ambiguous is running stops and targets close enough together that the resolution of our data cannot separate them, and you should be able to see that at a glance.
For the same reason, the grading resolution is decoupled from the forecast timeframe. A 4h thesis is not graded on 4h candles. Grading runs at 5-minute resolution across every instrument, and the resolution used is printed on the call.
Choosing 5-minute bars rather than 1-minute ones has a cost, and it is the ambiguity rate. A wider bar is more likely to contain both the stop and a target, so a higher share of calls resolve conservatively and get flagged. We would rather pay that cost visibly — the rate is published on every profile, on /performance and in every monthly report — than run a finer series we cannot keep complete. A grading engine that occasionally says “this bar cannot be sequenced” is more trustworthy than one that guesses on data with holes in it.
Sessions, weekends and missing data
Instruments declare a session. Crypto trades continuously. FX runs from roughly 21:00 UTC Sunday to 21:00 UTC Friday. US equities are graded during cash hours, 14:30 to 21:00 UTC on weekdays, so a call cannot be resolved by an overnight print most participants could not have traded against.
An expiry landing inside a closed session is carried forward to the reopen. A gap in the candle series inside a closed session is expected and ignored. A gap inside an open session is missing data, and the call goes to resolution_pending for manual review rather than being graded on evidence that is not there. Those calls appear on the trader's profile as held for review, not as wins or losses.
Letter grades
The numeric R is always the primary figure. The letter is a convenience for scanning.
| Grade | Final R |
|---|---|
| A+ | ≥ 3.00R |
| A | ≥ 2.00R |
| B | ≥ 1.00R |
| C | ≥ 0.20R |
| D | > −1.00R |
| F | ≤ −1.00R |
The Track Record
Every profile leads with plain statistics rather than a composite, because plain statistics are the ones that mean what they appear to mean:
- Graded calls — entered and run to a conclusion.
- Above breakeven — the share with final R > 0. That is the entire definition.
- Mean and median R, shown separately, because one outlier moves one and not the other.
- Profit factor — gross winning R over gross losing R. With no losses it is undefined and renders as an em dash, never as a large number.
- Worst call — always visible, never removable.
- Unentered rate — the share of calls whose named entry never traded.
- Cancelled rate and ambiguity rate.
- Breakdowns by instrument, timeframe and stated conviction.
Cumulative R is shown but never described as an account return, because it is not one.
Trader Score v1 — experimental
The composite is a heuristic. We label it v1 · experimental everywhere, store the version alongside every computed value, and withhold it entirely below 20 graded calls rather than showing it with a caveat — a number on a screen gets believed regardless of the text beside it.
raw = 100 × ( 0.30 · win_rate
+ 0.25 · clamp((mean_R + 1) / 4, 0, 1)
+ 0.25 · min(profit_factor, 3) / 3
+ 0.20 · consistency )
consistency = 1 − stdev(weekly R) / max(1, |mean weekly R|)
clamped to [0,1]; needs ≥ 4 active weeks, else 0.5
shrink = effective_n / (effective_n + 20)
score = round( 50 · (1 − shrink) + raw · shrink )Three details are doing most of the work:
- Shrinkage. Every score is pulled toward a neutral 50 in proportion to how little evidence supports it. Four perfect calls cannot reach the top of the board.
- Correlation damping. Calls sharing an instrument, a timeframe and a session are one opinion repeated. A cluster of m such calls contributes
√mto the effective sample, not m — so twenty calls on a single move count as about four and a half. - Undefined profit factor. Below the display threshold, a record with no losses contributes the breakeven value of 1.0 rather than the cap of 3.0. Otherwise a handful of lucky calls would max out a quarter of the score.
Weeks with no activity are not counted as zero-R weeks. A trader who did not post is not thereby consistent.
Signal Score
A per-call quality figure from 0 to 100, computed once at resolution and then frozen. It never feeds the Trader Score and the Trader Score never feeds it.
- 0–70 from realised R, mapped across the range −1R to +4R.
- 0–10 capture efficiency — how much of the move that was actually available got taken.
- 0–10 against what that instrument typically returns, and only when the instrument has a real sample behind it.
- 0–10 conviction alignment — a high-conviction win earns more, a high-conviction loss costs more.
Percentile claims
Any comparative sentence anywhere on this site — a page, a card, an email, a notification — carries the metric, the sample size and the window. Below 500 graded calls platform-wide, no comparative claim is made at all. Not a softened one, not a vague one. “One of the strongest calls this month” is still a comparative claim without evidence, so it does not exist in our copy.
When a claim is made it looks like this: “Top 5% of 3,812 traders by mean R, trailing 90 days.” Distributions are snapshotted nightly and never recomputed retroactively, so a claim made yesterday still means what it meant yesterday.
What we think is weakest
A methodology page that only lists strengths is marketing. These are the places where we think the current approach is most open to challenge:
- The composite is a heuristic, not a measurement. The weights were chosen by judgment. They have not been validated against adversarial strategies at scale, which is exactly why the plain statistics lead and the composite is labelled experimental.
- Correlation damping is coarse. Grouping by instrument, timeframe and calendar day catches the obvious case. It does not catch a trader making the same directional bet across five correlated instruments, which is genuinely one position.
- Single-venue data is not consolidated data. Equity calls graded against IEX bars see a real but partial tape. FX has no consolidated tape at all, so any FX result is relative to the feed we name.
- Modelled fills are optimistic by construction. No slippage, no spread cost on the exit, no partial-fill risk, no financing. A live position would do slightly worse than its graded twin, essentially always.
- Self-selection. Consensus figures describe the traders who post here, not the market. That is why every consensus sentence says “among active calls posted on TradeDiscuss” and shows its distinct trader count.
Changes to these rules
Every graded call stores the method version it was graded under. When the rules change, the version changes, and past calls keep the version they were decided by. We do not silently regrade history — if a correction requires regrading, it is announced and the affected calls say so.
Found a case these rules handle badly? Tell us. A grading defect is the most serious kind of bug this platform can have.