
Arke is a trading bot for creating liquidity and market depth on exchanges that built with the use of Openware stack. That bot has a set of strategies that implement different business logic. Arke uses API keys to connect to the exchange. Anyone who has an account on the exchange can create API keys and start Arke to provide liquidity.
One strategy instance can work only with one market pair. To market make more than one market pair you will need to create a strategy per a market pair. If you want, you can apply a few strategies to a one market pair. Every strategy should use a separate Arke instance for each set of strategies. If you overload Arke instance with lots of strategies it will cause troubles and errors in strategy executions.
Note: You should know that if you stopping Arke, orders that were created remaining in the order book until they will be canceled manually or executed.
Prerequisites
Keywords
Go to the desired directory on your VM (PC), open the terminal, and run the next command to copy the source code:
git clone [email protected]:openware/arke.git
Open a terminal in the Arke folder and to run the next command to install all dependencies:
bundle install      #Once per Arke clone
If the execution was successful, run the next command to start the Arke:
bundle exec ./bin/arke start    #To start Arke
Note: To successfully start Arke you will need to configure a strategy.
Strategy can be configured in the strategies.yml file that is located in /arke/config/ directory. You can configure more than one strategy in the file and can set a connection with target and source exchanges. Below you can find descriptions of major sections and parameters specification of the configuration file.
That parameter used to show logs of Arke's activities. Depends on the details of the log you want to get from Arke, you can use one of the few parameter values. Each next log level contains details of the previous log level as you can see below.
FATAL > ERROR > WARN > INFO > DEBUG
Example of account configuration
log_level: DEBUG
Under log_level parameter you need to configure accounts that will be used by Arke to execute different strategies.
Module accounts used to configure connections with exchanges that you need for your strategies. The first account you would want to set up will be account Arke of your platform (the target exchange), which will connect to Peatio and Barong API using rubykube driver.
To configure a connection with the target exchange you need to create an API key pair. The key and secret should be created on your platform by creating an account for Arke, enabling 2FA, and creating an API key from a Profile tab if use BaseApp frontend or with Barong REST-API.
Note: Save a secret in a safe place because it displays only once. Disabling 2FA or sealing Vault (secure store) leads to the inactivation of API key pairs.
Arke supports the next trading platforms binance, bitfinex, kraken. Those platforms can be used as a source exchange for your strategy.
An account that is using third-party source exchange does not require host or ws parameters as they are predefined, key and  secret are required only if you are going to use a strategy that interacts with account balance on the target exchange (e.i. the Orderback strategy). To configure the Orderback strategy, you will need to create an API key pair on the source exchange. 
| Field | Description | 
|---|---|
| id | That parameter is used to identify an exchange account. That parameter must be unique for the strategies.ymlfile. | 
| driver | That parameter is defining an exchange driver that allows Arke to communicate with an exchange. Arke supports the next values: rubykube,binance,bitfinex,kraken. Therubykubedriver requires additionally two parameters to specify the target exchange:hostandws. | 
| debug | That parameter used to extend log information. That parameter supports the next valid values: trueorfalse. | 
| finex | That parameter is defining if arke will use Finex API to create and delete orders trueor Peatio APIfalse. Set it according to the trading engine that is used by the platform | 
| host | It is a base URL of the target exchange that is used for API calls. | 
| ws | It is a WebSocket URL of the target exchange. | 
| key | It is a public key of the API key pair. | 
| secret | It is a private key (secret key) of the API key pair. | 
| delay | That parameter specifies minimum delay to respect between requests to corresponding exchange, in second (delay between creat/delete orders calls). You can set up less than a second delay. | 
Example of account configuration
accounts:
- id: demo
  driver: rubykube
  debug: false
  finex: true
  host: "https://demo.openware.com"
  ws: "wss://demo.openware.com"
  key: ""
  secret: ""
  delay: 0.1
- id: binance 
  driver: binance
  debug: true
  key: ""
  secret: ""
  delay: 1
