NautilusTrader Skill
High-performance algorithmic trading platform with event-driven architecture. Identical code for backtesting and live trading. Rust/Cython core with Python bindings.
Always consult official docs for current API - the API evolves frequently with breaking changes before v2.x.
-
API Reference: https://nautilustrader.io/docs/latest/api_reference/
File Guide
Core Development
-
strategy-development.md - Strategy class, lifecycle, event handlers, order submission
-
backtesting.md - BacktestNode/Engine setup, fill models, data catalog
-
live-trading.md - TradingNode deployment, Redis, production safety
Data & Orders
-
data-models.md - QuoteTick, TradeTick, Bar, InstrumentId, BarType
-
orders.md - Order types, OrderFactory, bracket orders, emulation
-
cache.md - Query instruments, orders, positions, market data
Components
-
actors.md - Actor base class for non-trading components
-
indicators.md - Built-in indicators, registration, custom indicators
-
portfolio.md - Account balances, positions, PnL calculations
-
execution.md - Execution flow, risk engine, execution algorithms
Integration
-
integrations.md - Binance, Bybit, Interactive Brokers status
-
adapters.md - Custom adapter implementation
-
architecture.md - NautilusKernel, MessageBus, engines
Reference
-
examples.md - Complete working strategies
-
best-practices.md - Testing, optimization, safety
-
troubleshooting.md - Common issues
-
installation.md - Setup, precision modes
Critical Patterns
Register indicators BEFORE subscribing:
self.register_indicator_for_bars(self.bar_type, self.ema) self.subscribe_bars(self.bar_type) # Must be after registration
Use strategy's order_factory:
order = self.order_factory.market( instrument_id=instrument_id, order_side=OrderSide.BUY, quantity=Quantity.from_str("1.0"), ) self.submit_order(order)
BarType string format:
Format: {instrument_id}-{step}-{aggregation}-{price_type}-{source}
bar_type = BarType.from_str("BTCUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL")
InstrumentId format:
Format: {symbol}.{venue}
instrument_id = InstrumentId.from_str("BTCUSDT.BINANCE")
Quantity/Price from strings (avoids precision issues):
quantity = Quantity.from_str("1.5") price = Price.from_str("50000.00")
Check indicator initialization:
def on_bar(self, bar: Bar): if not self.ema.initialized: return # Safe to use self.ema.value
OMS Types
-
OmsType.NETTING
-
Single position per instrument (crypto-style)
-
OmsType.HEDGING
-
Multiple positions per instrument (traditional futures)
Account Types
-
AccountType.CASH
-
Spot trading
-
AccountType.MARGIN
-
Margin/leverage trading