Project · Failed · Paper trading only

AI-Assisted EUR/USD Trading System

The plan, how it worked, the real test results, why it failed, and the full source code.

Educational demo. Not financial advice. This system was only ever paper-traded: simulated trades with fake money, using a cTrader demo data feed and free public price data. No real money was traded. Every strategy here lost money or failed its tests. Do not use it to trade real money.

The plan

Grow a $10 paper account with strict rules

The goal, in the words of the project's program README:

"Goal: find and validate a repeatable, net-positive process, judged only by forward paper results after costs, starting from a $10 paper account. No orders of any kind (no live, no demo). Read-only cTrader demo API. No profit is promised."

Source: program/README.md

The first version was a single EUR/USD rule, described in the main README:

"'Large 5m range': on each completed M1 candle, if range_5m (high-low of the last 5 candles) > 0.000326, go SHORT at the next candle's open. 0.01 lot, 5-pip stop, 120-minute maximum hold, one position at a time, $10 virtual account."

Source: README.md

A second, simpler simulator (newbot-paper) tested an EMA(20)/EMA(50) crossover on 1-hour EUR/USD bars with a 2×ATR stop and 4×ATR target, also from a $10 fake balance.

Source: newbot-paper/README.md

How it worked

Architecture and risk rules

Architecture

  • ctrader/market.py: builds 1-minute candles from live spot quotes on the cTrader Open API demo host (read-only requests only).
  • trading/live_paper.py: the first live paper trader. It simulated trades in memory and logged them to CSV.
  • program/engine.py: the long-running paper engine for the 21-day program: quotes, fill simulation, risk limits, plug-in strategy modules, review cycles.
  • program/hypotheses/<ID>.py: plug-in rule modules, each pre-registered in an append-only journal before its backtest.
  • program/risk.py: the hard limits in code, checked against RISK_LIMITS.md by a SHA-256 hash. The engine refuses to start if the file changes.
  • program/stats.py, daily_summary.py, final_report.py: forward statistics and the promotion test.
  • ops/: supervisor scripts (single instance lock, crash restart with backoff, heartbeat watchdog).
  • program/backtests/: pre-registration, backtests and screening scripts.
  • newbot-paper/: a standalone EUR/USD paper simulator using only the Python standard library and Yahoo Finance hourly data.

The deterministic risk rules (from RISK_LIMITS.md)

  • Paper only: no live or demo orders. The engine refuses to start if any program file references an order, amend or close-position API message.
  • Account and sizing: paper equity starts at $10.00. Size is the symbol's minimum volume (0.01 lot FX) while equity < $20.
  • Per-trade risk: every trade has a hard stop set at entry that is never moved further away. Max risk per trade $1.10 while equity ≤ $11.00, then min($1.10, 10% of equity). No entry if the spread is > 3× normal. Used margin ≤ 70% of equity.
  • Portfolio: at most 2 open positions; total open risk ≤ 15% of equity; flat by Friday 20:45 UTC.
  • Daily loss limit: no new entries for the day if equity falls to ≤ 80% of the start-of-day equity.
  • Kill switch: halt everything if equity < $4.00 or drawdown from peak > 50%. The program never resumes after a halt.
  • Per-hypothesis kill: after ≥ 15 forward trades with profit factor < 0.8, or 8 losses in a row.
  • Costs always applied: fills at live bid/ask, slippage, $3.00 per lot per side commission on FX, swap; if a stop and a target are hit by the same quote, the stop wins.
  • Promotion rule: ≥ 30 closed trades and ≥ 14 days, net P&L > 0 after costs, profit factor ≥ 1.3, beats a random-direction control at the 95th percentile, t-stat ≥ 2.0, max drawdown < 35%. Even then, no orders; a human decides.

Source: program/RISK_LIMITS.md (full text in the source viewer below)

Results

Tests and backtests, exactly as recorded

1. Frozen backtest of "Large 5m range" (EUR/USD)

Columns as in the file. Cost is in percent; returns are in percent.

Cost %TradesWin rate %Total returnProfit factorMax drawdown
0.031950.162.3541.268-1.253
0.00531947.650.7591.079-1.522
0.0131943.89-0.8360.920-2.102
0.01531938.87-2.4310.787-3.483
0.0231935.74-4.0260.675-4.966

Source: data/reference/nonoverlap_frozen_results.csv (rounded to 3 decimals)

2. Live paper trading of "Large 5m range" (2026-10-05 to 2026-10-06 UTC)

Closed tradesWinnersExitsNet pipsNet P&LProfit factorEquity
29622 stop, 7 time-41.65-$4.170.63$10.00 → $5.84

Commission was not modelled in this trader ("commission (~0.6 pip round trip on this Pepperstone raw demo) is not modelled"). The trader was then stopped (README: "the old short-only paper trader is STOPPED").

Source: data/live_paper_trades.csv (totals computed from the file), README.md

3. newbot-paper sanity backtest (EMA crossover, EUR/USD 1h, $10 start)

WindowTradesWin rateProfit factorFinal equityReturnMax drawdown
3 months50.0%0.00$1.59-84.07%84.07%
6 months2227.3%0.70$1.34-86.56%92.27%
12 months9832.7%1.03$14.83+48.34%82.74%

Its forward paper account: 1 closed trade (stop loss, -$2.95), balance $7.05 from $10.00, with one position still open at the last run on 2026-10-08.

Source: newbot-paper/backtest_results.txt, newbot-paper/data/trades.csv, newbot-paper/data/run.log

4. 21-day paper program: forward trades

Strategy LBO v1 (GBPUSD London opening-range breakout) was the only hypothesis that reached forward testing. 16 other hypotheses were rejected by the pre-forward screen.

