OpenDAX v4 docs

ArkeBot market maker

About market-making

OpenDAX v4 opens the ability to boost liquidity provisioning via market-making bots and connecting to the Yellow Network.


Every trading pair comprises a market with its own liquidity.
Liquidity determines how easily and fast any trader can buy or sell an asset without substantially impacting the price. In other words, the more orders and order volumes in the order book, the higher liquidity, and a trader can trade instantly at a fair price.
High liquidity for traders results in:
  • fair price (thanks to supply/demand balance)
  • low slippage (the change in price after the order is met - emerges in markets when a large demand or supply impacts the price. In a highly liquid market, even a large order is unlikely to impact the price much)
  • rise of order book depth - more orders in the order book are more informative and appealing for traders
  • price swing mitigation - as with slippage, higher liquidity makes drastic price change less probable
There are other benefits, but from the exchange business point of view, the crucial one is the overall attractiveness of the market and the exchange.

Market making

Market making is a dedicated activity aimed to boost liquidity and improve market indicators: depth, bid-ask spread, volume, and others.
Openware maintains ArkeBot, an open-source solution for automated market-making and liquidity provisioning.

Liquidity aggregation

Also, connecting to the Yellow Network and aggregating liquidity will dramatically improve the market indicators on the exchange. But the reasonable step would be to implement market-making solutions first so that the exchange had better liquidity and thus better fees level in peer-to-peer agreements with other brokerages.
OpenDAX v4 will be able to connect to the Yellow Network after its production release.

Market maker

Arke is an open-source trading bot, developed and maintained by Openware.
Alongside other automation functions, it can perform local market-making operations as well as import liquidity from a source exchange to yours.
Here we suggest a low-risk strategy for Arke to provide liquidity to your exchange: Orderback.
Note, you need to have funds in your wallet on Binance (how much funds depends on your liquidity expectations).
To launch the Orderback market-making strategy on your exchange:

1. Get the source and target exchange APIs

1.1 Get Binance account API key

Create a Binance account, complete KYB, and top-up an entity account on Binance (or other exchange you like - see Arke configs below).
Go to the account API Management, create, and save an API key with Secret.
With this account, Arke will be able to copy orders to your target exchange and orderback to Binance when orders are met.

1.2 Get OpenDAX account API key

1.2.1 Take Gotrue API key and JWT from request (browser dev tools):
  • Dev tools → Application tab → Storage/LocalStorage/https://… → Key app_config Here copy the goTrueAnon parameter value.
  • Dev tools → Application tab → Storage/LocalStorage/https://… → Key session Here copy the JWT from the access_token parameter value.
1.2.2 Using curl '' -X PUT -H 'apikey: goTrueAnon' -H "Content-Type: application/json" -H "Authorization: Bearer access_token" -d '{"password":"your_password"}' you can set password for the user.
Make sure you’ve replaced the exchange URL before /api/v1/auth/user, then goTrueAnon, access_token, and entered your password instead of your_password.
The account email and this password will be used to configure Arke.

2. Get Arke

You can find Arke on GitHub.
Put it on the desired cloud or another server.

3. Configure Arke

Configure your trading strategies in the file config/strategies.yml :

3.1 Account config

You need to configure at least two accounts: for Binance and for your OpenDAX v4 exchange (see the example below).
ID identifying the account (must be unique)
Name of exchange driver (supported values are: opendax_v4, finex, binance, bitfinex, kraken, and others)
Flag to extend logs verbosity, valid values are: true or false
Base URL of the exchange API
WebSocket URL of the exchange.
You can omit this parameter in an OpenDAX v4 account configs - Arke will fetch it automatically. See the example below
API key.
For the v4 account configs, this is the market-maker account email. This account will post orders on the exchange
Secret key is the password set by the command in 1.2.2 (see above)
Minimum delay to respect between requests to this exchange (in second)
To save your resources, we suggest setting the debug field to false. But before doing this, you definitely want to make a test run, where you should use true and examine detailed logs.
Accounts configs example
log_level: INFO # Level of Arke log info
- id: binance_source # Unique account id of the source
driver: binance # One of supported sources drivers
delay: 1 # Delay of balance information update
host: "" # Your source URL. Ommitable for binance
ws: "wss://" # Your source WebSocet URL. Ommitable for binance
key: "" # API key from source (not required for copy strategy)
secret: "" # Secret from API key from source (not required for copy strategy)
- id: example-account1 # Unique account id of the target
driver: opendax_v4 # Only supported target driver
key: "[email protected]" # market-maker account email, required
secret: "123456" # password, required
host: "https://opendax.instance" # Your target URL
Arke already has configured host and ws parameters for Binance, so you can omit them. As well as the debug field, which you've already set in the target exchange account.