# If you need you can add more accounts.
Strategies module consists of the main configuration, parameter, and other sub-modules. Arke supports the next strategies: Copy, Orderback, Fixedprice, Microtrades and Microtrades-copy. Strategies can be tuned for different markets with the use of configuration. Below you can find a description of the main configuration parameters.
| Field | Description | 
|---|---|
| id | It is an identifier of a strategy. This parameter must be unique. | 
| type | That parameter specifies a strategy type. Arke supports the next strategies: copy,orderback,fixedprice,microtradesandmicrotrades-copy. | 
| debug | That parameter used to extend log information. That parameter supports the next valid values: trueorfalse. | 
| enabled | That parameter used to enable or disable a strategy. Use the truevalue to enable strategy or thefalsevalue to disable it. | 
| period | That parameter used to set a delay between the strategy iterations. Copy strategy gets order book of target exchange, compare with a current order book on the source exchange, applies required changes by deleting old orders and creating new orders, then wait specified Periodand repeat the process. Microtrades strategy usePeriodas a delay between performed trades. Remember about the delay in accounts and the rate limit in Peatio/Finex. Value specified in seconds. | 
| period_random_delay | That parameter adds a random delay to periodparameter. It helps to make it more difficult to recognize the pattern for malicious users. Value specified in seconds. | 
| fx | That is a sub-module that provides a Forex conversion rate that can be applied to the price of orders generated by the strategy. Below you can find a description of fxsub-module parameters. | 
fx sub-moduleThis module mostly used with Copy strategies. When the source exchange has a marker pair with the same base currency but with the different quote currency as on the target exchange, the fx sub-module allows doing a quote conversion. So, that sub-module helps to create liquidity on market pairs of the target exchange that does not exist on other supported platforms.
The fx sub-module can be used with the static conversion rate. In that case, a currency that should be converted will always have the same conversion rate. Below you can find the required parameters for static conversion rate.
| Field | Value | Description | 
|---|---|---|
| type | "static" | That parameter used to specify the type of conversion rate. To apply a static conversion rate in the fxsub-module use the next value: "static". | 
| rate | float | That parameter used to specify the rate of conversion. The rate value applies to the prices of the strategy. | 
Example of static conversion configuration
  fx:
    type: static
    rate: 123
