This is a sample market making bot for use with BitMEX.
It is free to use and modify for your own strategies. It provides the following:
BitMEX
object wrapping the REST and WebSocket APIs.
BitMEX.buy()
, BitMEX.sell()
, BitMEX.open_orders()
and the like.Develop on Testnet first! Testnet trading is completely free and is identical to the live market.
BitMEX is not responsible for any losses incurred when using this code. This code is intended for sample purposes ONLY - do not use this code for real trades unless you fully understand what it does and what its caveats are.
This is not a sophisticated market making program. It is intended to show the basics of market making while abstracting some of the rote work of interacting with the BitMEX API. It does not make smart decisions and will likely lose money.
pip install bitmex-market-maker
. It is strongly recommeded to use a virtualenv.marketmaker setup
settings.py
and market_maker/
in the working directory.settings.py
to tune parameters.DRY_RUN=True
to test cost and spread.marketmaker [symbol]
BASE_URL
and start trading!This market maker works on the following principles:
bidPrice
and askPrice
of the quoted instrument to determine where to start quoting.settings.MAINTAIN_SPREADS
is set, the bot will start inside the current spread and work outwards.The following is some of what you can expect when running this bot:
2016-01-28 17:29:31,054 - INFO - market_maker - BitMEX Market Maker Version: 1.0
2016-01-28 17:29:31,074 - INFO - ws_thread - Connecting to wss://testnet.bitmex.com/realtime?subscribe=quote:XBT7D,trade:XBT7D,instrument,order:XBT7D,execution:XBT7D,margin,position
2016-01-28 17:29:31,074 - INFO - ws_thread - Authenticating with API Key.
2016-01-28 17:29:31,075 - INFO - ws_thread - Started thread
2016-01-28 17:29:32,079 - INFO - ws_thread - Connected to WS. Waiting for data images, this may take a moment...
2016-01-28 17:29:32,079 - INFO - ws_thread - Got all market data. Starting.
2016-01-28 17:29:32,079 - INFO - market_maker - Using symbol XBT7D.
2016-01-28 17:29:32,079 - INFO - market_maker - Order Manager initializing, connecting to BitMEX. Live run: executing real trades.
2016-01-28 17:29:32,079 - INFO - market_maker - Resetting current position. Cancelling all existing orders.
2016-01-28 17:29:33,460 - INFO - market_maker - XBT7D Ticker: Buy: 388.61, Sell: 389.89
2016-01-28 17:29:33,461 - INFO - market_maker - Start Positions: Buy: 388.62, Sell: 389.88, Mid: 389.25
2016-01-28 17:29:33,461 - INFO - market_maker - Current XBT Balance: 3.443498
2016-01-28 17:29:33,461 - INFO - market_maker - Current Contract Position: -1
2016-01-28 17:29:33,461 - INFO - market_maker - Avg Cost Price: 389.75
2016-01-28 17:29:33,461 - INFO - market_maker - Avg Entry Price: 389.75
2016-01-28 17:29:33,462 - INFO - market_maker - Contracts Traded This Run: 0
2016-01-28 17:29:33,462 - INFO - market_maker - Total Contract Delta: -17.7510 XBT
2016-01-28 17:29:33,462 - INFO - market_maker - Creating 4 orders:
2016-01-28 17:29:33,462 - INFO - market_maker - Sell 100 @ 389.88
2016-01-28 17:29:33,462 - INFO - market_maker - Sell 200 @ 390.27
2016-01-28 17:29:33,463 - INFO - market_maker - Buy 100 @ 388.62
2016-01-28 17:29:33,463 - INFO - market_maker - Buy 200 @ 388.23
-----
2016-01-28 17:29:37,366 - INFO - ws_thread - Execution: Sell 1 Contracts of XBT7D at 389.88
2016-01-28 17:29:38,943 - INFO - market_maker - XBT7D Ticker: Buy: 388.62, Sell: 389.88
2016-01-28 17:29:38,943 - INFO - market_maker - Start Positions: Buy: 388.62, Sell: 389.88, Mid: 389.25
2016-01-28 17:29:38,944 - INFO - market_maker - Current XBT Balance: 3.443496
2016-01-28 17:29:38,944 - INFO - market_maker - Current Contract Position: -2
2016-01-28 17:29:38,944 - INFO - market_maker - Avg Cost Price: 389.75
2016-01-28 17:29:38,944 - INFO - market_maker - Avg Entry Price: 389.75
2016-01-28 17:29:38,944 - INFO - market_maker - Contracts Traded This Run: -1
2016-01-28 17:29:38,944 - INFO - market_maker - Total Contract Delta: -17.7510 XBT
2016-01-28 17:29:38,945 - INFO - market_maker - Amending Sell: 99 @ 389.88 to 100 @ 389.88 (+0.00)
You can implement custom trading strategies using the market maker. market_maker.OrderManager
controls placing, updating, and monitoring orders on BitMEX. To implement your own custom
strategy, subclass market_maker.OrderManager
and override OrderManager.place_orders()
:
from market_maker.market_maker import OrderManager
class CustomOrderManager(OrderManager):
def place_orders(self) -> None:
# implement your custom strategy here
Your strategy should provide a set of orders. An order is a dict containing price, quantity, and whether the order is buy or sell. For example:
buy_order = {
'price': 1234.5, # float
'orderQty': 100, # int
'side': 'Buy'
}
sell_order = {
'price': 9876.5, # float
'orderQty': 100, # int
'side': 'Sell'
}
Call self.converge_orders()
to submit your orders. converge_orders()
will create, amend,
and delete orders on BitMEX as necessary to match what you pass in:
def place_orders(self) -> None:
buy_orders = []
sell_orders = []
# populate buy and sell orders, e.g.
buy_orders.append({'price': 998.0, 'orderQty': 100, 'side': "Buy"})
buy_orders.append({'price': 999.0, 'orderQty': 100, 'side': "Buy"})
sell_orders.append({'price': 1000.0, 'orderQty': 100, 'side': "Sell"})
sell_orders.append({'price': 1001.0, 'orderQty': 100, 'side': "Sell"})
self.converge_orders(buy_orders, sell_orders)
To run your strategy, call run_loop()
:
order_manager = CustomOrderManager()
order_manager.run_loop()
Your custom strategy will run until you terminate the program with CTRL-C. There is an example
in custom_strategy.py
.
By default, the BitMEX API rate limit is 300 requests per 5 minute interval (avg 1/second).
This bot uses the WebSocket to greatly reduce the number of calls sent to the BitMEX API.
If you are quoting multiple contracts and your ratelimit is becoming an obstacle, please email support with details of your quoting. In the vast majority of cases, we are able to raise a user's ratelimit without issue.
Common errors we've seen:
TypeError: __init__() got an unexpected keyword argument 'json'
requests
. Run pip install -U requests
to update.This module supports Python 3.5 and later.
BitMEX has a Python REST client and websocket client.