3.2 General configuration

Configure a strategy for each market: BTCUSDT, ETHUSDT, and so on.
Here we talk about the Orderback strategy, but ArkeBot suggests other ones too. Also, you can run multiple strategies.
Please, learn more on GitHub.
ID of the strategy (arbitrary string, must be unique)
Strategy type (valid: orderback, fixedprice, microtrades, copy)
Flag to extend logs verbosity, valid values are: true or false
Flag to enable the strategy, could be: true or false (if you have multiple strategies, you can turn some of them off)
Orderbook update period (in seconds), must be sufficient: remember about delay in accounts and rate limit in Finex
(optional) Random delay which will be added to the static period
(optional) Forex conversion rate configuration to apply to price (see below)
General strategy configs example
- id: BTCUSDT-orderback # Name of a strategy
type: orderback # Type of the strategy
debug: false # true to see extra Arke logs
enabled: true # true to run this strategy after Arke (re)startgit
period: 90 # Period of order book refresh

3.3 Orderback strategy

The orderback strategy uses a source exchange market to create an orderbook on a target market, and has the ability to order back the liquidity from the source exchange market.
Some preset behaviors of ArkeBot:
  • The depth of the created orderbook is defined by the number of orders on each side with the levels_count parameter and the price difference between orders with the levels_size parameter.
  • The levels_size parameter defines the price range between levels. Arke creates an order for each level, aggregating the volume of all source orders within the range. The levels_count parameter defines how many times Arke has to repeat this operation for each side and create an order on the target exchange.
  • If in the source orderbook there are no orders on a required level (your levels_price_step is less than the actual price steps), Arke will create in the target orderbook on this level one order with a minimal amount.
  • As soon as an order on a target exchange is matched, the strategy creates an order on the source exchange with the matched amount and the same price without the spread (and you will lose the fee). If the spread configured is higher than the exchange's fee, the P&L will be positive.
Spread for bids side (in percentage)
Spread for asks side (in percentage)
Sum of amounts of orders on ask side
Sum of amounts of orders on bid side
Limit bids and asks amount according to the source account balances (default: false)
Ratio for sum of amounts of orders on ask side based on base currency balance
Ratio for sum of amounts of orders on bid side based on quote currency balance
Minimum price difference between orders
Number of orders for each side
Minimum price difference between levels
Function to use to calculate levels size: constant, linear, exp (default: constant)
Maximum size for one order. If more liquidity is needed for one level, several orders of this size will be created
Side where orders will be created (valid: asks, bids, both)
Flag for enabling orderback. Can be: true or false
The amount of the trade must be higher than this value for the order back to be created, otherwise the trade will be ignored (since Binance will reject the orderback less than, for example, $10 in base currency)
The time to wait incoming trades before triggering the order back, default 1 sec
The order back type it will be created, could be: limit or market, default is market
You can omit minor parameters. Please, remember that in order not to lose on fees, you should include the fees in the price (spread parameters).
Orderback configs example
spread_bids: 0.02 # Percentage difference from the best price on buy side
spread_asks: 0.02 # Percentage difference from the best price on sell side
limit_asks_base: 10 # The amount of base currency that will be placed for sale in the order book, if have enough balance
limit_bids_base: 10 # The amount of base currency that will be placed for buy in the order book, if have enough balance in quote currency equivalent
levels_size: 0.5 # Minimum price difference between price points
levels_count: 5 # Maximum amount of price points that may be created
side: both # Side, ask, bid or both to apply the strategy on
enable_orderback: true # True to perform order back on the source, if on target exchange orders was matched with this strategy
min_order_back_amount: 0.0002 # The minimum amount of tokens bought or sold on target exchange at the same price point in a period of a second to perform an order back (made to ignore microtrade strategy)

3.4 Target configuration

The target and source configurations need to be defined for each strategy.
ID of account which will place order on target exchange
ID of the market as it is on the target exchange

3.5 Sources configuration

ID of account which will place order on target exchange
ID of the market as it is on the source exchange
Target and source configs example
account_id: example-account1 # Unique account id, from the account section, that will be used as a target (your exchange)
market_id: btcusdt # Market pair code in lowercase, from your target exchange
- account_id: binance_account # Unique account id, from the account section, that will be used as a source
market_id: BTCUSDT # Market pair code in uppercase, from you source exchange
Note that target market_id may differ from the source one. In this case, you should set up fx parameters to define the conversion rate.
See the next chapter.

