A python monitoring and trading bot which exploits price-spreads between different cryptocurrency exchanges.
- Monitoring of spreads between exchanges (eg. Gdax, Bitfinex, Bitstamp, ...)
- Multiple currency pairs configurable (eg. BTC/EUR, ETH/USD, ...)
- Notifications on spread thresholds (eg. spreads of > 200€) via different notification channels (eg. Pushbullet, Mail, ...)
- Automated trading for configured spread thresholds (partly implemented)
- Storing of historical spreads and making them available via a web UI
- Highly configurable (currency pairs, thresholds for each notification channel or trading, historical data, ...)
The following example explains spreads between exchanges:
Exchange | BTC/EUR price |
---|---|
Gdax | 5000€ |
Bitfinex | 5600€ |
This results in a spread of 600€ for the price of 1 BTC in EUR between Gdax and Bitfinex (this example is not based on ask and bid prices for simplicity reasons, the bot itself uses those correct prices).
(example based on above table)
Preparation:
- Store 5000€ on Gdax
Spread exploitation:
- Buy BTC on Gdax for 5000€
- Send BTC from Gdax to Bitfinex
- Pay fees for transaction and wait until it's confirmed
- Sell BTC on Bitfinex for 5600€
Postprocessing (steps needed to be able to repeat exploit):
- Transfer 5600€ from Bitfinex to Gdax to repeat
Advantages | Disadvantages |
---|---|
Capital needed: 5000€ | Risk of price fluctuation until transaction is confirmed |
Postprocessing partly done manually (SEPA transfer of the euro amount) | |
Postprocessing is time-consuming (couple of days for international SEPA transfer) |
Preparation:
- Store 5000€ on Gdax account
- Store 1 BTC on Bitfinex account
Spread exploitation:
- Buy 1 BTC on Gdax
- Simultaneously sell 1 BTC on Bitfinex
Postprocessing (steps needed to be able to repeat exploit):
- Transfer 5600€ from Bitfinex to Gdax
- Transfer 1 BTC from Gdax to Bitfinex
Advantages | Disadvantages |
---|---|
No real risk of price fluctuation (whole spread exploitation only takes a couple of seconds) | Same disadvantages as strategy 1 (except the risk of price fluctation) |
Capital needed: ~ 2x5000€ (fiat currency: 5000€ + BTC worth ~5000€) |
The following table demonstrates the amount of BTC and fiat stored on the exchanges during the different phases of the execution of the strategy:
Preparation
Exchange | Amount of BTC | Amount of € |
---|---|---|
Gdax | 0 | 5000 |
Bitfinex | 1 | 0 |
After Spread exploitation
Exchange | Amount of BTC | Amount of € |
---|---|---|
Gdax | 1 | 0 |
Bitfinex | 0 | 5600 |
Profit: 600€ (excluding fees for simplicity)
The strategy worked during the crypto boom at the end of 2017 (with spreads of > 700€ several times a week). As of now, spreads are pretty low (< 100€) which renders using the bot risky and less attractive (change of prices during order executions, fees, ...).
- Monitoring works
- Automated trading is partly implemented, but never tested with real accounts
- Reliability isn't as good as it should be when using the bot with real accounts
The bot itself is placed at bitcoin_arbitrage/monitor with its entry point / main class being bitcoin_arbitrage/monitor/monitor.py.
The code within bitcoin_arbitrage/
is a Flask app which is just a fancy wrapper for the monitor/bot with a web UI.
Configuration of the bot is done by copying the settings.py file.
Requirements:
- python >= 3.6
- pipenv (install via
pip install pipenv
)
Run the monitor:
pipenv install
- Install requirementsscripts/copy-config
- Copy config file (some dummy settings are set by default)scripts/run
- Run the monitor
You can use the following systemd service entry:
[Unit]
Description=Bitcoin Arbitrage Monitor
After=network-online.target
[Service]
Type=simple
User=bitcoin
Restart=always
WorkingDirectory=/home/bitcoin/bitcoin-arbitrage
ExecStart=/home/bitcoin/bitcoin-arbitrage/scripts/run
[Install]
WantedBy=multi-user.target
Manually:
scripts/test