nexustrader.core.nautilius_core

This module provides the core infrastructure components used throughout NexusTrader: the logger, message bus, and clock. Since version 0.3.7 these are pure-Python implementations and no longer depend on nautilus-trader. Since version 0.3.21 the logging backend is loguru, a pure-Python logger with zero build requirements and built-in time-based rotation.

Logger

Logger is the structured logger used throughout NexusTrader. Access it from a strategy via self.log:

self.log.info("Order placed")
self.log.warning("Unusual spread detected")
self.log.error("Connection lost")

# Optional color hint (ignored if the terminal does not support ANSI):
from nexustrader.constants import LogColor
self.log.info("Golden Cross signal!", color=LogColor.GREEN)

Log levels (lowest → highest): TRACE, DEBUG, INFO, WARNING, ERROR.

Note

Since 0.3.21, TRACE is natively supported (loguru level 5). logger.trace() emits at true TRACE severity.

Configure the minimum level via LogConfig:

from nexustrader.config import Config, LogConfig

config = Config(
    ...,
    log_config=LogConfig(level_stdout="DEBUG"),
)

MessageBus

MessageBus is the in-process pub/sub and point-to-point routing bus. It connects internal components (connectors, EMS, OMS, strategies) without polling overhead.

Two communication patterns:

  • Topic (fan-out)subscribe(topic, handler) / publish(topic, msg): one publisher, many subscribers.

  • Endpoint (point-to-point)register(endpoint, handler) / send(endpoint, msg): exactly one registered handler per endpoint.

LiveClock

LiveClock exposes the current wall-clock time and drives repeating timers.

Time accessors

clock.timestamp()     # float  — seconds since epoch
clock.timestamp_ms()  # int    — milliseconds since epoch
clock.timestamp_ns()  # int    — nanoseconds since epoch
clock.utc_now()       # datetime (UTC)

Timers

from datetime import datetime, timedelta, timezone
from nexustrader.core.nautilius_core import TimeEvent

def on_tick(event: TimeEvent) -> None:
    print(event.ts_event, event.ts_init)  # nanoseconds

clock.set_timer(
    name="my_timer",
    interval=timedelta(seconds=1),
    start_time=datetime.now(tz=timezone.utc) + timedelta(seconds=1),
    stop_time=None,       # runs indefinitely
    callback=on_tick,
)

clock.cancel_timer("my_timer")

TimeEvent

Emitted by LiveClock when a timer fires.

@dataclass
class TimeEvent:
    name: str     # timer name
    ts_event: int # scheduled fire time (nanoseconds, UTC epoch)
    ts_init: int  # actual call time   (nanoseconds, UTC epoch)