In the case, you want the conversion rate, to be dynamic you must use additional parameters. For dynamic conversion rate you will need to create an API key on the Fixer. Below you can find required parameters for dynamic conversion rate.
| Field | Value | Description | 
|---|---|---|
| type | "fixer" | That parameter used to specify the conversion rate type. To apply a dynamic conversion rate in the fxsub-module use the next value: "fixer". | 
| api_key | string | That parameter used to set your Fixer API key. | 
| currency_from | string | The currency to which exchange rates are relative to. (If 1 USD = X EUR, USD is the base currency). | 
| currency_to | string | The currency an amount is converted to. (If 1 USD = X EUR, EUR is the target currency) | 
| period | seconds | That parameter used to specify refresh rate in seconds (how often you pull a conversion rate from the Fixer. The default value is 3600 if this parameter is not set. | 
Example of dynamic conversion configuration
  fx:
    type: fixer
    api_key: ""
    currency_from: EUR
    currency_to: USD
target and source sub-modulesThose sub-modules define which account will be used as a target exchange and which will be used as a source exchange. If you are setting rubykube driver as a target or source you should type market_id in lowercase. For other drivers market_id must be uppercase.
| Field | Description | 
|---|---|
| account_id | It is an ID of an account that was configured by you in the accountsmodule. Arke will use that account as a target exchange and will place orders on it. | 
| market_id | It is an ID of the market on the target exchange on which we apply the strategy. | 
Example of target configuration*
  target:
    account_id: demo
    market_id: btcusdt
| Field | Description | 
|---|---|
| account_id | It is an ID of an account that was configured by you in the accountsmodule. Arke will use that account as a source exchange and will fetch the data from it. | 
| market_id | It is an ID of the market on the source exchange from which we will fetch data. | 
Example of source configuration*
  sources:
  - account_id: binance
    market_id: BTCUSDT
These sub-modules monitors orders on an account, compare prices with a source exchange and cancel those which are too far from current orderbook offers on the source.
It is a security in case the strategy which creates the market crash or has a defect.
| Field | Description | 
|---|---|
| spread_bids | Spread to apply on bids side (in percentage) | 
| spread_asks | Spread to apply on asks side (in percentage) | 
The spread applied to circuitbreaker sub-modules should be lower than the spread used by the strategy creating the order book.
parameters sub-moduleParameters sub-module contains parameters used to define a certain strategy configuration.
This strategy uses the order book data from a source exchange, processed the data with strategy configurations, and populates the order book of a target exchange with orders. Copy strategy doesn't do trades it only manages the order book of the target exchange.
The Copy strategy parameters are generic for the rest of the strategies. Other strategies use the same parameters plus custom ones.
| Field | Description | 
|---|---|
| spread_bids | Defines a spread to be applied to the best bid from the target exchange. It means that the price of the best bid on the target exchange will be lower than the price of the best bid on the source exchange. You can use that parameter to include the trading (and withdrawal) fee if you want to use the Orderback strategy. Spread must be set in a decimal format | 
| spread_asks | Defines a spread to be applied to the best ask from the target exchange. It means that the price of the best ask on the target exchange will be higher than the price of the best ask on the source exchange. You can use that parameter to include the trading (and withdrawal) fee if you want to use the Orderback strategy. Spread must be set in a decimal format | 
| limit_asks_base | Defines the max amount of base currency that Arke can place for sale in the order book. For example, for BTC/USD pair if you set 10 it means that amount of all orders for sale will be equal/less than 10 BTC. | 
| limit_bids_base | Defines the max amount in a base currency equivalent that can be placed for buy in the order book by Arke. For example, for BTC/USD pair if you set 10 it means that equivalent of all orders to be created equal/less than 10 BTC. | 
| levels_size | Defines a minimum price difference between orders. Arke process orders from the source exchange and populate orders with applied parameter on the target exchange. | 
| levels_count | Defines price levels quantity to be created on the asks and bids sides. For example, if you set 10, Arke will create 10 price levels on the bid side and 10 price levels on the ask side. This parameter must be an integer. | 
| max_amount_per_order | Defines a maximum amount (in base currency) to be placed in a buy/sell order. If the current market situation requires more liquidity at a certain price level, Arke creates additional orders with a max amount to fulfill the required liquidity at a certain price level. | 
| side | Defines a side/sides of the order book to populate it with orders. That parameter supports three valid values: asks,bids,both. If you chooseasksorbids, Arke will populate only one side of the order book. To populate the order book with asks and bids use the valueboth. | 
Below is an example of Copy strategy
strategies:
- id: copy
  type: copy
  debug: false
  enabled: true
  period: 30
  params:
    spread_bids: 0.003
    spread_asks: 0.003
    limit_asks_base: 40
    limit_bids_base: 40
    max_amount_per_order: 10
    levels_size: 1
    levels_count: 10
    side: both
This strategy behaves like the Copy strategy and provides the ability to order back an amount on the source exchange market. Orderback strategy takes place in the case Arke order on the target exchange was matched with a user order. As soon as an order is matched, the strategy creates an order on the source exchange with the matched amount and the same price without the spread. This way if the spread configured is higher than the exchange fee the P&L will be positive. Remember to add generic parameters (parameters that were specified in the Copy strategy description) to the Orderback strategy. Orderback performs with a 1-sec delay this parameter is not configurable (but it can be changed in the source code of Arke). During the 1-sec delay, Arke accumulates trades and after 1 sec Arke creates buyback order/s on the source exchange. For the same price trades, Arke creates one buyback order. If the price of trades were different Arke creates a corresponding amount of orders on the source exchange.
| Field | Description | 
|---|---|
| enable_orderback | That parameter used to enable or disable order-back feature. Use the truevalue to enable the order-back feature or thefalsevalue to disable it. | 
| min_order_back_amount | The amount of the trade must be higher than this value for the order back to be created, otherwise, the trade will be ignored. | 
Below is an example of the Orderback strategy
strategies:
- id: orderback-BTCUSDT
  type: orderback
  debug: false
  enabled: true
  period: 90
  params:
    spread_bids: 0.005
    spread_asks: 0.005
    limit_asks_base: 10
    limit_bids_base: 10
    max_amount_per_order: 0.5
    levels_size: 0.5
    levels_count: 5
    side: both
    enable_orderback: true
    min_order_back_amount: 0.002
This strategy can be used to create random auto trades with a certain periodicity. Microtreades strategy employs a market order, it means that a microtrade executes against the best bid or the best ask.
| Field | Description | 
|---|---|
| linked_strategy_id | OPTIONAL. ID of strategy which will be referred (using for calculating price) | 
| price_difference | OPTIONAL. Change of calculated price (using if linked_strategy_idexist) | 
| min_amount | The minimum amount of order | 
| max_amount | The maximum amount of order | 
| min_price | OPTIONAL. Price for ask orders (using if linked_strategy_iddoesn't exist) | 
| max_price | OPTIONAL. Price for bid orders (using if linked_strategy_iddoesn't exist) | 
Example of Microtrades strategy configuration
strategies:
- id: microtrades-ETHUSD
  type: microtrades
  debug: true
  enabled: true
  period: 50
  period_random_delay: 10
  params:
    linked_strategy_id: copy-ETHUSD
    min_amount: 0.05
    max_amount: 0.30
This strategy creates random trades on a market with random amounts following the price of one or several sources. It is commonly used to create candles on a market with low activity.
| Field | Description | 
|---|---|
| min_amount | The minimum amount of order (defaults to market minimum order amount) | 
| max_amount | The maximum amount of order (defaults to 10 times the market minimum order amount) | 
| maker_taker_orders_delay | The time between maker and taker orders (defaults 0.02 sec) | 
| matching_timeout | Time in seconds to wait before canceling microtrades orders (defaults 1 sec) | 
Example of Microtrades-copy strategy configuration
strategies:
- id: microtrades-copy-ETHUSD
  type: microtrades-copy
  debug: false
  enabled: true
  period: 30
  period_random_delay: 10
  params:
    min_amount: 0.0001
    max_amount: 0.009
    maker_taker_orders_delay: 0.02
    matching_timeout: 1
This strategy copy trades from sources every sampling_ratio trade events. It will trigger a market order with the same amount as the trade being copied. The parameter max_slippage can protect against price slippage, it will consider the target order book and reduce the amount of the order accordingly to avoid price slippage. A random of 10% is applied to the sampling_ratio to make the strategy not deterministic. The period parameter doesn't affect this strategy since it only reacts to sources of trade events.
| Field | Description | 
|---|---|
| sampling_ratio | Number of trades to wait before copying one | 
| max_slippage | Maximum price slippage percent that allowed on a single trade triggered by the strategy | 
Example of Candle-Sampling strategy configuration
- id: BTCUSDT-candle
  type: candle-sampling
  debug: false
  enabled: true
  period: 1000
  params:
    sampling_ratio: 100000
    max_slippage: 0.001
This strategy is used to provide liquidity for a market of a stable currency. It creates buy and sell orders with a specified price range without using any source market.
| Field | Description | 
|---|---|
| price | The reference price for the strategy to create orderbook | 
| random_delta | Random value for deviation of the reference price (maximum deviation = random_delta / 2) | 
Example of Fixedprice strategy configuration
- id: fixedprice-BTCUSDT
  type: fixedprice
  debug: false
  enabled: false
  period: 30
  params:
    price: 17131
    random_delta: 1000
    spread_bids: 0.003
    spread_asks: 0.003
    limit_asks_base: 40
    limit_bids_base: 40
    max_amount_per_order: 4
    levels_size: 1
    levels_count: 10
    side: both
strategies.yml fileBelow you can find an example configuration with two strategies and two accounts.
log_level: INFO
#-----------------------------{ Accounts that Arke going to use }------------------------#
accounts:
- id: demo-1
  driver: rubykube
  debug: false
  host: "https://demo.openware.com"
  ws: "wss://demo.openware.com"
  key: ""
  secret: ""
  delay: 0.1
- id: demo-2
  driver: rubykube
  debug: false
  host: "https://demo.openware.com"
  ws: "wss://demo.openware.com"
  key: ""
  secret: ""
  delay: 0.1
- id: binance
  driver: binance
  debug: false
  key: ""
  secret: ""
  delay: 1
- id: bitfinex
  driver: bitfinex
  debug: false
  delay: 1
#--------------------------{ Copy strategy with a fixer for ETHJPY }---------------------# 
strategies:
- id: fixer-ETHJPY
  type: copy
  debug: false
  enabled: true
  period: 30
  fx:
    type: fixer
    api_key: ""
    currency_from: USD 
    currency_to: JPY
    period: 3600
  params:
    spread_bids: 0.003
    spread_asks: 0.003
    limit_asks_base: 40
    limit_bids_base: 40
    max_amount_per_order: 10
    levels_size: 1
    levels_count: 10
    side: both
  
  target:
    account_id: demo-1
    market_id: ethjpy
  sources:
  - account_id: bitfinex
    market_id: ETHUSD    
#---------------------------{ Microtrades-copy strategy with a fixer for ETHJPY }-----------------------------
- id: microtrades-copy-ETHJPY
  type: microtrades-copy
  debug: false
  enabled: true
  period: 80
  period_random_delay: 5
  params: 
    min_amount: 0.000001
    max_amount: 0.00009
  fx:
    type: fixer
    api_key: ""
    currency_from: USD 
    currency_to: JPY
    period: 3600
  sources:
  - account_id: bitfinex
    market_id: ETHUSD
  target:
    account_id: demo-2
    market_id: ethjpy
#-------------------------{ Orderback strategy for BTCUSDT }-----------------#
- id: orderback-BTCUSDT
  type: orderback
  debug: false
  enabled: true
  period: 90
  params:
    spread_bids: 0.005
    spread_asks: 0.005
    limit_asks_base: 10
    limit_bids_base: 10
    max_amount_per_order: 0.5
    levels_size: 0.5
    levels_count: 5
    side: both
    enable_orderback: true
    min_order_back_amount: 0.002
  target:
    account_id: demo-1
    market_id: btcusdt
  sources:
  - account_id: binance
    market_id: BTCUSDT
#---------------------------{ Microtrade strategy for BTCUSDT }-----------------------------
- id: microtrades-BTCUSDT
  type: microtrades
  debug: false
  enabled: true
  period: 80
  period_random_delay: 5
  params: 
    linked_strategy_id: orderback-BTCUSDT
    min_amount: 0.000001
    max_amount: 0.0019
  sources:
  - account_id: binance
    market_id: BTCUSDT
  target:
    account_id: demo-2
    market_id: btcusdt
#---------------------------{ Copy strategy for BTCUSDT }-----------------------------
strategies:
- id: copy-BTCUSDT
  type: copy
  debug: false
  enabled: true
  period: 20
  params:
    spread_bids: 0.02
    spread_asks: 0.02
    limit_asks_base: 0.05
    limit_bids_base: 0.05
    max_amount_per_order: 0.00025
    levels_size: 2
    levels_count: 10
    side: both
  target:
    account_id: demo-1
    market_id: btcusdt
  sources:
  - account_id: binance
    market_id: BTCUSDT
#----------------------------------{ Fixedprice strategy for BTCUSDT }---------------------------------#     
- id: fixedprice-BTCUSDT
  type: fixedprice
  debug: false
  enabled: true
  period: 30
  params:
    price: 17131
    random_delta: 1000
    spread_bids: 0.003
    spread_asks: 0.003
    limit_asks_base: 40
    limit_bids_base: 40
    max_amount_per_order: 4
    levels_size: 1
    levels_count: 10
    side: both
  target:
    account_id: demo-2
    market_id: btcusdt
#---------------------------{ Candle strategy for BTCUSDT }-----------------------------------
- id: BTCUSDT-candle
  type: candle-sampling
  debug: false
  enabled: true
  period: 1000
  params:
    sampling_ratio: 100000
    max_slippage: 0.0
  target:
    account_id: demo-2
    market_id: btcusdt
  sources:
  - account_id: binance
    market_id: BTCUSDT