3.6 Forex conversion rate configuration (optional)

Set up a forex parameter if you need to convert currencies' for market-making. For example, you want to fetch BTCUSDT orderbook from Binance, but create from it MATICUSDT orderbook on your exchange. You need to convert BTCs to Matics.
There are two options:
  • fixed forex rate (“static” type) you define yourself
  • dynamic rate (“fixer” type) relies on dynamic prices rate from
To set up the “fixer” type parameter, you need a license to fetch dynamic conversion rates from
Detail of the fx section to configure for a strategy:
The type of the forex class to use: “static“ for a fixed conversion rate, “fixer” for dynamic rate fetched from
Static value of the rate to apply to prices of the strategy (this parameter is used for the “static” type, the parameters below are for the fixer type)
Fixer API key
Currency code
Currency code
Refresh period in seconds, default: 3600
Enable HTTPS communication (default true)
Dynamic forex rate configs example
type: fixer # Set Fixer for dynamic conversion rate take from forex
api_key: # Your key (without brackets) from to request conversion rate
currency_from: USD # Source exchange currency you are converting from
currency_to: KRW # Target exchange currency you are converting to
period: 3600 # Period of converting rate refresh
account_id: example-account1 # Unique account id, from the account section, that will be used as a target (your exchange)
market_id: btckrw # Market pair code in lowercase, from your target exchange
- account_id: binance_source # Unique account id, from the account section, that will be used as a source
market_id: BTCUSDT # Market pair code in uppercase, from you source exchange

4. Install dependencies

Run the command:
bundle install

5. Run Arke

Run the command:
bundle exec ./bin/arke start

Example of Arke configuration

Note that in the example, we configure one strategy, for one market, via Binance exchange.
log_level: INFO
- id: example-account1
driver: opendax_v4
debug: false
host: "https://some.opendax.instance/api/"
key: "71e3c1bc4b635f2abe068b5e21d5aa60874687677523d904abd2e05179fad222"
delay: 0.01
- id: binance-account
driver: binance
#host and ws are omitted since the driver has these parameters already
key: ""
secret: ""
delay: 0.015
- id: BTCUSDT-orderback
type: orderback
debug: false
enabled: true
period: 90
spread_bids: 0.005
spread_asks: 0.005
limit_asks_base: 10
limit_bids_base: 10
levels_size: 0.5
levels_count: 5
side: both
enable_orderback: true
min_order_back_amount: 0.0002
account_id: example-account1
market_id: btcusdt
- account_id: binance-account
market_id: BTCUSDT

Attention points

Please, consider the following cautions:
  • You should monitor your Binance (or whatever source) and OpenDAX v4 accounts balances. Obviously, Arke will be able to create orders copied from Binance on v4 only if you have sufficient balance. And similarly, it has to be enough tokens on your Binance balance to post orderback's orders on Binance.
When testing Arke on Goerli testnet v4 instance, you can update your testnet v4 balance via the Supabase admin panel.
  • You should better test the strategy configurations first. For testing Orderback, you can use another your exchange (if you have one).
  • You can easily start testing with a Copy strategy (without orderbacks): use your Binance account and your OpenDAX v4 instance on the Goerli testnet. Arke will copy orders from Binance to your exchange. Orderback in this case is impossible.
You can also use Binance Testnet with the driver: binance parameter, but you need to specify host and ws parameters. Still, as binance.testnet doesn’t allow you to directly top-up it’s account, you can’t test Orderback strategy with this source.
  • delay value affects Arke’s busyness and resource demand. For example, if you have many markets and a short delay, the number of calls will rise spectacularly.
  • period value must be sufficient, otherwise, Arke will start a new strategy run before finishing the previous one. This will lead to undesired orderbook twists.
  • Testing parameters may differ: for example, you should use debug: true on testings.
  • Setting spread allows you to avoid losses on fees and define your profit on market-making.
  • You need to monitor your balance on your target exchange, and your Binance balance. Arke doesn’t transfer funds between exchanges, but copies orders from Binance to your exchange, and then makes orderback (copies back) for orders that are executed on your exchange. This approach helps to keep your balance but doesn’t give a guarantee since trading may exceed it.
  • Get a deeper understanding of Arke’s work and troubleshoot (see Arke troubleshooting).