All apps · 0 apps
Multi-Coin-Paper-Daytrader
Docker app from 2CrAzYTV's Repository
Overview
Readme
View on GitHubMulti-Coin Paper Daytrader – Unraid Edition
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
- Open Docker → Add Container in Unraid.
- 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.xmlfirst. - Keep Repository set to
ghcr.io/2crazytv/multi-coin-paper-daytrader:latest. - Keep Persistent Data at
/mnt/user/appdata/paper-trading-bot/dataunless you deliberately want another location. - Keep
PAPER_ONLY=true. - For the first start, keep Market Data Source set to
demo; no API key is needed. - Select Apply, wait for the container to become healthy, then open
http://UNRAID-IP:8787. - 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:
- Long only, up to 1× exposure
- Long/short, up to 1× exposure
- 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
GETmarket-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 | 2× | 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)and0.6% 2Rprofit 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_LANGUAGEmust beenordeRISK_PER_TRADEat most0.01MAX_AGGREGATE_RISKat most0.02MAX_DAILY_LOSSat most0.02MAX_OPEN_POSITIONSat most3MAX_TRADES_PER_DAYat most6PAPER_ONLYmust remaintrue
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.
Requirements
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/2crazytv/multi-coin-paper-daytrader:latestRuntime 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
Local dashboard port.
- Target
- 8787
- Default
- 8787
- Value
- 8787
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
Default dashboard language: de or en. The UI also has a language selector.
- Target
- APP_LANGUAGE
- Default
- de
- Value
- de
demo for safe simulated data or fusion for read-only Bitpanda Fusion market data.
- Target
- DATA_SOURCE
- Default
- demo
- Value
- demo
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 balance for the paper account in EUR.
- Target
- STARTING_CAPITAL
- Default
- 1000
- Value
- 1000
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 combined open-position risk. 0.01 = 1%.
- Target
- MAX_AGGREGATE_RISK
- Default
- 0.01
- Value
- 0.01
Daily loss limit. 0.02 = 2%.
- Target
- MAX_DAILY_LOSS
- Default
- 0.02
- Value
- 0.02
Maximum simultaneous paper positions (1-3).
- Target
- MAX_OPEN_POSITIONS
- Default
- 2
- Value
- 2
Maximum number of new paper trades per day (1-6).
- Target
- MAX_TRADES_PER_DAY
- Default
- 3
- Value
- 3
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
Primary strategy candle interval.
- Target
- CANDLE_INTERVAL
- Default
- 15m
- Value
- 15m
Higher-timeframe trend filter interval.
- Target
- TREND_INTERVAL
- Default
- 1h
- Value
- 1h
Must remain true. This release cannot place real-money orders.
- Target
- PAPER_ONLY
- Default
- true
- Value
- true
Hard account drawdown limit. 0.10 = 10%.
- Target
- HARD_DRAWDOWN
- Default
- 0.10
- Value
- 0.10
Simulated trading fee rate. 0.001 = 0.1%.
- Target
- FEE_RATE
- Default
- 0.001
- Value
- 0.001
Simulated slippage rate. 0.0005 = 0.05%.
- Target
- SLIPPAGE_RATE
- Default
- 0.0005
- Value
- 0.0005
Fast strategy window.
- Target
- FAST_WINDOW
- Default
- 9
- Value
- 9
Slow strategy window.
- Target
- SLOW_WINDOW
- Default
- 21
- Value
- 21
Fast higher-timeframe trend window.
- Target
- TREND_FAST_WINDOW
- Default
- 20
- Value
- 20
Slow higher-timeframe trend window.
- Target
- TREND_SLOW_WINDOW
- Default
- 50
- Value
- 50
ATR calculation period.
- Target
- ATR_WINDOW
- Default
- 14
- Value
- 14
RSI calculation period.
- Target
- RSI_WINDOW
- Default
- 14
- Value
- 14
ATR multiplier used for protective stops.
- Target
- STOP_ATR_MULTIPLE
- Default
- 1.5
- Value
- 1.5
Minimum stop distance. 0.006 = 0.6%.
- Target
- MINIMUM_STOP_PCT
- Default
- 0.006
- Value
- 0.006
Take-profit target in R multiples.
- Target
- TAKE_PROFIT_R
- Default
- 2.0
- Value
- 2.0
R multiple that activates the trailing logic.
- Target
- TRAILING_TRIGGER_R
- Default
- 1.0
- Value
- 1.0
Bars loaded for live strategy calculations.
- Target
- HISTORY_BARS
- Default
- 500
- Value
- 500
Bars used by the backtest.
- Target
- BACKTEST_BARS
- Default
- 1000
- Value
- 1000
Automatic scanner interval in seconds (30-900).
- Target
- POLL_SECONDS
- Default
- 60
- Value
- 60
Daily session close hour in APP_TIMEZONE.
- Target
- SESSION_CLOSE_HOUR
- Default
- 23
- Value
- 23
Daily session close minute.
- Target
- SESSION_CLOSE_MINUTE
- Default
- 45
- Value
- 45
Cooldown after a completed trade before another entry.
- Target
- COOLDOWN_MINUTES
- Default
- 45
- Value
- 45
Timezone used by the trading session logic.
- Target
- APP_TIMEZONE
- Default
- Europe/Berlin
- Value
- Europe/Berlin
Timezone used by the container and logs.
- Target
- TZ
- Default
- Europe/Berlin
- Value
- Europe/Berlin
Container path for persistent SQLite data. Keep /data with the path mapping above.
- Target
- DATA_DIR
- Default
- /data
- Value
- /data
Bitpanda Fusion API base URL.
- Target
- FUSION_BASE_URL
- Default
- https://api.fusion.bitpanda.com
- Value
- https://api.fusion.bitpanda.com