OrderVane

Five gates I set before looking at a backtest result

I spent two years tuning a strategy on a backtest I could not reproduce. These are the rules I wrote afterwards — before running anything again.

What went wrong first

For about two years I tuned an order-flow strategy inside a platform backtest. That backtest was not deterministic: the same rule over the same data did not always produce the same trades. I knew it and kept going, because every round of tuning made the numbers look better.

They looked better because I was fitting the noise. Each parameter I moved was a response to variance I could not reproduce. Two years of work produced a strategy that existed only in the runs I happened to see.

The lesson is not “backtests lie.” It is narrower and more useful: if you cannot reproduce a result you cannot learn from it, and the improvement you feel while tuning is not evidence of anything.

What follows is what I wrote after that, before running the next set of tests. They are gates, not goals. A setup clears them or it does not, and I do not get to move them afterwards.

Gate 1 — Decide the cost before you see the result

Round-trip cost on my instrument measures at about 2.4 ticks: one tick of front-month spread, commission near 0.4, and a tick of slippage.

I set the pass/fail gate at 4.0 ticks anyway.

Not because 4.0 is more accurate — 2.4 is the honest measurement. I set it higher so that I could not quietly relax it later, when results were disappointing. A cost assumption chosen after you see the P&L is not an assumption; it is a dial.

Write the number down first. If a setup only survives at your best-case cost, it does not survive.

Gate 2 — Compute the break-even win rate your R:R demands

The cheapest test there is, and it killed my setup faster than anything else.

Measured reward-to-risk came out at 0.17. That implies a break-even win rate of about 85.5% — right roughly six times out of seven, just to pay for the losses.

Actual win rate was 81.2%.

Eighty-one percent sounds excellent, and on a win-rate-only view the setup looked healthy. It was negative, and no amount of target tuning was going to close a four-point gap against an 85% requirement.

Do this before you build anything elaborate. One division, one comparison. It costs nothing and it ends a lot of conversations early.

Do not read a high win rate as a good sign on its own. A high win rate with non-positive expectancy is picking up pennies: the losses simply arrive less often than they are large. Judge on expectancy and profit factor. The win rate is a component, not a verdict.

Gate 3 — How often entry and exit land in the same bar

I gate this at under 30%. The best I measured was 31.9%.

A high same-bar rate means the setup is not giving the trade room to be right or wrong. It enters and exits inside one bar’s noise, which makes the result a statement about your bar size rather than about the market.

It is also a warning that the exits are doing the work rather than the entries — which was true in my case, and took a long time to see because I was looking at the entry side.

Gate 4 — Below thirty trades there is no verdict

Under thirty trades I record no verdict. Not a pass, not a failure.

This matters more than it sounds. The temptation with a small sample is to call a marginal result “promising” and keep it alive. A hypothesis that is neither confirmed nor rejected has to be labelled that way, or it quietly becomes a belief.

For promotion to anything real I require at least a hundred trades. Between thirty and a hundred I can read a direction. Below thirty I cannot.

Gate 5 — Write the criteria down before you look

Everything above works only if it is written before the result exists.

So I pre-register: one hypothesis per run, gates fixed in advance, run design specified before any of it executes. The rule I find hardest is the simplest — the criteria do not get loosened. If a result misses the gate then the result failed; the gate did not turn out to be too strict.

What this cost me

The first pre-registered run tested a belief I had held for a while: that shortening the bar would fix the same-bar problem.

Same rule, same data, only the bar size changed. Reward-to-risk stayed pinned at 0.17 across every bar size I tried. It did not move.

FAIL. Bar size was not the binding constraint, and a couple of years of intuition about it was wrong. The run took an afternoon. Believing it cost considerably more.

Honest limits

These measurements come out of OrderVane, the order-flow tooling I build for Quantower. It is the instrument here, not the subject.