roq-bitmex#

Supports#

Products

Spot

Futures

Options

Combos

Market Data

Reference Data

Market Status

Top of Book

Market by Price

Market by Order

Trade Summary

Statistics

Order Management

Create

Modify

Cancel

Cancel All

Auto-Cancel

Account Management

Positions

Funds

Installing#

$ mamba install \
      --channel https://roq-trading.com/conda/stable \
      roq-bitmex
$ mamba install \
      --channel https://roq-trading.com/conda/unstable \
      roq-bitmex

Using#

$ roq-bitmex \
      --name "bitmex" \
      --config_file $CONFIG_FILE_PATH \
      --client_listen_address $UNIX_SOCKET_PATH \
      --flagfile $ENVIRONMENT_FLAGFILE

Flags#

$ roq-bitmex --help
--exchange (bitmex)

Exchange identifier

--rest_uri (https://testnet.bitmex.com)

Exchange end-point

--rest_proxy

Proxy end-point

--rest_ping_freq (5s)

Ping frequency

--rest_ping_path (/api/v1/announcement/urgent)

Ping path

--rest_request_timeout (30s)

Request timeout

--rest_expires_timeout (1s)

Expires time-out

--rest_allow_order_request_pipeline (false)

Allow more than one in-flight order action?

--ws_uri (wss://ws.testnet.bitmex.com/realtime)

Exchange end-point

--ws_ping_freq (5s)

Ping frequency

--ws_request_timeout (15s)

Request time-out

--ws_cancel_on_disconnect (true)

Cancel orders on disconnect?

--ws_cancel_all_after (15s)

Cancel all after, requires cancel-on-disconnect

--encode_buffer_size (1048576)

Encode buffer size

--decode_buffer_size (10485760)

Decode buffer size

--mbp_allow_price_inversion (false)

Allow price inversion?

--oms_using_web_socket (false)

Use web-socket for order management?

Environments#

$ $CONDA_PREFIX/share/roq-bitmex/flags/prod/flags.cfg
# flagfile for the roq-bitmex gateway

--rest_uri=https://www.bitmex.com
--ws_uri=wss://ws.bitmex.com/realtime
$ $CONDA_PREFIX/share/roq-bitmex/flags/test/flags.cfg
# flagfile for the roq-bitmex gateway

--rest_uri=https://testnet.bitmex.com
--ws_uri=wss://ws.testnet.bitmex.com/realtime

Configuration#

$ $CONDA_PREFIX/share/roq-bitmex/config.toml

Important

The template will be replaced when the software is upgraded. Make a copy and modify to your needs.

symbols = [
  "^XBTUSD[A-Z]?([FGHJKMNQUVXZ][0-9]{2})?$",
  "^ETHUSD[A-Z]?([FGHJKMNQUVXZ][0-9]{2})?$",
  "^[.]XBTUSD[A-Z]?PI(8H)?$",
  "^[.]ETHUSD[A-Z]?PI(8H)?$"
]

[accounts]

  [accounts.A1]
  master = true
  login = "YOUR_BITMEX_API_KEY_GOES_HERE"
  secret = "YOUR_BITMEX_SECRET_GOES_HERE"
  symbols = [ ".*" ]

[users]

  [users.test]
  password = "1234"
  symbols = ".*"

  [users.trader]
  password = "secret"
  accounts = [ "A1" ]
  symbols = [ ".*XBT.*", ".*ETH.*" ]

[rate_limits]

  [rate_limits.global]
    type = "ORDER_ACTION"
    aggregate = true
    request_limit = 100
    monitor_period = "10s"
    ban_period = "5m"

Market Data#

Event

Stream

Messages

Comments

roq::ReferenceData

MarketData

instrument

roq::MarketStatus

MarketData

instrument

roq::TopOfBook

MarketData

quote

roq::MarketByPriceUpdate

MarketData

orderBookL2

roq::MarketByOrderUpdate

Unavailable

roq::TradeSummary

MarketData

trade

roq::StatisticsUpdate

MarketData

instrument

Statistics#

Type

Comments

SETTLEMENT_PRICE

(instrument) markPrice

OPEN_INTEREST

(instrument) openInterest

PRE_SETTLEMENT_PRICE

(instrument) indicativeSettlePrice

UPPER_LIMIT_PRICE

(instrument) limitUpPrice

LOWER_LIMIT_PRICE

(instrument) limitDownPrice

INDEX_VALUE

(instrument) fairPrice

FUNDING_RATE

(funding) fundingRate

FUNDING_RATE_PREDICTION

(funding) indicativeFundingRate

Order Management#

Event

Stream

Messages

Comments

roq::OrderUpdate

DropCopy

execution

roq::TradeUpdate

DropCopy

execution

Event

Stream

Messages

Comments

roq::OrderUpdate

OrderEntry

GET /api/v1/order

roq::TradeUpdate

OrderEntry

GET /api/v1/trade

Event

Stream

Messages

Comments

roq::CreateOrder

OrderEntry

POST /api/v1/order

roq::ModifyOrder

OrderEntry

PUT /api/v1/order

roq::CancelOrder

OrderEntry

DELETE /api/v1/order

roq::CancelAllOrders

OrderEntry

DELETE /api/v1/order/all

Event

Stream

Messages

Comments

roq::OrderAck

OrderEntry

/api/v1/order

Errors, only

Order Types#

Type

Comments

MARKET

Mapped to Market (JSON)

LIMIT

Mapped to Limit (JSON)

Time in Force#

Type

Comments

GTC

Mapped to GoodTillCancel (JSON)

Position Effect#

Note

Not supported

Execution Instructions#

Type

Comments

PARTICIPATE_DO_NOT_INITIATE

Mapped to ParticipateDoNotInitiate (JSON)

DO_NOT_INCREASE

Mapped to ReduceOnly (JSON)

Account Management#

Event

Stream

Messages

Comments

roq::PositionUpdate

DropCopy

position

roq::FundsUpdate

Unavailable

Event

Stream

Messages

Comments

roq::PositionUpdate

OrderEntry

GET /api/v1/position

roq::FundsUpdate

Unavailable

Streams#

Type

Comments

REST

Primary purpose

  • support order management

Each connection

  • supports a single account

Rate-limit avoidance is implemented by

  • not using HTTP pipelining

  • monitoring the following HTTP headers

  • x-ratelimit-limit

  • x-ratelimit-remaining

  • x-ratelimit-reset

  • blocking new requests for a duration of --rest_rate_limit_interval after receiving HTTP status 429 (too many requests)

Type

Comments

WebSocket

Primary purpose

  • live account updates, including orders and fills

Each connection

  • supports a single account

Type

Comments

WebSocket

Primary purpose

  • live market data

A single connection

Constraints#

  • The field clOrdID is a string and can not exceed 36 characters

Comments#

  • The exchange API’s do not appear particularly suitable for low latency trading:

    • Order action requests must be signed (which is expensive) and then sent over REST

    • REST response (order ack) could be lost possibly leaving the client in a situation where it must trigger timeout logic and/or issue operational alerts

    • Several WebSocket channels are used communicate order state possibly allowing for inconsistent order management by client