The conviction score

Virtus-Fin

Every strategy in this system answers a yes/no question: did the close clear the channel? A coin that ground sideways for forty bars and then jumped three ATR on five times its usual volume, and one that ticked a cent over the line in the middle of chop, are the same event to that question. They get the same risk, and neither can be refused for being the worse of the two. Virtus-Fin replaces the yes/no with a number — and then spends the rest of this page telling you how much of the trading that number is allowed to do.

= wT·Thrust + wQ·Quality + wM·Momentum + wC·Compression + wP·Participation − λ·CostR

Five factors, each independently observable at the close of the signal bar, each normalised to [0, 1] so the weights mean what they look like they mean — minus a penalty for what the round trip costs, measured in units of the trade's own risk. The result is a number between 0 and 1. Zero is a break nothing supports; one is every factor agreeing at once, which has never happened.

The five were chosen before any of them was measured. That ordering is the only thing that makes the measurements further down this page mean anything: a factor picked because it worked on the history it is then tested against is not evidence, it is a memory.

Try it

Move the five, and watch what the number does.

The composite score 0.00 V
Weighted sum
Cost penalty
Gate
Sizing

The weights, λ, the threshold and the cap are the shipped ones for the venue you picked — this runs the same arithmetic the live engine runs. Two things it cannot show you: the factors are measured from bars rather than chosen, and on the live book this number changes nothing on two of the three venues. That is the subject of the rest of this page.

Ground sideways, then jumped

channel 3 ATR 5× volume
Did the close clear the channel?
YES
By how much, and how clean?
V = 0.80

Ticked over the line, in chop

channel 0.02 ATR 0.9× volume
Did the close clear the channel?
YES
By how much, and how clean?
V = 0.26
Same instrument, same rule, same bar type — and to the yes/no question that decides whether a position opens, the same answer. The two scores are what the formula returns for these five readings on the forex profile, and they are the two presets in the panel above: press The textbook break and A tick over the line and the dial lands on each of them. The readings here are chosen to illustrate; on a live bar they are measured.

The five factors

Five distinct reasons a breakout works, or doesn't.

Each reads one thing, at one moment, from bars that had already closed. None of them can see the future — a property with its own test, because it is the only reason any of the numbers here are worth reading.

channel (20-bar high, shifted) 0.5 ATR = 1.00

Thrust wT

How far past the channel the close actually landed, in ATR. Saturates at half an ATR of daylight, so two ATR does not count as four times one. What it refuses: a close a tick past the line is not evidence that the channel broke.

ER 0.83 100 net / 120 travelled ER 0.11

Quality wQ

Kaufman's efficiency ratio: net move divided by total travel. This is what ADX gropes at, computed directly, with no smoothing constant to argue about. What it refuses: a random walk that happened to end higher — and whose stop gets hit on the way.

skipped return ÷ σ short-horizon reversal lives in the skipped stretch

Momentum wM

Trailing return over its own volatility, squashed through a logistic so one enormous move cannot dominate the sum. The most recent bars are skipped — and so is their volatility, or the z-score divides a number that ignores those bars by one that doesn't.

ATR(50) ATR(10) ÷ ATR(50) = 0.4 coiled

Compression wC

Volatility clustering read forwards. A range that has gone quiet has a tight stop, so the same dollar move is worth more R. This one is partly arithmetic rather than statistical, which is exactly why it is in the formula.

trailing median (shifted 1 bar) 3× median = 1.00

Participation wP

The cheapest lie detector available: a breakout nobody traded is a quote artifact. Reads a flat 0.5 — "no information", not "bad signal" — where the venue has no honest volume, which is a real possibility on FX.

read standing on bar 200 0.6412 read again, 800 bars later 0.6412

No lookahead the load-bearing test

A factor's value at a historical bar must not change when later bars arrive. Every window a bar is graded against is shifted back one, so no bar sets the level it has to clear. This is the property that makes every measurement below mean anything at all.

The cost term

The one term that is allowed to refuse a trade.

The five factors are a statistical claim. The cost term is a subtraction, and a subtraction cannot fail to be true. It asks one question: how much of what this trade is trying to win does it hand to the spread before being right about anything?

