Multi-Coin-Paper-Daytrader

Multi-Coin-Paper-Daytrader

Docker app from 2CrAzYTV's Repository

Overview

Public beta of a paper-only multi-coin crypto day-trading simulator. It starts with deterministic demo data and can optionally use read-only Bitpanda Fusion market data. It cannot place real-money orders. The default shared-risk portfolio scans BTC-EUR, ETH-EUR, SOL-EUR, XRP-EUR and ADA-EUR with 15-minute signals and a 1-hour trend filter.

Multi-Coin Paper Daytrader – Unraid Edition

CI and container image

Public beta v0.2.0 of a paper-only multi-coin crypto day-trading simulator for Unraid and Docker. It uses €1,000 virtual starting capital by default and cannot place real-money orders.

Install on Unraid

The public container image is:

ghcr.io/2crazytv/multi-coin-paper-daytrader:latest

The canonical public Unraid / Community Applications template is:

https://raw.githubusercontent.com/2CrAzYTV/multi-coin-paper-daytrader/main/templates/multi-coin-paper-daytrader.xml

No Git checkout, Docker Compose, .env, GitHub login, or GHCR token is required on Unraid.

Quick install for a new Unraid user

  1. Open Docker → Add Container in Unraid.
  2. Use the public XML template from this repository. If the template is not already available in the local template selector, download/import templates/multi-coin-paper-daytrader.xml first.
  3. Keep Repository set to ghcr.io/2crazytv/multi-coin-paper-daytrader:latest.
  4. Keep Persistent Data at /mnt/user/appdata/paper-trading-bot/data unless you deliberately want another location.
  5. Keep PAPER_ONLY=true.
  6. For the first start, keep Market Data Source set to demo; no API key is needed.
  7. Select Apply, wait for the container to become healthy, then open http://UNRAID-IP:8787.
  8. To use current Bitpanda Fusion market data, create your own Read-only Fusion API key, change Market Data Source to fusion, enter the key in the masked Bitpanda Key field, and apply the container again. Do not enable Trade or Transfer permission.

The complete installation, update, backup, rollback, and troubleshooting guide is in docs/UNRAID.md.

The dashboard has no authentication. Keep it inside a trusted LAN and do not expose port 8787 directly to the internet.

What the simulator compares

The default universe is BTC-EUR, ETH-EUR, SOL-EUR, XRP-EUR, and ADA-EUR. Each comparison strategy starts with the same €1,000 virtual portfolio:

  1. Long only, up to 1× exposure
  2. Long/short, up to 1× exposure
  3. Long/short, up to 2× exposure

The €1,000 is shared across all configured coins inside each strategy; it is not additional capital per coin.

Safety contract

This repository deliberately remains paper only:

  • There is no function that creates, modifies, cancels, or confirms a real order.
  • The Bitpanda client exposes read-only GET market-data operations.
  • The application refuses to start when PAPER_ONLY=false.
  • Fusion should be used with an API key that has Read permission only; never enable Trade or Transfer for this application.
  • The Fusion API key is not returned by the dashboard or public config API.

Bitpanda documents Fusion API-key creation here: Fusion API key documentation.

Default risk limits

Rule Default Effect with €1,000
Modelled risk per trade 0.5% approximately €5 maximum
Aggregate open risk 1% approximately €10 maximum
Daily loss limit 2% approximately €20 maximum
Simultaneous positions 2 shared across all coins
New trades per day 3 shared across all coins
Persistent emergency stop 10% drawdown closes and locks until reset
Maximum leverage comparison strategy 3 only

Position sizing uses stop distance and includes assumed fees and slippage. Real markets can gap beyond stops, so these are simulation limits rather than guarantees.

Strategy defaults

  • 15-minute signal interval
  • 1-hour trend filter
  • fresh EMA-9/EMA-21 crossover in the direction of the hourly trend
  • RSI and relative candle-volume filters
  • stop distance equal to the larger of 1.5 × ATR(14) and 0.6%
  • 2R profit target
  • stop moved to break-even after 1R
  • 45-minute per-pair cooldown after an exit
  • all open positions closed at 23:45 in Europe/Berlin

The application requests active pairs and skips unavailable markets. Fusion documents the read-only pair list and OHLCV candle endpoints used by the project.

Fusion key on Unraid

The Unraid field uses Mask="true", which hides the key in the form but does not encrypt it. Unraid can persist container-variable values in its local Docker-template configuration. Protect /boot/config and its backups, and never share a saved local template that contains a real key.

Source / Docker Compose installation

Docker Compose works without a .env file because safe defaults are built in:

git clone https://github.com/2CrAzYTV/multi-coin-paper-daytrader.git paper-trading-bot
cd paper-trading-bot
mkdir -p data
chown -R nobody:users data
docker compose up -d --build

Open http://HOST-IP:8787 and inspect it with:

