Desktop app for Windows and macOS

# Your quantitative research desk.

Build a trading strategy from blocks, backtest it on your own data,
and find out whether the result could be luck.

[Join the early access](https://stochastly.com/join)Check a backtest you already ran ↓

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.

Local research workspace[Built-in assistant ↗](https://stochastly.com/product/assistant)

[Public research counter: GO and NO-GO verdicts shared by opted-in users of the app ↗](https://stochastly.com/research/verdicts)

[Machine learning ↗](https://stochastly.com/docs/guide/machine-learning)[Prop-firm simulations ↗](https://stochastly.com/docs/guide/prop-firms)[Visual builder & code ↗](https://stochastly.com/product/editor)[Local backtesting ↗](https://stochastly.com/product/local)

## From an idea to a tested strategy.

Eight screens from the desktop app, in the order you use them.

WorkspaceBuildBacktestEdge or luckLuck testProp firmResearchPaper

### Your files and your code.

Browse your strategies and price files, edit Python in the code editor, and follow each run in the log. Panels dock, split and resize.

### Build it from blocks.

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.

### Backtest it on your data.

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.

### See if it is an edge or luck.

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.

### Compare it with chance.

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.

### Check your prop-firm odds.

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.

### Ask a panel of agents.

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.

### Write it up.

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.

## Already ran a backtest? Drop the file.

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](https://stochastly.com/samples/synthetic-daily-returns.csv) 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 ↗](https://stochastly.com/check)

The verdict, metrics table and assistant are drawn by the app's own code. The window stays empty until you add a file, and each figure in it comes from your file.

## Will it pass a prop-firm challenge?

Stochastly replays your strategy under the firm's rules thousands of times and shows how often it passes and how long it takes.

- 1Import your strategy
- 2Pick the firm rules
- 3Get the pass rate before paying the fee

[Try the free challenge calculator](https://stochastly.com/tools/prop-firm-challenge-simulator)

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.

## Your strategy. 6 code targets.

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 ↗](https://stochastly.com/docs/exports)[Strategy code exports ↗](https://stochastly.com/product/exports)
Coverage depends on the strategy and target. Each file includes its scope and limitations.
[Pine Script & MetaTrader notices ↗](https://stochastly.com/legal)

Stochastly / code export

Python (pandas/numpy).py · Same trades as the engineTradingView (Pine v6).pine · Generated, not run hereMetaTrader 5 (MQL5).mq5 · Generated, not run hereWorldQuant BRAIN (FASTEXPR).txt · Generated, not run hereC++ (standard library only).cpp · Same trades as the engineRust (no crate, no dependency).rs · Same trades as the engine

ema_cross.py[Download the full file](https://stochastly.com/assets/exports/ema_cross.py)

```
"""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))
```

Run against the engine on synthetic price paths: same trades, from entry to exit.

ema_cross.pine[Download the full file](https://stochastly.com/assets/exports/ema_cross.pine)

```
//@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
```

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.

ema_cross.mq5[Download the full file](https://stochastly.com/assets/exports/ema_cross.mq5)

```
//+------------------------------------------------------------------+//| 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))))); }
```

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.

ema_cross.txt[Download the full file](https://stochastly.com/assets/exports/ema_cross.txt)

```
# 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))
```

This language has no recursive exponential moving average, so the translation uses a finite window.

ema_cross.cpp[Download the full file](https://stochastly.com/assets/exports/ema_cross.cpp)

```
// 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)); }
```

Run against the engine on synthetic price paths: same trades, from entry to exit.

ema_cross.rs[Download the full file](https://stochastly.com/assets/exports/ema_cross.rs)

```
// 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)) }
```

Run against the engine on synthetic price paths: same trades, from entry to exit.

18 supported kernels[Scope & evidence ↗](https://stochastly.com/evidence.html#exports)

Research papers export too: a PDF paper, a batch of papers in one layout, or a one-page tearsheet. See a paper ↗

## Run research from your terminal.

Connect your coding agent to Stochastly.
Compose graphs, run backtests and export through MCP.

[Screenshot: Claude logo](https://stochastly.com/docs/mcp)

[Screenshot: Gemini logo](https://stochastly.com/docs/mcp)

[Screenshot: Codex logo](https://stochastly.com/docs/mcp)

[Screenshot: Cursor logo](https://stochastly.com/docs/mcp)

MCP clients · connection setup required
[MCP tools & setup ↗](https://stochastly.com/product/mcp)[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.PythonMIT licencepip install stochastly-mcpView the source on GitHub ↗](https://github.com/Stochastly/stochastly-mcp)Available from Atelier

## 214 charts and 667 nodes in the app.

Each 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.

[See the charts ↗](https://stochastly.com/product/charts)[Browse the nodes ↗](https://stochastly.com/docs/nodes)

Demo run on synthetic data: seeded generators, no market data. The 149 charts in this demo are drawn by the app's own code.

## Write the paper. Publish it.

The app turns a run into a paper. The journal lists working papers written with Stochastly, and anyone with an account can submit one.

[Screenshot: First page of a research paper exported by Stochastly](https://stochastly.com/assets/media/recorded-research-paper.pdf)

### Export the research paper.

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.

- Research paperPDF, from the Paper Editor
- Batch of papersPDF, several runs in one layout
- TearsheetOne page, PNG or PDF

The Paper Editor is available from Atelier; Starter has no access.
[Open the sample PDF ↗](https://stochastly.com/assets/media/recorded-research-paper.pdf)[Paper export ↗](https://stochastly.com/product/papers)App export · 14 September 2026 · hypothetical simulation

### Working papers

-

[Screenshot: First page of Overfitting in strategy research](https://stochastly.com/journal/ml-evaluation.html)

Working paper 0121 September 20266 pages

### [Overfitting in strategy research](https://stochastly.com/journal/ml-evaluation.html)

Selection, dependence and the evidence required after a search

[Mahé Chadeffaud](https://stochastly.com/about#mahe-chadeffaud)

[Read](https://stochastly.com/journal/ml-evaluation.html)[PDF](https://stochastly.com/assets/papers/ml-evaluation.pdf)

-

[Screenshot: First page of Validation in event time](https://stochastly.com/journal/mcp-session.html)

Working paper 0221 September 20266 pages

### [Validation in event time](https://stochastly.com/journal/mcp-session.html)

Label maturity, overlapping information and chronological evaluation

[Mahé Chadeffaud](https://stochastly.com/about#mahe-chadeffaud)

[Read](https://stochastly.com/journal/mcp-session.html)[PDF](https://stochastly.com/assets/papers/mcp-session.pdf)

-

[Screenshot: First page of From a backtest to executable rules](https://stochastly.com/journal/research-paper.html)

Working paper 0321 September 20266 pages

### [From a backtest to executable rules](https://stochastly.com/journal/research-paper.html)

State equivalence, risk controls and the accounting of trading costs

[Mahé Chadeffaud](https://stochastly.com/about#mahe-chadeffaud)

[Read](https://stochastly.com/journal/research-paper.html)[PDF](https://stochastly.com/assets/papers/research-paper.pdf)

### Publish your paper

- Export the PDF from the Paper Editor, or bring your own.
- Upload it from your account, with your public profile.
- We read it before it is listed. You can post new versions later.

Listed papers get a profile page for the author and a BibTeX entry for citing them.
[Submit a paper](https://stochastly.com/account/community)[Browse the journal ↗](https://stochastly.com/journal.html)

## What changed, and what we are building.

Every change since we went public on 29 Sep 2026, one line each, with the work in progress on top. [Full changelog](https://stochastly.com/version) · [Full roadmap](https://stochastly.com/roadmap)

Newest first

AuthorDateVersionChange

What is planned next: https://stochastly.com/roadmap.

The latest changes, date by date: https://stochastly.com/version.

No line matches this search.

Background: Quentin Matsys, The Moneylender and His Wife, 1514, public domain, in a pixel-art interpretation.

## Join the early access.

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 access](https://stochastly.com/join)

Claude is a trademark of Anthropic, Gemini of Google and Codex of OpenAI. Stochastly is not affiliated with them.

PASCAL / MODULO 2[Mathematics in the details ↗](https://stochastly.com/evidence.html#art)

---
Source: https://stochastly.com/