M15 SCALP, 1×ATR STOP, 1.0R TARGET 25% of the prize paid to the spread 1.0R 12,193 trades · −0.1861R each · t = −22.59 H1 TREND, 3×ATR STOP, 2.5R TARGET 1.9% 2.5R 1,488 trades · −0.0403R each · t = −1.29
Measured on seven FX majors over four years of real historical bid/ask. The deployed configuration was the left-hand one.
Configuration Cost ÷ target Trades Expected R t
M15 scalp, 1×ATR, TP 1.0R25%12,193−0.1861−22.59
M15 trend, 2×ATR, TP 2.5R5.7%6,615−0.2011−13.38
H1 trend, 2×ATR, TP 2.5R2.8%1,879−0.0731−2.44
H1 trend, 3×ATR, TP 2.5R1.9%1,488−0.0403−1.29
H4 trend, 3×ATR, TP 2.5R1.0%365−0.1459−2.44

Read this honestly, because it says two things and only one of them is nice.

The nice one: the configuration that was deployed is the worst cost ratio of the five and carries the most overwhelming evidence of loss anywhere in this system. t = −22.59 is not a close call; it is twelve thousand trades saying the same thing.

The one that matters more: nothing in that table is positive. Cutting the cost ratio from 25% to 1.9% takes the bleed from −0.186R to −0.040R and stops there. So the gate does not make FX profitable. It refuses the configuration that is certain to lose, and it is honest that what remains is unproven rather than good.

The limit is a tenth of the target, or 0.35R absolute where a strategy has no take-profit to take a fraction of. Neither number is fitted. The first is the roundest number that refuses the 25% configuration and admits everything measured at single digits, and a plain-language statement of the same thing: you should not pay a tenth of the prize to the spread before you are right about anything.

Three variations

One formula, parameterised by what each venue actually costs.

The three profiles differ only where an argument about the venue says they must — the cost multiplier, the horizons, and whether volume means anything. Everything else is held identical on purpose, so that a difference in results between venues is a fact about the venue rather than about the tuning.

Crypto

Virtus-Fin/C · Robinhood · daily bars

Cost weight λ
1.00
Efficiency window
20
Momentum / skip
60 / 5
ATR fast / slow
10 / 50
Weights
0.20 each

188 bps round trip. The cost term is not a tiebreak here, it is the dominant fact of the venue: at a 6% stop the fee is 0.31R before the trade has done anything. λ = 1.0 makes one R of cost cancel a full point of score.

Equities

Virtus-Fin/E · Alpaca · daily bars

Cost weight λ
0.10
Efficiency window
20
Momentum / skip
40 / 3
ATR fast / slow
10 / 50
Weights
0.20 each

11.52 bps on this sub-$20 population — sixteen times cheaper than crypto, and small enough that the cost term would never change a decision. Kept tiny rather than removed, so the formula stays one formula. A 5-day skip on a 10-day hold would skip the whole trade.

Forex

Virtus-Fin/F · OANDA · M15 bars

Cost weight λ
0.20
Efficiency window
48
Momentum / skip
240 / 16
ATR fast / slow
14 / 96
Quality weight
0.30
Participation weight
0.10

OANDA "volume" is a tick count from one broker, not traded size — a real proxy for activity and the weakest of the five here. Its weight moves to quality, which measures the thing FX breakouts most often fail at: being in a range.

How it gets smarter

The weights are learned from each book's own trades — and then made to earn their place.

The hand-written weights are a starting position, not a claim. The three venues turned out to disagree about nearly every factor when measured, and no amount of reasoning from first principles was going to produce that. So each book fits its own — and the obvious next step, use them, is the exact mistake this system already measured its way out of once.

Record 5 readings at entry Realise carry through close Fit ρ less one std error Split halve by time first half second half fit here, score there and the other way round Both ≥ +0.05? promote · else reject re-fitted every cycle, on every trade that has closed since
Every venue records the five readings against every entry and carries them through the close, so each book accumulates its own (what the market looked like, what the trade then did) pairs.
  1. Collecting< 40 trades

    No weights exist. The score is the fixed profile and the panel says how many more closed trades it needs — rather than fitting five correlations to a dozen outcomes and calling the result an opinion.

  2. Fitted40 – 119

    Weights exist and are drawn in full, including the negative ones: a factor whose high readings preceded worse trades is information, not a broken factor. The score is still the fixed profile. An opinion is not authority.

  3. Rejectedtested, failed

    The book's history was split at its middle, the fit from each half was asked to order the other, and at least one direction came back under +0.05. The weights stay on the page with the number that refused them, which is worth more than the weights would have been.

  4. Livetested, passed

    Both directions cleared the floor. From that cycle on, V is built from weights the book taught itself. Nothing else changes — see below.

