Overfitting in strategy research
Selection, dependence and the evidence required after a search
Desktop app for Windows and macOS
Build a trading strategy from blocks, backtest it on your own data,
and find out whether the result could be luck.
An account is required to get the app: create one, answer five short questions and download it. Early access is free for life on one computer, in exchange for your feedback. Windows 10 or 11, and macOS 13.1 or later on Apple silicon.
Public research counter: GO and NO-GO verdicts shared by opted-in users of the app ↗
Eight screens from the desktop app, in the order you use them.
Browse your strategies and price files, edit Python in the code editor, and follow each run in the log. Panels dock, split and resize.
Place data, signals, costs and exits on a canvas and connect them. The assistant beside the canvas can place blocks for you or explain what the graph does.
Load your own price files and run the graph on your computer. The best configuration is drawn in color, the others you tried stay in grey, with monthly returns and drawdown under it.
One screen groups the checks: does the result survive the number of variants you tried, does it hold on data kept out of the tuning, are there enough trades. It ends on GO or NO-GO.
Your curve is drawn against strategies that trade at random with the same move sizes, and your trades are replayed thousands of times to show where the account could go next.
Replay the strategy through a prop-firm challenge many times, with its target and loss limits, and read your chance of passing before you pay the fee.
Pick roles such as researcher, validator and devil's advocate, give them a question and a token budget, and keep each run as a note you can search later.
Turn the run into a research paper with its charts, method and disclosures, rendered as a PDF you can share.
Screens from the desktop app, captured on its built-in sample data.
Drop a CSV of returns, equity or trades on the app window below, and its verdict and metrics are worked out from your file.
Without a file of your own, try our synthetic sample of two years of random daily returns.
A file alone cannot show how the strategy does on unseen data, so its verdict stays at not conclusive.
How the check reads your file ↗Stochastly replays your strategy under the firm's rules thousands of times and shows how often it passes and how long it takes.
Hypothetical simulation, not live results. 4,000 simulated accounts over 365 days on the $100k two-step rules at 1% risk a day, 60 of them drawn.
Strategy: long-only moving-average cross on EURUSD, GBPUSD, USDJPY and XAUUSD hourly bars; its research verdict was NO-GO.
Export the supported logic of your graph to the language you work with.
Pick a language to read the file the app exported for a long-only moving-average cross strategy. Its header gives the parameters and how closely the file matches the engine.
Languages & coverage ↗Strategy code exports ↗Coverage depends on the strategy and target. Each file includes its scope and limitations.
Pine Script & MetaTrader notices ↗"""Strategy “ema_cross” exported from Stochastly.GENERATED BY STOCHASTLY — do not edit by hand, re-export.kernel : ema_crossparameters : {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}direction : Lfidelity : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.def _long_raw(open, high, low, close, volume): return crossup(ema(close, 13), ema(close, 21))//@version=6// GENERATED BY STOCHASTLY - kernel ema_cross, parameters {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}// fidelity : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.; target fidelity: TradingView applies its own intrabar fills and tick rounding; timeout and session close orders fill on the following bar. The generated Pine code has not been executed here.longRaw = f_cross(f_ema(close, 13), f_ema(close, 21)) > 0shortRaw = f_cross(f_ema(close, 21), f_ema(close, 13)) > 0//+------------------------------------------------------------------+//| GENERATED BY STOCHASTLY - do not edit by hand, re-export.//| kernel : ema_cross//| parameters : {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}//| direction : L//| fidelity : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.; target fidelity: MetaTrader uses terminal history and broker fills; its EMA warm-up and execution can differ from the engine. The generated MQL5 code has not been executed here.bool LongRaw(int i) { return(((Ema(3,13,i) > Ema(3,21,i)) && (Ema(3,13,(i+1)) <= Ema(3,21,(i+1))))); }bool ShortRaw(int i) { return(((Ema(3,21,i) > Ema(3,13,i)) && (Ema(3,21,(i+1)) <= Ema(3,13,(i+1))))); }# GENERATED BY STOCHASTLY - kernel ema_cross, parameters {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}# fidelity : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.; target fidelity: this language has no recursive exponential moving average, so the translation uses a finite window# exact : NO - read the gaps below# gap : ema(x, 13) rendered by a FINITE geometric window of 52 bars (factor 0.8571): FASTEXPR has no recursive exponential average. The first bars and weighting tail differ — signal order is preserved, its value is not.# gap : ema(x, 21) rendered by a FINITE geometric window of 84 bars (factor 0.9091): FASTEXPR has no recursive exponential average. The first bars and weighting tail differ — signal order is preserved, its value is not.# WorldQuant and BRAIN are trademarks of WorldQuant, LLC. Stochastly is an independent# product, not affiliated with or endorsed by WorldQuant.# You remain solely responsible for complying with the BRAIN platform agreement you# accepted, including any originality warranty attached to submitting an alpha.# NOT EXPORTED — 1 node(s) of your graph are NOT in this file. 1 of them CHANGE the trades: this file does not replay your backtest's entries and exits.# • [execution] Execution (defaults) — FASTEXPR is a stateless alpha language: the stop, target and forced close that made your backtest's P&L are not in this alpha. Python, MQL5, Pine, C++ and Rust carry them.subtract(ts_decay_exp_window(close, 52, factor=0.8571), ts_decay_exp_window(close, 84, factor=0.9091))// GENERATED BY STOCHASTLY - do not edit by hand, re-export.// kernel : ema_cross// parameters : {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}// direction : L// fidelity : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.inline S long_raw(const S& o, const S& h, const S& l, const S& c, const S& vol) { (void)o; (void)h; (void)l; (void)c; (void)vol; return crossup(ema(c, 13), ema(c, 21)); }inline S short_raw(const S& o, const S& h, const S& l, const S& c, const S& vol) { (void)o; (void)h; (void)l; (void)c; (void)vol; return crossup(ema(c, 21), ema(c, 13)); }// GENERATED BY STOCHASTLY - do not edit by hand, re-export.// kernel : ema_cross// parameters : {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}// direction : L// fidelity : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.fn long_raw(o: &S, h: &S, l: &S, c: &S, vol: &S) -> S { let _ = (o, h, l, c, vol); crossup(ema(c.clone(), 13), ema(c.clone(), 21)) }fn short_raw(o: &S, h: &S, l: &S, c: &S, vol: &S) -> S { let _ = (o, h, l, c, vol); crossup(ema(c.clone(), 21), ema(c.clone(), 13)) }Research papers export too: a PDF paper, a batch of papers in one layout, or a one-page tearsheet. See a paper ↗
Connect your coding agent to Stochastly.
Compose graphs, run backtests and export through MCP.
MCP clients · connection setup required
MCP tools & setup ↗Stochastly / stochastly-mcpPublicThe MCP launcher, open source under MIT. It connects Claude, Cursor or VS Code to the engine running in the desktop app; the engine itself stays in the app.View the source on GitHub ↗Available from AtelierEach chart reads the run you just made. The nodes cover data, signals, rules, costs and checks across 28 families; 492 of them are placed in a graph by a test that checks their effect on the output.
Demo run on synthetic data: seeded generators, no market data. The 149 charts in this demo are drawn by the app's own code.
The app turns a run into a paper. The journal lists working papers written with Stochastly, and anyone with an account can submit one.
The app writes a run up as a PDF paper: abstract, method, numbered equations, results and a disclosures box. A section with no data behind it is left out, with a note saying so.
The Paper Editor is available from Atelier; Starter has no access.
Open the sample PDF ↗Paper export ↗App export · 14 September 2026 · hypothetical simulationSelection, dependence and the evidence required after a search
State equivalence, risk controls and the accounting of trading costs
Every change since we went public on , one line each, with the work in progress on top. Full changelog · Full roadmap
No line matches this search.
Background: Quentin Matsys, The Moneylender and His Wife, 1514, public domain, in a pixel-art interpretation.
Create an account, answer five short questions, then download the app. It stays free for life on one computer; in return you tell us what works and what broke.
Join the early accessClaude is a trademark of Anthropic, Gemini of Google and Codex of OpenAI. Stochastly is not affiliated with them.







