BitMEX client library for Elixir.
See the online documentation for more information.
Add :bitmex to your list of dependencies in mix.exs:
def deps do
[{:bitmex, "~> 0.2"}]
endAdd your app's api_key and api_secret to config/config.exs:
config :bitmex, api_key: ""
config :bitmex, api_secret: ""
config :bitmex, test_mode: false
Set test_mode to true if you want to simulate your app using BitMEX Testnet instead of the production version.
You may call methods in modules Bitmex.Rest.* (eg. Bitmex.Rest.OrderBook) to access the REST API.
View the Hex Documentation and BitMEX API Explorer for a full list of endpoints and return types.
Get the current position:
Bitmex.Rest.Position.get()Get all your open orders:
Bitmex.REST.Order.get_open()Create a order:
params_bi = %{"symbol" => "XBTUSD", "side" => "Buy", "orderQty" => 15,
"ordType" => "Market"}
Bitmex.Rest.Order.create(params_bi)Create a bulk order:
p1 = %{"symbol" => "XBTUSD", "side" => "Buy", "orderQty" => 15,
"price" => 4000.1, "ordType" => "Limit"}
Bitmex.Rest.Order.create_bulk(%{orders: [p1, p1]})You may query the rate limit counter using Bitmex.Rest.RateLimiter.remaining(). It automatically logs the rate limit info responded from your last REST API request.
To enable WebSocket subscriptions, use Bitmex.WS module and override the handle_response function:
defmodule Caravan.WS.MessageHandler do
use Bitmex.WS
def handle_response(resp), do: Caravan.WS.process(resp)
end
defmodule Caravan.WS do
require Logger
import Task.Supervisor, only: [start_child: 2]
# API
def start_link(opts \\ []) do
Agent.start_link(fn -> [] end, opts)
end
def process(resp) do
Agent.cast(__MODULE__, fn _ ->
start_child(TemporaryTaskSup, fn -> handle_response(resp) end)
[]
end)
end
# Your callbacks
@doc """
Handles order book data.
"""
def handle_response(%{"table" => "orderBook10", "action" => action,
"data" => datums}) do
# ...
end
@doc """
Handles position data.
"""
def handle_response(%{"table" => "position", "action" => action,
"data" => datums}) do
# ...
end
@doc """
Handles margin data.
"""
def handle_response(%{"table" => "margin", "action" => _action,
"data" => [_datum]}) do
# ...
end
@doc """
Handles order data.
"""
def handle_response(%{"table" => "order", "action" => action,
"data" => datums}) do
# ...
end
@doc """
Handles table subscriptions.
"""
def handle_response(%{"request" => %{"op" => "subscribe"},
"subscribe" => table, "success" => true}) do
Logger.info "Subscribed #{table}"
# ...
end
@doc """
Handles unexpected data.
"""
def handle_response(resp) do
Logger.warn inspect(resp, limit: 500)
# ...
end
end