Why both directions, and not just a hold-out? Because one hold-out is one coin flip. A rank correlation over sixty trades has a standard error near 0.13, so roughly half the time an ordering carrying no information at all will clear a one-sided test. Requiring the fit to work forwards and backwards across the split asks whether the relationship is a property of the book or a property of one period.

Fitting on the second half to score the first is not something a live bot could ever do, and it is not pretending to be. It is a symmetry check — and it is precisely what the backtested weights failed on equities, where the correlation ran +0.047 in the first half and −0.019 in the second.

Promotion changes one thing: which weights V is built from. It does not open the gate, and it does not switch on conviction sizing. Those rest on a stronger claim — that the ordering is good enough to refuse a trade on — and promotion does not test that claim, so it does not grant it.

What the measurement said

Every use of this score that could change a trade was tested. All of them failed.

Each venue's deployed strategy was replayed and every trade scored at its entry bar — same trades, nothing re-optimised, so the score is the only variable. This is the part of the page that a product would normally leave out.

0.00 −0.06 +0.12 CRYPTO · 417 +0.099 1st half +0.037 2nd half EQUITIES · 418 +0.047 1st half −0.019 2nd half
Weights learned walk-forward — fitted only on trades that had already closed when each new trade opened. Crypto is weakly sign-consistent. Equities changes sign, which is the shape of no relationship.
TestCryptoEquitiesVerdict
Does it rank-order outcomes?
fixed weights, ρ vs realised R
+0.019
497 trades
−0.052
498 trades
Crypto's top quartile was its worst. No monotone ordering on either.
Does it beat picking arbitrarily?
vs 200 random orderings, both halves
28 / 54 0 / 27 28 of 54 is a coin flip. 0 of 27 is a refutation.
Conviction sizing
risk scaled by score
Never reached. It rests on the same claim as the gate, and that claim did not survive the first test.

There is a version of this you can play. Twelve setups, take or skip, with the same five readings and the same cost term — and at the end, the same comparison this table makes: your hand against taking everything, against the cost gate, and against a coin that refuses exactly as often as the score does. It takes two minutes, and it is a faster way to understand the row above than the row above is.

The engines walk their watchlists in order, so when more signals fire than slots exist the winners are decided alphabetically. That is the bar the second test measures against — and ranking by score cleared it in both halves of the sample in 28 of 54 crypto configurations and 0 of 27 equity ones. The best crypto cell (+54.67R against a random median of +37.22R, 92nd percentile) is real, and it is also cherry-picked: it does not survive changing the warmup from 80 bars to 120, which is exactly the fragility the sweep exists to expose.

What it decides today

Two knobs. One of them is no longer at neutral.

This section said "both at neutral, on all three venues" until 2026-08-24, and it had been wrong since the 23rd. The FX sizing cap was moved to 1.25 on the owner's explicit instruction, and a page that argues its settings are what the measurement produced has to say when one of them was not.

threshold refuse any signal scoring below it 0.00 — refuses nothing all three venues the ranking claim it needs did not survive, and nobody has asked for it since conviction cap scale risk up on the setups it likes 1.00 — crypto, equities 1.25 — forex measured by nothing; see below
The threshold is what the measurement produced. The forex cap is not: it was set on 2026-08-23 on the owner's instruction, and it is the one change in this book that no backtest priced — backtest/engine.py contains zero references to Virtus-Fin, so there is no harness that could have priced it.

On crypto and equities the score is computed on every instrument every cycle, recorded against every entry, drawn on the dashboard — and it decides nothing. It ships switched off, visible, and recording itself, exactly the way crypto ran in shadow mode until forward evidence existed.

On forex it now sizes. Not refuses — the gate is still 0.00 and every signal that clears the guards is still taken. What changed is that a signal scoring 1.00 asks for 1.25 times the base risk, which is the adaptive ceiling exactly, so full conviction reaches the configured limit and never asks for risk the clamp would take back. The reason it is 1.25 and not more is arithmetic. The reason it is on at all is not: it was an instruction, and every measurement on this page argues the other way.

What is enforced everywhere is the cost term, because that one is arithmetic rather than statistics. It refuses a trade whose round trip costs more than a tenth of what it is trying to win.

And the loop above is what would change that. Each book fits its own weights on its own closed trades and has to order trades it never saw, in both directions, before those weights build the live score. If a venue ever clears that bar, the dashboard says so on the same screen as the number — and the weekly report says which venue and by how much.

Opening the gate is a further decision, with evidence still outstanding. It has not been taken.