TradeSymbolDirectionExitNet P&LEquity after
3GBPUSDshorttake profit+$1.94$11.94
6GBPUSDlongstop loss-$1.09$10.85

Source: program/journal/trades.csv, program/reports/daily_2026-10-14.txt, program/journal/hypotheses.jsonl

5. LBO v1 history backtest (2022-01-03 to 2026-10-06, real bid/ask ticks)

SetTradesWin %Net $PFtMax DD $
Out-of-sample 2022-01-03 to 2023-08-3041629.6-86.350.73-3.0488.17
In-sample 2023-08-31 to 2026-10-0671436.3-18.070.96-0.4643.94
All 2022-01-03 to 2026-10-06113033.8-104.420.87-2.15125.47

Source: program/backtests/lbo_history_100plus.md (fixed 0.01 lot; equity may go negative on paper)

6. The strategy search

After the first rules failed, the AI-assisted research moved to a continuous loop of testing new strategy ideas, each written down before its backtest was run.

  • Early rounds (to 2026-10-06): EUR/USD, other FX pairs and symbols, and a fixed bracket (10-pip stop / 20-pip target, about -$1 / +$2 per trade at 0.01 lot). "None of the 7 candidates is good enough to deploy." The bracket: "no variant has an edge." Other symbols: "44 pre-declared symbol-variant tests. None reaches significance." Including news-time strategies, the early rounds reached 80 tests: "Even so, no strategy becomes significant."
  • Later rounds (2026-10-18 to 2026-10-19): the search ledger records 167 more research rounds (Rounds 7 to 171), 316 variants in all, covering FX, stock indices, gold and other commodities, crypto, rates and calendar effects.
  • Method: historical backtests with in-sample / out-of-sample splits, after costs, against a random-direction control. The pass bar was a two-sided Bonferroni t-stat over the cumulative number of variants tested (at least 2.5); it rose to |t| ≥ 3.74 after Round 142.
  • Rule: paper trade only strategies that first pass a historical backtest (the LBO history test used 100+ trades).
  • Result: every round in the ledger is marked FAIL or NOT CONFIRMED. None passed every test.

The closest candidates (all failed)

RoundIdeaBest out-of-sample resultWhy it still failed
R70US500, weekly: implied correlation (COR3M) above its 1-year median309 trades, PF 1.52, t 3.02Below the t bar; 82% overlap with a simple "VIX above 1-year median" regime; not confirmed on other indices (R71)
R114Pre-holiday long on the Hang Seng (HK50) and French (FRA40) indicesB: 534 trades, PF 1.37, t 3.13Below the t bar; the edge was strong only in 1988-93 and 1998-2003 and weak since 2008; lost money in 2023-26
R163HK50 after mainland Stock Connect buying393 trades, PF 1.07, t 0.77Weak; lost money in 2023-09 to 2026-10 (PF 0.85)
R124Pooled commodity calendar seasonalsA: PF 0.94, t -0.15Lost money after costs

Sources: research/README.md, research/SEARCH_LEDGER.md

Why it failed

The edge did not survive costs

  • Costs erased the backtest edge. "Large 5m range" had a profit factor of 1.27 with zero costs, but it fell to 0.92 at 0.01% cost per trade.
  • It lost in live paper trading. 22 of 29 trades hit the 5-pip stop, and the $10 account fell to $5.84 in two days, without commission even being charged.
  • The best candidate failed on untouched data. The LBO backtest verdict: "LBO v1 does NOT survive the backtest." Out-of-sample: "Win rate 29.6% vs a 36.4% break-even, PF 0.73, net -$86.35, t = -3.04." The program was then stopped: "2026-10-18: program STOPPED at B's request after LBO v1 failed the 2022-2026 history backtest."
  • $10 is too small to manage risk. From the LBO report: "In both periods the account freezes after its first 3-6 trades (from $10 to ~$6.4-6.6), so it could not even trade its way back." From newbot-paper: "The 1% risk target is not achievable at $10 … True 1% risk needs roughly $200+ of equity."
  • Nothing else passed. Every later research round in the search ledger is marked FAIL or NOT CONFIRMED.
  • The decision. On 2026-10-20 the project was stopped because no strategy showed a robust out-of-sample edge. No real-money orders were ever placed.

Sources: data/reference/nonoverlap_frozen_results.csv, data/live_paper_trades.csv, program/backtests/lbo_history_100plus.md, program/README.md, newbot-paper/README.md, research/SEARCH_LEDGER.md

Try it

Download and run

eurusd-trading-system.zip: a sanitized copy with two folders, newbot-paper/ and eurusd-trading-system/. Credentials and account numbers were removed; see PUBLIC_COPY.md.

Easiest: newbot-paper (Python 3, no packages, no account)

unzip eurusd-trading-system.zip
cd newbot-paper
python3 backtest.py 6mo        # backtest on Yahoo Finance EURUSD=X hourly data
python3 run.py                 # start a fake $10 paper account in ./data

Its README uses absolute paths from the original machine; run the commands from inside the folder instead.

Full system: eurusd-trading-system (needs a cTrader demo account)

cd eurusd-trading-system
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
cp .env.example .env           # fill in your own cTrader Open API DEMO credentials
.venv/bin/python ops/demo_connection_test.py   # read-only demo check
python3 program/risk.py --selftest            # check the risk limits

Some scripts expect data files and paths from the original machine (/workspace/...) that are not included, so not everything will run as-is.

Paper trading only. Educational demo, not financial advice.

Source code

Browse the code

Loading…
← Back to projects