docker compose ps
docker compose logs --tail=100 paper-trading-bot

The SQLite database stays at ./data/paper_trading.sqlite3 outside version control.

A .env file is optional for local Compose overrides. .env.example is only a reference/template. Never commit a populated .env.

To use Fusion locally without .env:

DATA_SOURCE=fusion \
FUSION_READ_API_KEY='MY_LOCAL_READ_ONLY_KEY' \
docker compose up -d --build

Never commit, publish, or paste a real API key into an issue or support request.

Updates

Every successful push to main is tested by GitHub Actions and publishes a new :latest image plus an immutable sha-* tag. On Unraid use Docker → Check for Updates → Update/Force Update. The /data bind mount survives container recreation.

An image update does not automatically replace the locally saved Unraid template. If a release adds or removes template fields, recreate the container from the current canonical public XML under templates/ while keeping the same persistent /data mapping. Backup and digest rollback are documented in docs/UNRAID.md.

Dashboard controls

  • Language: switch the complete dashboard between English and German.
  • Run scan now: retrieve the latest closed candle without processing the same candle twice.
  • Run multi-coin backtest: simulate all configured pairs with one shared risk budget without changing active paper portfolios.
  • Reset paper data: delete only the local simulation state.

The default poll interval is 60 seconds, but the strategy can trade at most once per newly closed 15-minute candle. A signal does not guarantee a trade.

Configuration guardrails

The application reads standard environment variables. Unraid supplies them through the native template; Compose supplies safe defaults and accepts optional shell/.env overrides.

Code-enforced limits include:

  • APP_LANGUAGE must be en or de
  • RISK_PER_TRADE at most 0.01
  • MAX_AGGREGATE_RISK at most 0.02
  • MAX_DAILY_LOSS at most 0.02
  • MAX_OPEN_POSITIONS at most 3
  • MAX_TRADES_PER_DAY at most 6
  • PAPER_ONLY must remain true

Tests

The core local/CI checks are:

python -m unittest discover -s tests -v
python -m compileall -q app tests
node --check app/static/app.js
python -c "import xml.etree.ElementTree as ET; ET.parse('templates/multi-coin-paper-daytrader.xml')"
docker compose config

Pull requests also build the complete Docker image before merge. The protected main branch requires the Test application status check to pass.

Limitations and disclaimer

  • No return or side-income promise is made.
  • Short history and overfitting can make backtests misleading.
  • Fees and slippage are modelled; every real execution detail is not reproduced.
  • Correlated crypto assets are not treated as true diversification.
  • Taxes are not calculated.
  • Extended paper testing is required before drawing conclusions.
  • Real-money trading is intentionally outside this repository.

Project policies

This project is published under the MIT License. Also see:

Install Multi-Coin-Paper-Daytrader on Unraid in a few clicks.

Find Multi-Coin-Paper-Daytrader in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for Multi-Coin-Paper-Daytrader Review the template variables and paths Click Install

Requirements

Create /mnt/user/appdata/paper-trading-bot/data, assign it to nobody:users (99:100), and set mode 775. A separate .env file is not required. Keep PAPER_ONLY=true. For current market data choose fusion and provide your own Bitpanda Fusion API key with Read permission only; leave Trade and Transfer disabled. The dashboard has no authentication and should remain inside a trusted LAN.

Related apps

Details

Repository
ghcr.io/2crazytv/multi-coin-paper-daytrader:latest
Last Updated2026-08-17
First Seen2026-08-17

Runtime arguments

Web UI
http://[IP]:[PORT:8787]/
Network
bridge
Shell
sh
Privileged
false
Extra Params
--user=99:100 --read-only --init --tmpfs=/tmp:size=64m,mode=1777 --security-opt=no-new-privileges:true --cap-drop=ALL --pids-limit=2048 --restart=unless-stopped --stop-timeout=20

Template configuration

WebUI PortPorttcp

Local dashboard port.

Target
8787
Default
8787
Value
8787
Persistent DataPathrw

SQLite database and cached market data. The directory must be writable by UID/GID 99:100.

Target
/data
Default
/mnt/user/appdata/paper-trading-bot/data
Value
/mnt/user/appdata/paper-trading-bot/data
UI LanguageVariable

Default dashboard language: de or en. The UI also has a language selector.

Target
APP_LANGUAGE
Default
de
Value
de
Market Data SourceVariable

demo for safe simulated data or fusion for read-only Bitpanda Fusion market data.

Target
DATA_SOURCE
Default
demo
Value
demo
Bitpanda KeyVariable

Required only when DATA_SOURCE=fusion. Use a Bitpanda Fusion key with Read permission only; disable Trade and Transfer. Masking hides the value in the form, but Unraid still stores it in the local container configuration.

Target
FUSION_READ_API_KEY
Starting Paper CapitalVariable

Starting balance for the paper account in EUR.

