Jump to content

Connect Leeroopedia MCP: Equip your AI agents to search best practices, build plans, verify code, diagnose failures, and look up hyperparameter defaults.

Implementation:Nautechsystems Nautilus trader RiskEngine Init

From Leeroopedia


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 optional RiskEngineConfig.
  • Sets the initial trading state to ACTIVE.
  • Reads the bypass and debug flags 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) and RiskEngine.process (for events).
  • Subscribes to events.order.* and events.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),
)

Related Pages

Page Connections

Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment