7.3 KiB
01 — Tech Stack & Installation From Scratch
Everything you need to install, what each piece is for, where to get it, and the exact commands per operating system. Nothing here is strategy-specific — this is the plumbing.
1. The stack at a glance
| Layer | Tool | Role | Where to get it |
|---|---|---|---|
| Language | Python 3.12+ (3.13/3.14 work) | everything outside MT5 | https://www.python.org/downloads/ |
| Data frames | pandas | OHLC tables, resampling, equity curves | https://pandas.pydata.org · pip install pandas |
| Numerics | numpy | vectorized price/indicator math | https://numpy.org · pip install numpy |
| Columnar storage | pyarrow | read/write Parquet market data (fast, compact) | https://arrow.apache.org/docs/python/ · pip install pyarrow |
| JIT speed | numba | compiles the hot bar-by-bar loop to machine code | https://numba.pydata.org · pip install numba |
| Optimizer | Optuna | Bayesian hyper-parameter search | https://optuna.org · pip install optuna |
| Optuna storage | SQLAlchemy (+ alembic) | persists studies to a SQLite DB so runs resume/parallelize | https://www.sqlalchemy.org · pip install sqlalchemy |
| Config | PyYAML | reproducible run settings (wizard-answers.yaml) |
https://pyyaml.org · pip install pyyaml |
| HTML parsing | lxml + html5lib | parse the MT5 Strategy Tester HTML report | https://lxml.de · pip install lxml html5lib |
| Progress / logs | tqdm, colorlog | progress bars, readable logs | pip install tqdm colorlog |
| HTTP | requests | optional data downloads / webhooks | https://requests.readthedocs.io · pip install requests |
| Tester | MetaTrader 5 terminal | the gold-standard backtester + data source | from your broker, or https://www.metatrader5.com/en/download |
| MT5 control (Windows) | MetaTrader5 pip package | drive the terminal & pull data from Python (Windows only) | https://pypi.org/project/MetaTrader5/ · pip install MetaTrader5 |
Optional data source. If you want history without MT5 export,
dukascopy-python(pip install dukascopy-python, https://pypi.org/project/dukascopy-python/) pulls free tick/bar data for many symbols. MT5-exported data from your own broker is preferred because it matches the tester exactly.
Reference versions
A known-good combination (early 2026) — use these or the latest stable:
python 3.14
pandas 3.0
numpy 2.4
pyarrow 24.0
numba 0.65
optuna 4.8
sqlalchemy 2.0
pyyaml 6.0
lxml 6.1
Pin exact versions in a requirements.txt once your lab works, so it reproduces later.
2. What each library actually does here
- pandas / numpy — market data is loaded into a DataFrame of
[timestamp, open, high, low, close, spread]. Indicators and signals are computed as numpy arrays. Equity curves are pandas frames. - pyarrow + Parquet — a few years of M1 (one-minute) bars is millions of rows. Parquet stores it columnar and compressed: a multi-million-row file loads in well under a second and is a fraction of CSV size. This is what makes "full-history backtest in seconds" possible.
- numba — the engine's inner loop walks every bar (and sub-ticks within each bar). Pure-Python
that is too slow.
@njitcompiles it to native code on first call; subsequent runs are C-fast. - Optuna — instead of brute-forcing a parameter grid, Optuna uses a Bayesian sampler (TPE) that learns which regions of the search space are promising and concentrates trials there. You get a good optimum in hundreds–thousands of trials instead of an exhaustive grid of millions.
- SQLAlchemy/SQLite — Optuna writes each trial to a
study.db. That means a study can be stopped and resumed, inspected mid-run (count completed trials), and run with multiple worker processes pointing at the same DB. - lxml / html5lib — the MT5 tester exports its report as an HTML file encoded UTF-16-LE. These parse it into a metrics dict (Net Profit, Profit Factor, Drawdown, trade count, …).
- MetaTrader5 package — on Windows, this is the clean way to (a) download historical bars and (b) launch/script the terminal. On non-Windows you don't have it, which is why remote topologies use SSH + a scheduled task instead.
3. Install — step by step
3.0 Prerequisites
- Python 3.12+. Check with
python3 --version(macOS/Linux) orpython --version(Windows). - Git (to version your lab).
- MetaTrader 5 installed from your broker, with a demo account logged in.
3.1 Windows (Topology A — recommended)
# From the project root, in PowerShell or cmd:
# 1. Create the virtual environment
python -m venv .venv
# 2. Activate it
.\.venv\Scripts\activate
# 3. Upgrade pip
python -m pip install --upgrade pip
# 4. Install the stack (MetaTrader5 included — Windows only)
pip install pandas numpy pyarrow numba optuna sqlalchemy alembic pyyaml lxml html5lib tqdm colorlog requests MetaTrader5
3.2 macOS / Linux (Topology B/C — MT5 lives elsewhere)
# 1. Create the venv
python3 -m venv .venv
# 2. Activate
source .venv/bin/activate
# 3. Upgrade pip
python3 -m pip install --upgrade pip
# 4. Install the stack (NO MetaTrader5 package — it is Windows-only)
pip install pandas numpy pyarrow numba optuna sqlalchemy alembic pyyaml lxml html5lib tqdm colorlog requests
On Apple Silicon (M-series) everything above is native arm64 and fast.
numba/numpyship arm64 wheels — no Rosetta needed.
3.3 Verify the install
# Use the venv's python explicitly to avoid the system interpreter
.venv/bin/python3 -c "import pandas, numpy, pyarrow, optuna, numba, yaml, lxml; print('core OK')"
# Windows: .\.venv\Scripts\python -c "..."
On Windows also verify the terminal link:
import MetaTrader5 as mt5
print(mt5.initialize()) # True if it found & launched the terminal
print(mt5.version())
mt5.shutdown()
4. Always use the venv interpreter
A recurring source of bugs is accidentally running the system Python (which lacks the libraries). Make it a habit to call the venv interpreter by path:
# macOS/Linux
.venv/bin/python3 your_script.py
# Windows
.\.venv\Scripts\python your_script.py
…or activate the venv at the start of every session. Pick one convention and keep it.
5. .gitignore essentials
Your lab will accumulate large data and secrets. Ignore them from day one:
.venv/
data/ # market data is large & re-downloadable
results/ # scratch run outputs
*.db # Optuna SQLite studies
*.htm # pulled MT5 reports
.env # broker credentials — NEVER commit
__pycache__/
.DS_Store
6. Hardware notes
- Backtesting is CPU + RAM bound, not GPU. A modern multi-core CPU and 16 GB+ RAM is plenty.
- Optuna parallelizes across CPU cores. The practical cap for heavy concurrent backtests is roughly
your number of performance cores — beyond that they contend and slow each other down. Prefer
one Optuna study with
n_jobs=Nover N separate scripts fighting for cores. - Millions of M1 bars fit comfortably in RAM as a pandas frame; loading from Parquet is the only I/O.
Next: 02-architecture.md — the layered architecture you are about to build.