Target
STARTING_CAPITAL
Default
1000
Value
1000
Risk per TradeVariable

Fraction of equity risked per trade. 0.005 = 0.5%. Maximum allowed by the bot is 1%.

Target
RISK_PER_TRADE
Default
0.005
Value
0.005
Maximum Aggregate RiskVariable

Maximum combined open-position risk. 0.01 = 1%.

Target
MAX_AGGREGATE_RISK
Default
0.01
Value
0.01
Maximum Daily LossVariable

Daily loss limit. 0.02 = 2%.

Target
MAX_DAILY_LOSS
Default
0.02
Value
0.02
Maximum Open PositionsVariable

Maximum simultaneous paper positions (1-3).

Target
MAX_OPEN_POSITIONS
Default
2
Value
2
Maximum Trades per DayVariable

Maximum number of new paper trades per day (1-6).

Target
MAX_TRADES_PER_DAY
Default
3
Value
3
Trading PairsVariable

Comma-separated EUR pairs, up to 10.

Target
PAIRS
Default
BTC-EUR,ETH-EUR,SOL-EUR,XRP-EUR,ADA-EUR
Value
BTC-EUR,ETH-EUR,SOL-EUR,XRP-EUR,ADA-EUR
Candle IntervalVariable

Primary strategy candle interval.

Target
CANDLE_INTERVAL
Default
15m
Value
15m
Trend IntervalVariable

Higher-timeframe trend filter interval.

Target
TREND_INTERVAL
Default
1h
Value
1h
Paper Only Safety LockVariable

Must remain true. This release cannot place real-money orders.

Target
PAPER_ONLY
Default
true
Value
true
Hard Drawdown LimitVariable

Hard account drawdown limit. 0.10 = 10%.

Target
HARD_DRAWDOWN
Default
0.10
Value
0.10
Fee RateVariable

Simulated trading fee rate. 0.001 = 0.1%.

Target
FEE_RATE
Default
0.001
Value
0.001
Slippage RateVariable

Simulated slippage rate. 0.0005 = 0.05%.

Target
SLIPPAGE_RATE
Default
0.0005
Value
0.0005
Fast EMA WindowVariable

Fast strategy window.

Target
FAST_WINDOW
Default
9
Value
9
Slow EMA WindowVariable

Slow strategy window.

Target
SLOW_WINDOW
Default
21
Value
21
Trend Fast WindowVariable

Fast higher-timeframe trend window.

Target
TREND_FAST_WINDOW
Default
20
Value
20
Trend Slow WindowVariable

Slow higher-timeframe trend window.

Target
TREND_SLOW_WINDOW
Default
50
Value
50
ATR WindowVariable

ATR calculation period.

Target
ATR_WINDOW
Default
14
Value
14
RSI WindowVariable

RSI calculation period.

Target
RSI_WINDOW
Default
14
Value
14
Stop ATR MultipleVariable

ATR multiplier used for protective stops.

Target
STOP_ATR_MULTIPLE
Default
1.5
Value
1.5
Minimum Stop PercentVariable

Minimum stop distance. 0.006 = 0.6%.

Target
MINIMUM_STOP_PCT
Default
0.006
Value
0.006
Take Profit RVariable

Take-profit target in R multiples.

Target
TAKE_PROFIT_R
Default
2.0
Value
2.0
Trailing Trigger RVariable

R multiple that activates the trailing logic.

Target
TRAILING_TRIGGER_R
Default
1.0
Value
1.0
History BarsVariable

Bars loaded for live strategy calculations.

Target
HISTORY_BARS
Default
500
Value
500
Backtest BarsVariable

Bars used by the backtest.

Target
BACKTEST_BARS
Default
1000
Value
1000
Poll Interval SecondsVariable

Automatic scanner interval in seconds (30-900).

Target
POLL_SECONDS
Default
60
Value
60
Session Close HourVariable

Daily session close hour in APP_TIMEZONE.

Target
SESSION_CLOSE_HOUR
Default
23
Value
23
Session Close MinuteVariable

Daily session close minute.

Target
SESSION_CLOSE_MINUTE
Default
45
Value
45
Cooldown MinutesVariable

Cooldown after a completed trade before another entry.

Target
COOLDOWN_MINUTES
Default
45
Value
45
Application TimezoneVariable

Timezone used by the trading session logic.

Target
APP_TIMEZONE
Default
Europe/Berlin
Value
Europe/Berlin
Container TimezoneVariable

Timezone used by the container and logs.

Target
TZ
Default
Europe/Berlin
Value
Europe/Berlin
Data DirectoryVariable

Container path for persistent SQLite data. Keep /data with the path mapping above.

Target
DATA_DIR
Default
/data
Value
/data
Fusion Base URLVariable

Bitpanda Fusion API base URL.

Target
FUSION_BASE_URL
Default
https://api.fusion.bitpanda.com
Value
https://api.fusion.bitpanda.com