Key Concepts
Strategy folder¶
Each strategy is contained in its own folder, with the strategy name as the folder name:
- __init__.py
This file allows one to expose certain variables to all modules inside the package by placing the strategy object under__all__
field. - {strategy name}.pxd
This file contains type declaration about some variables that are specified in the{strategy name}.pyx
file. - {strategy name}.pyx
This file contains a bulk of functions that define the behavior of strategy. The__init__
function defines the variables that were declared in the{strategy name}.pxd
file and initializes fields inherited fromStrategyBase
class. All other functions can be customized depending on the behavior that the developer wants to create. A function that is especially important isformat_status()
because this function chooses which data to render whenstatus
is called on the client. - {strategy name}_config_map.py
This file handles prompting user for config values when the strategy is called. Each key value of theconfig_map
has aConfigVar
assigned where developer can specify the prompt and assign validators to check for accepted values. - start.py
Thestart()
function is what gets called when user calls the strategy on client side. This function should handle initialization of configs by callingconfig_map
, set market names and wallets, and eventually execute the strategy.
StrategyBase class¶
All strategies extend the StrategyBase
class. This class allows extraction of logic that would be repetitively written in all strategies otherwise.
- Event listeners : The client’s prompt eventually leads to changes on server with the help of event listeners. Depending on action taken by the client, corresponding event listeners are called to execute the appropriate job.
- Data frames : The base class handles creation of data frames for market status,
market_status_data_frame()
, and wallet balance,wallet_balance_data_frame()
, so it is easy for developers to create and access about particular markets.
The base class also contains methods that are meant to be freshly implemented when new strategies are created.
logger()
: set up logger for strategy sessionformat_status()
: define format of status that will be rendered on Hummingbot client
To assist in the development of custom strategies, there are many overridable functions that respond to various events detected by EventListeners.
c_did_create_buy_order()
: called in response to anorder_created_event
c_did_create_sell_order()
: called in response to anorder_created_event
c_did_fail_order()
: called in response to anorder_filled_event
c_did_create_sell_order()
: called in response to anorder_failed_event
c_did_cancel_order()
: called in response to acancelled_event
c_did_expire_order()
: called in response to anexpired_event
c_did_complete_buy_order()
: called in response to anorder_completed_event
c_did_complete_sell_order()
: called in response to anorder_completed_event
c_did_fail_order_tracker()
: called in response to anorder_failed_event
c_did_cancel_order_tracker()
: called in response to anorder_cancelled_event
c_did_expire_order_tracker()
: called in response to anorder_expired_event
c_did_complete_buy_order_tracker()
: called in response to anorder_completed_event
c_did_complete_sell_order_tracker()
: called in response to anorder_completed_event
Market class¶
The ExchangeBase
class contains overridable functions that can help get basic information about an exchange that a strategy is operating on, which can include the balance, prices, and order books for any particular asset traded on the exchange.
c_buy()
: called when the user wants to place a buy orderc_sell()
: called when the user wants to place a sell orderc_cancel()
: called when the user wants to place an order cancellationc_get_balance()
: called to get the user’s balance of assetsc_get_available_balance()
: called to get the user’s available balance of assetsc_withdraw()
: called when the user wants to withdraw assetsc_get_order_book()
: called to get the order book for any particular assetc_get_price()
: called to get the price for any particular assetc_get_order_price_quantum()
: called to get the quantum price of an orderc_get_order_size_quantum()
: called to get the quantum size of an orderc_quantize_order_price()
: called to quantize the price of an orderc_quantize_order_amount()
: called to quantize the amount of an orderc_get_fee()
: called to get the fee for exchange use
Additionally, this strategy leverages the OrderTracker
listener object, in order to check if buy/sell orders have been filled or completed, the user has enough balance to place certain orders, and if there are any order cancellations. The HummingbotLogger
object is also used to log the specific events when they occur.
Configuration¶
Important commands¶
Important commands on Hummingbot client:
status
: Renders information about the current strategy and markets. The information that you want displayed can be customized withformat_status()
function in{strategy name}.pyx
config
: Prompts users asking for details about strategy set up (e.g. token, market name, etc). Prompts can be modified in{strategy name}_config_map.py
Exposing new strategy to Hummingbot client¶
The strategy name is made known to the client automatically in hummingbot/client/settings.py under STRATEGIES
variable. There should also be a template file that contains config variables and its documentation in the hummingbot/templates directory. The naming convention for this yml file is conf_{strategy name}_TEMPLATE
.
Setting question prompts for strategy parameters¶
Strategy parameters can be set in the config_map
file. Each parameter (represented as dictionary key) is mapped to a ConfigVar
type where developer can specify the name of the parameter, prompts that will be provided to the user, and validator that will check the values entered.