Implementation:Nautechsystems Nautilus trader RiskEngine Init
| Field | Value |
|---|---|
| sources | https://github.com/nautechsystems/nautilus_trader, https://nautilustrader.io/docs/ |
| domains | algorithmic trading, risk management, pre-trade checks, order rate limiting |
| last_updated | 2026-02-10 12:00 GMT |
Overview
Concrete tool for initializing the risk engine and configuring pre-trade risk checks provided by NautilusTrader.
Description
The RiskEngine is a Cython-based component that provides high-performance pre-trade risk validation. During initialisation it:
- Accepts a
PortfolioFacade,MessageBus,Cache,Clock, and an optionalRiskEngineConfig. - Sets the initial trading state to
ACTIVE. - Reads the
bypassanddebugflags from the config. - Parses and creates a submit throttler from
max_order_submit_rate(default:"100/00:00:01"= 100 per second). - Parses and creates a modify throttler from
max_order_modify_rate(default:"100/00:00:01"= 100 per second). - Loads per-instrument maximum notional settings from
max_notional_per_order. - Registers message bus endpoints:
RiskEngine.execute(for commands) andRiskEngine.process(for events). - Subscribes to
events.order.*andevents.position.*topics for event monitoring.
The companion RiskEngineConfig is a frozen configuration struct with five parameters controlling bypass mode, rate limits, notional caps, and debug logging.
Usage
The RiskEngine is created automatically by the NautilusKernel during TradingNode construction. Operators do not instantiate it directly but configure it through LiveRiskEngineConfig (which extends RiskEngineConfig) in the TradingNodeConfig.
Code Reference
Source Location
| Item | Path |
|---|---|
| RiskEngine class | nautilus_trader/risk/engine.pyx lines 77-199
|
| RiskEngineConfig | nautilus_trader/risk/config.py lines 21-46
|
Signature
cdef class RiskEngine(Component):
def __init__(
self,
PortfolioFacade portfolio not None,
MessageBus msgbus not None,
Cache cache not None,
Clock clock not None,
config: RiskEngineConfig | None = None,
) -> None: ...
class RiskEngineConfig(NautilusConfig, frozen=True):
bypass: bool = False
max_order_submit_rate: str = "100/00:00:01"
max_order_modify_rate: str = "100/00:00:01"
max_notional_per_order: dict[str, int] = {}
debug: bool = False
Import
from nautilus_trader.risk.engine import RiskEngine
from nautilus_trader.risk.config import RiskEngineConfig
I/O Contract
Inputs
| Parameter | Type | Required | Description |
|---|---|---|---|
| portfolio | PortfolioFacade |
Yes | Portfolio for position and exposure queries. |
| msgbus | MessageBus |
Yes | Message bus for command/event routing. |
| cache | Cache |
Yes | Cache for instrument, order, and position lookups. |
| clock | Clock |
Yes | Clock for timestamps and throttler timing. |
| config | None | No | Configuration. Defaults to RiskEngineConfig().
|
RiskEngineConfig Fields
| Field | Type | Default | Description |
|---|---|---|---|
| bypass | bool |
False |
If True, bypasses all pre-trade risk checks (not recommended for live trading).
|
| max_order_submit_rate | str |
"100/00:00:01" |
Maximum order submission rate as "count/timedelta". |
| max_order_modify_rate | str |
"100/00:00:01" |
Maximum order modification rate as "count/timedelta". |
| max_notional_per_order | dict[str, int] |
{} |
Per-instrument maximum notional. Keys are instrument ID strings, values are notional caps. |
| debug | bool |
False |
Enables verbose debug logging for every risk check. |
Outputs / Key Attributes
| Attribute | Type | Description |
|---|---|---|
| trading_state | TradingState |
Current state: ACTIVE, REDUCING, or HALTED. |
| is_bypassed | bool |
Whether pre-trade checks are bypassed. |
| command_count | int |
Total number of commands processed. |
| event_count | int |
Total number of events processed. |
Usage Examples
Default Risk Engine via TradingNodeConfig
from nautilus_trader.config import TradingNodeConfig
from nautilus_trader.config import LiveRiskEngineConfig
config = TradingNodeConfig(
trader_id="TRADER-001",
risk_engine=LiveRiskEngineConfig(
max_order_submit_rate="50/00:00:01",
max_order_modify_rate="50/00:00:01",
),
)
Setting Maximum Notional Per Order
from nautilus_trader.config import TradingNodeConfig
from nautilus_trader.config import LiveRiskEngineConfig
config = TradingNodeConfig(
trader_id="TRADER-001",
risk_engine=LiveRiskEngineConfig(
max_notional_per_order={
"BTCUSDT.BINANCE": 100_000,
"ETHUSDT.BINANCE": 50_000,
},
),
)
Programmatic Trading State Change
from nautilus_trader.model.enums import TradingState
# Access risk engine through the kernel
risk_engine = node.kernel.risk_engine
# Halt all trading (emergency kill switch)
risk_engine.set_trading_state(TradingState.HALTED)
# Resume trading
risk_engine.set_trading_state(TradingState.ACTIVE)
Bypass Mode for Testing
from nautilus_trader.config import TradingNodeConfig
from nautilus_trader.config import LiveRiskEngineConfig
config = TradingNodeConfig(
trader_id="TRADER-001",
risk_engine=LiveRiskEngineConfig(bypass=True),
)