JohnnyTrade
Snapshot data

Backtest desk

Testing 13 strategies on data they never saw

Each pair runs its own strategy at a fixed 3:1 reward to risk. Every result below comes from hourly prices with spreads and fees charged. The last 146 days of prices were locked away while the strategies were tuned, so those numbers are the honest ones.

Scoreboard

Results on unseen data (the locked holdout). Dots show the five tuning periods: slate made money, red lost. Tap a pair to open its desk.

Pair and strategyLastNowUnseen tradesWin rateAvg win : lossR per tradeTuning periodsVerdict

Loading

Loading prices
Up candle, winning exitDown candle, losing exitArrows mark entries

Where price could be

Ranges come from current volatility, with fat tails learned from the tuning data. Odds come from a small model trained on the tuning data. Both were scored on the 146 unseen days. That score sits beside each line.

Equity in R, every trade

Cumulative result in risk units. The shaded stretch is the unseen holdout.

Recent trades

EnteredSideEntryExitResultExit

Against your target

Results

Tuning dataUnseen data

Refine

Move a setting and the backtest reruns instantly.

Evolve

Mutates the settings and scores each version on the tuning data and its neighbours. A change is kept only if it is clearly better and still profitable across more periods. The unseen data is never used to choose.

What could move these markets

    Further out

      Built into every backtest: entries pause for a set number of hours around Fed decisions and US jobs reports (the News blackout setting). Other events above are not filtered, so size down around them.

      Why 80% at 3:1 is the wrong target

      At 3:1 a strategy breaks even winning just 25% of trades. Winning 80% at 3:1 would earn about +2.2R per trade, which turns 1% risk into roughly 2% gained on every trade, every time. No public strategy has done that for long. When a backtest shows it, the usual causes are lookahead (using a price before it existed), tiny samples, or settings bent to fit the past.

      So JohnnyTrade aims at what can be reached and kept: positive R per trade on data the strategy never saw, profitable in most periods, with enough trades to mean something. A small honest edge at 3:1 compounds. A fake 80% blows up the first month it meets live prices.

      How the tests work. Hourly candles up to 14 November 2026: forex from January 2024, gold and silver from June 2024, BTC, XRP and SOL from November 2024, PI from February 2025. The last 146 days, from 21 June 2026, are the locked unseen data for every pair. Signals are read at a bar's close and filled at the next bar's open. If a bar touches both stop and target, the stop counts first. Gaps through a stop fill at the open. Each trade pays a spread (forex and metals) or fees and slippage (crypto, 0.25% to 0.45% round trip).

      How evolve avoids fooling you. Everything before 21 June 2026 is cut into five periods for tuning. The last 146 days are locked. A new version must beat the old one on the tuning data and score well when every setting is nudged up or down. It must also keep most of its trades and stay profitable in at least as many periods. Only then does it replace the champion. The unseen numbers are reported, never optimised.

      Your own looks count too. Each time you keep an evolved version after seeing its unseen result, those numbers lose a little honesty. The real test is new data after 14 November, which a nightly refresh can add.

      Data. Forex majors, gold (COMEX GC futures as the spot proxy, with roll gaps) and silver (SI futures) from Yahoo Finance. BTC, XRP and SOL from Coinbase. PI from OKX PI-USDT. Fed dates from the Fed calendar; jobs-report dates follow the first-Friday rule with the 2025 shutdown delays, so treat them as approximate.

      The conditions score. A small model gives every signal a second opinion from eight things measured when the signal fires: trend, recent momentum, volatility against its norm, RSI, hour of day, position in the recent range and stop width. It was trained on tuning data only. The rule for using it was written down before the unseen data was looked at: skip the lowest-scored 40% only if that helped inside the tuning data and also helped on the unseen 146 days. It passed, narrowly. Across all pairs the kept unseen trades averaged +0.04R against -0.04R for all of them. Gold went from +0.20R to +0.29R keeping 41 of 46 trades, EUR/USD from +0.10R to +0.14R keeping 29 of 32, silver kept all 16. Those are small samples, so skipped signals are still tracked live and the score has to keep earning its place.

      Live prices. When the Cloudflare Worker runs, forex, metals and oil stream from OANDA through a Durable Object. Crypto streams straight from Coinbase and OKX. The header shows the measured delay from the market's timestamp to this page, usually well under a second. The live read runs each strategy's own rule as if the current hour closed now. That answer is provisional until the hour closes. It says so plainly, because signals that change before the close are how indicator products repaint.

      News memory. Every headline is stored with what gold, EUR/USD, USD/JPY and bitcoin did in the 1, 4 and 24 hours after it, in ATRs. New headlines are matched to similar past ones. Both the AI's call and the memory's call are then scored against what happened next. Those hit rates sit above the headlines, so you can see whether either one beats a coin flip.

      Run it yourself. The same strategy scripts power this page and a command line kit: node tools/backtest.js, node tools/evolve.js, node tools/test.js (checks for lookahead in all 13 strategies).

      This is research software, not financial advice. Past results, including unseen-data results, do not promise future ones.

      Growth and journal

      What your target would do to an account

      Each line below is 2,000 simulated accounts trading your settings, with random luck in the order of wins and losses. Log your real trades underneath and your actual balance is drawn over the projection, so you can see which world you are in.

      8 in 10 accountsMiddle halfTypical (median)Comparison medianYour real trades

      Bad and good luck are the 1 in 10 outcomes on either side of typical.

      AfterBad luckTypicalGood luck

      The plan for a small account

      Trade only the strategies that kept an edge on unseen data. Close every trade within 12 hours and risk 1% a trade. Add money monthly. Switch gold on only once the account can afford its smallest trade. Each line is 1,000 simulated accounts built from those strategies' real unseen trades.

      8 in 10 accountsTypical, edge as measuredTypical, half the edgeOnly your deposits
      AfterPut inBad luckTypicalGood luck

        House money: risk more with profit only

        Money you deposit is risked at the deposit rate. Once the balance reaches double what you put in, the profit above your deposits is risked at the higher profit rate. A withdrawal resets the count, so what stays in the account is treated as your own money again. Every trade is sized in whole units against OANDA Canada's margin, so a trade the account can't afford is skipped or trimmed. Each run is 2,000 simulated accounts built from the real unseen trades.

        8 in 10 accountsTypical, house moneyTypical, deposit rate onlyOnly your depositsGoal

        Log scale, so each gridline is a multiple of the one below.

        AfterPut inTaken outBad luckTypicalGood luck

        Connecting JohnnyTrade to a broker

          Starting with 10, 50 or 100

          Growth is a percentage, so a small account grows by the same percentage as a big one. Two things change at small sizes: whether the smallest trade your broker allows fits inside your risk, plus how much fees take from each trade. This table runs each strategy's real unseen trades through both.

          StrategyUnseen resultSmallest trade risksTypical, 3 moTypical, 12 moBad luck, 12 moVerdict

          Your real trades

          Result in R is worked out from your entry, stop and exit. Money result is R times the amount you risked.

          DatePairSideEntryExitRResultBalance

          Saved in this browser.