Controllers are V2 strategy components that implement algorithmic trading logic. They run inside bot containers and manage complex, multi-step trading strategies by creating and supervising executors.Documentation Index
Fetch the complete documentation index at: https://condor.hummingbot.org/llms.txt
Use this file to discover all available pages before exploring further.
What Are Controllers?
Controllers are Python classes that:- Define trading strategy logic
- Process market data into a signal
- Create and manage executors
- Expose status and custom metrics
Built-in Controllers
Controllers ship under threecontroller_type categories. A selection of the built-ins:
controller_type | Controller (controller_name) | Description |
|---|---|---|
market_making | pmm_simple | Two-sided market making with fixed spreads |
market_making | pmm_dynamic | Market making with spreads driven by volatility |
directional_trading | bollinger_v1 | Bollinger Bands trend signal |
directional_trading | dman_v3 | Multi-level directional strategy |
directional_trading | macd_bb_v1 | MACD + Bollinger Bands signal |
generic | grid_strike | Grid of orders across a price range |
generic | arbitrage_controller | Cross-exchange arbitrage |
generic | xemm_multiple_levels | Cross-exchange market making |
generic | pmm_mister | Market making with position hold and profit protection |
directional_trading, market_making, and generic are controller types, not controller names. The exact set of built-ins tracks the Hummingbot repository — browse controllers/ for the current list.Controller Structure
A controller overrides two core methods fromControllerBase:
update_processed_data()— pull market data and compute a signal intoself.processed_datadetermine_executor_actions()— decide which executors to create or stop
DirectionalTradingControllerBase and MarketMakingControllerBase already implement determine_executor_actions() for you, so trend and market-making controllers typically only implement update_processed_data() and get_candles_config().
This is the actual bollinger_v1 directional controller:
self.market_data_provider (e.g. get_candles_df(...), get_price_by_type(...)), not from ad-hoc fetches.
Controller Configuration
Each controller instance is configured by a YAML file. This is a realpmm_simple config:
Deploying a Controller
The usual flow is: create one or more controller configs (in the dashboard Editor, in Telegram, or via the API), then deploy a bot that runs them.Via Telegram
Via API
Deploy a bot from existing controller config files (without the.yml extension). You can pass several configs to run multiple controllers in one bot:
Updating a Running Controller
Controllers can be reconfigured while running — no restart required. Only fields a controller marks as updatable are applied; everything else (for example, the connector name) is ignored on update. A config field is made updatable withjson_schema_extra:
ControllerBase.update_config(new_config) copies over only the fields flagged is_updatable. In Condor, push a live update from the dashboard Bots → Active tab by editing the config and saving.
Custom Controller Metrics
Overrideget_custom_info() to publish controller-specific fields alongside the standard performance report. The payload is sent over MQTT to the Hummingbot API, so keep it small (recommended < 1 KB):
Creating Custom Controllers
- Create a new Python file under
controllers/(in the matchingcontroller_typesubfolder) - Subclass the appropriate base —
ControllerBase,DirectionalTradingControllerBase, orMarketMakingControllerBase - Implement
update_processed_data()(anddetermine_executor_actions()if you subclassControllerBasedirectly) - Add a config file and deploy it

