Skip to main content

Architecture options

NOVOSKY can run on one machine or be split across two. The split is recommended because MT5 only runs on Windows, while the training stack runs best on Linux.
One Linux VPS handles everything: the MT5 API Docker container (via Wine), the trading bot, and weekly retraining.
ComponentMinimumRecommended
CPU4 cores8 cores
RAM6 GB8 GB
Disk40 GB SSD80 GB SSD
OSUbuntu 24.04Ubuntu 24.04
Network50 Mbps stable100 Mbps stable
GPUNVIDIA (any CUDA-capable)
Retraining on the minimum spec (CPU-only, 4 cores) takes ~2–2.5 h. With an NVIDIA GPU the full retrain drops to ~30–45 min. The trading bot itself uses under 300 MB RAM at runtime.Cloud equivalents: Hetzner CCX23 (€15/mo, 8 vCPU/16GB), DigitalOcean 8 GB Droplet ($48/mo), AWS t3.xlarge, Azure D4s v5.For GPU training: AWS g4dn.xlarge (T4, ~$0.50/h spot) or Hetzner GPU server.

GPU note

Training uses a GPU when one is available via LightGBM’s CUDA backend and XGBoost’s device=cuda. Without a GPU, training falls back to CPU automatically — no configuration change needed.
SetupRetrain time (all 4 models)
CPU-only, 4 cores~2–2.5 hours
CPU-only, 8 cores~1–1.5 hours
NVIDIA GPU (T4 / RTX 3060+)~30–45 minutes
If running on Azure or another hypervisor VM, GPU passthrough requires a specific VM type (e.g. Azure NC-series, not the default B/D/E series which have only virtual VGA). CPU-only is perfectly viable for weekly retraining.

MT5 REST API setup

The bot does not use the MetaTrader5 Python package. All broker communication goes through a self-hosted HTTP API running on port 6542.
1

Install MetaTrader 5 on your Windows VM

Download and install MT5 from your broker’s website. Log in with your trading account credentials.
2

Install Docker

# Windows PowerShell (run as Administrator)
winget install Docker.DockerDesktop
Or install Docker Desktop from docker.com. Make sure it starts on boot.
3

Pull and run the MT5 REST API container

docker pull novosky/mt5-api:latest
docker run -d \
  --name mt5-api \
  --restart always \
  -p 6542:6542 \
  -e MT5_LOGIN=<your_account_number> \
  -e MT5_PASSWORD=<your_password> \
  -e MT5_SERVER=<broker_server_name> \
  -e API_TOKEN=<choose_a_secret_token> \
  novosky/mt5-api:latest
Replace <your_account_number>, <your_password>, <broker_server_name> with your MT5 credentials. Set <choose_a_secret_token> to a long random string — this is the API_TOKEN in your .env on the Linux VM.
4

Verify connectivity

From your Linux VM:
curl http://<windows_vm_ip>:6542/ping
# Expected: {"status": "ok", "time": 1714000000}
If you are using a broker-provided hosted VPS with MT5 pre-installed, skip Docker and configure the API container to connect to the already-running MT5 terminal.

Linux VM setup

# Run the automated VM setup script
./setup-vm.sh

# Or manually:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3.11 python3.11-venv git htop tmux

# Clone repo
git clone <repo> && cd novosky
python3.11 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

# Set up .env
cp .env.example .env
# Edit .env with your credentials

Process management (PM2)

PM2 keeps the trading bot running continuously and restarts it if it crashes (but not after a hard halt — sys.exit(99) is intentional).
# Install PM2
npm install -g pm2

# Start the bot
pm2 start ecosystem.config.js
pm2 save
pm2 startup   # install as system service

# Check status
pm2 status
pm2 logs trading-bot --lines 50

# Restart after a hard halt (check the reason first)
pm2 restart trading-bot
ecosystem.config.js is pre-configured for trading.py. Edit it to set NODE_APP_INSTANCE or add environment overrides.
After a hard halt (sys.exit(99)), do not restart automatically. First check the reason in the logs, update starting_balance_usd in config.json to your current balance, then restart manually.

Cron setup (weekly optimize)

The first optimize run installs the cron job automatically. To verify or install manually:
# Check existing cron jobs
crontab -l

# Manual install
crontab -e
# Add:
# 0 2 * * 0 cd /path/to/novosky && .venv/bin/python scripts/weekly_optimize.py --profile balanced >> logs/weekly_optimize.log 2>&1

Firewall

The MT5 REST API on your Windows VM should only be accessible from your Linux trading VM. Restrict port 6542 accordingly:
# Windows Firewall — inbound rule
Allowed source IP: <linux_vm_ip>
Port: 6542 (TCP)
Do not expose port 6542 publicly.