NautilusTrader 实盘节点如何配置 LiveNodeConfig 并注册数据与执行客户端?
【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader
把策略从回测搬到真实交易所时,第一步是搭好LiveNode:先用LiveNodeConfig定义节点的核心组件配置,再在LiveNode的 builder 上注册数据客户端(行情/合约)与执行客户端(下单/账户)。这两件事是分开的——文档明确说明:数据与执行客户端通过LiveNode.builder(...)注册,而不是挂在 config 对象的客户端字典里。本文以 OKX 适配器为例走 Python 主路径,Rust 原生路径作为可选分支,最后给出文档中定义的启动顺序与验证方式。
实盘交易涉及真实资金风险。在部署到生产环境之前,Live trading 概念文档要求先理解节点配置、节点操作、执行对账(reconciliation)以及回测与实盘环境的差异。
LiveNodeConfig 配置什么
LiveNodeConfig持有节点核心组件的设置。Python 中可以直接构造:
from nautilus_trader.common import Environment from nautilus_trader.common import LogLevel from nautilus_trader.config import CacheConfig from nautilus_trader.config import LiveDataEngineConfig from nautilus_trader.config import LiveExecutionEngineConfig from nautilus_trader.config import LiveNodeConfig from nautilus_trader.config import LiveRiskEngineConfig from nautilus_trader.config import LoggerConfig from nautilus_trader.config import MessageBusConfig from nautilus_trader.config import PortfolioConfig from nautilus_trader.model import TraderId config = LiveNodeConfig( environment=Environment.LIVE, trader_id=TraderId.from_str("MY-TRADER-001"), logging=LoggerConfig(stdout_level=LogLevel.INFO), cache=CacheConfig(), msgbus=MessageBusConfig(), data_engine=LiveDataEngineConfig(), risk_engine=LiveRiskEngineConfig(), exec_engine=LiveExecutionEngineConfig(), portfolio=PortfolioConfig(), )核心参数及其默认值(来自 Configure a Live Trading Node):
| Setting | Default | Description |
|---|---|---|
trader_id | "TRADER-001" | Unique trader identifier (name-tag format); the tag must be unique across nodes. |
instance_id | None | Optional unique instance identifier. |
timeout_connection_secs | 60.0 | Connection timeout in seconds. |
timeout_reconciliation_secs | 30.0 | Reconciliation timeout in seconds. |
timeout_portfolio_secs | 10.0 | Portfolio initialization timeout. |
timeout_disconnection_secs | 10.0 | Disconnection timeout. |
delay_post_stop_secs | 10.0 | Delay for residual events after stopping. |
timeout_shutdown_secs | 5.0 | Pending-task shutdown timeout in seconds. |
trader_id采用name-tag格式。注意文档中的警告:只有最后一个连字符后的tag会进入生成的 client order ID、order list ID 和 position ID。两个节点交易同一交易所账户时必须使用不同 tag,例如MY-TRADER-001和OTHER-TRADER-001共享 tag001,可能生成相同的 ID。策略上的use_uuid_client_order_ids只解决 client order ID 一项,order list ID 和 position ID 仍然依赖 tag,所以唯一 tag 始终是硬性要求。
在 builder 上注册数据与执行客户端
Python 路径的主路径是LiveNode.builder(name, trader_id, environment),链式调用add_data_client和add_exec_client,最后build()。下面这段与仓库示例 exec_tester.py 的接法一致:
from nautilus_trader.adapters.okx import OKXDataClientConfig from nautilus_trader.adapters.okx import OKXDataClientFactory from nautilus_trader.adapters.okx import OKXEnvironment from nautilus_trader.adapters.okx import OKXExecutionClientConfig from nautilus_trader.adapters.okx import OKXExecutionClientFactory from nautilus_trader.adapters.okx import OKXInstrumentType from nautilus_trader.adapters.okx import OKXMarginMode from nautilus_trader.common import Environment from nautilus_trader.config import LiveRiskEngineConfig from nautilus_trader.live import LiveNode from nautilus_trader.model import AccountId from nautilus_trader.model import TraderId node = ( LiveNode.builder( "OKX-EXEC-TESTER-001", TraderId.from_str("OKX-TESTER-001"), Environment.LIVE, ) .with_reconciliation(True) .add_data_client( None, OKXDataClientFactory(), OKXDataClientConfig(instrument_types=[OKXInstrumentType.SWAP]), ) .add_exec_client( None, OKXExecutionClientFactory(), OKXExecutionClientConfig( account_id=AccountId.from_str("OKX-001"), instrument_types=[OKXInstrumentType.SWAP], margin_mode=OKXMarginMode.CROSS, ), ) .build() )两个注册方法的第一个参数name是客户端标签,可以传None;一个节点挂多个客户端时用名字区分。Configure a Live Trading Node 给出的多市场示例在同一节点上注册了 Binance 现货和 USD-M 合约两个数据客户端:
node = ( LiveNode.builder( "BINANCE-MULTI-CLIENT-001", TraderId.from_str("MULTI-VENUE-001"), Environment.LIVE, ) .add_data_client( "BINANCE_SPOT", BinanceDataClientFactory(), BinanceDataClientConfig( product_type=BinanceProductType.SPOT, environment=BinanceEnvironment.LIVE, ), ) .add_data_client( "BINANCE_FUTURES", BinanceDataClientFactory(), BinanceDataClientConfig( product_type=BinanceProductType.USD_M, environment=BinanceEnvironment.LIVE, ), ) .build() )builder 还提供with_exec_engine_config、with_data_engine_config、with_msgbus_config、with_logging等方法注入各子引擎配置,例如LiveExecutionEngineConfig(reconciliation=True)。with_reconciliation(True)保持默认行为:启动时用交易所报告对齐本地缓存的订单与持仓状态;生产环境不要关闭它。
Rust 分支:纯 Rust 工程注册客户端
如果不用 Python 运行时,Run live trading (Rust) 给出了完整接法。在Cargo.toml中加入 live crate、交易所适配器和支撑 crate:
[dependencies] nautilus-common = "0.63" nautilus-live = "0.63" nautilus-model = "0.63" nautilus-okx = "0.63" nautilus-trading = { version = "0.63", features = ["examples"] } anyhow = "1" dotenvy = "0.15" log = "0.4" tokio = { version = "1", features = ["full"] }builder 注册数据与执行客户端(注意 Rust 侧add_data_client/add_exec_client带?,返回 Result):
use nautilus_common::{enums::Environment, logging::logger::LoggerConfig}; use nautilus_live::node::LiveNode; use nautilus_model::identifiers::{AccountId, TraderId}; use nautilus_okx::{ common::enums::OKXInstrumentType, config::{OKXDataClientConfig, OKXExecutionClientConfig}, factories::{OKXDataClientFactory, OKXExecutionClientFactory}, }; let trader_id = TraderId::from("TESTER-001"); let account_id = AccountId::from("OKX-001"); let data_config = OKXDataClientConfig::builder() .instrument_types(vec![OKXInstrumentType::Swap]) .build(); let exec_config = OKXExecutionClientConfig::builder() .account_id(account_id) .instrument_types(vec![OKXInstrumentType::Swap]) .build(); let mut node = LiveNode::builder(trader_id, Environment::Live)? .with_name("MY-NODE-001".to_string()) .add_data_client( None, Box::new(OKXDataClientFactory::new()), Box::new(data_config), )? .add_exec_client( None, Box::new(OKXExecutionClientFactory::new()), Box::new(exec_config), )? .with_delay_post_stop_secs(5) .build()?;该指南中的示例为了简化加了.with_reconciliation(false),文档明确警告:生产环境要删掉这一行,让引擎在启动时把缓存状态与交易所对齐。LiveNode::run()是 async 方法,需要 Tokio 运行时,在main上加#[tokio::main]。
交易所凭证与 demo 环境
OKX 适配器从环境变量读取 API 凭证(占位值替换为你自己的 key):
export OKX_API_KEY="your_api_key" export OKX_API_SECRET="your_api_secret" export OKX_API_PASSPHRASE="your_passphrase"每个适配器在 integrations 目录 下都有自己的集成指南,说明所需的环境变量和账户配置。首次验证接线时建议用 demo 环境:OKX 的 集成指南 说明 demo API key 与生产 key 完全独立,需在 OKX 的 Demo Trading 界面单独创建,生产 key 在 demo 模式下不可用。配置中把环境设为 demo,例如 Python 的environment=OKXEnvironment.DEMO或 Rust 的.environment(OKXEnvironment::Demo)。
运行与验证
节点构建完成后调用node.run()。Python 侧建议按 Configure a Live Trading Node 的写法保留dispose():
try: node.run() finally: node.dispose()Rust 侧为node.run().await?;,节点运行直到被 Ctrl+C 中断或程序化停止。
启动是否成功,按 Live trading 定义的生命周期判断:run()先恢复缓存状态(如配置了 backing 数据库),然后连接数据客户端并缓存合约定义,再连接执行客户端;若启用了启动对账,会拉取交易所报告并对齐状态;全部完成后才启动 trader 组件进入事件循环。连接、对账或 trader 启动任一失败都会中止启动并走协调清理路径。所以验证顺序是:
- 日志中数据客户端先连上、合约定义完成缓存;
- 执行客户端连接成功(OKX 的执行连接要求所请求的每个 instrument type 都有可用合约,缺失会中止连接);
- 启动对账完成,trader 组件启动,节点进入运行态并等待 Ctrl+C。
如果需要以编程方式确认运行态,Python 可以在运行前捕获handle()并轮询is_running;Live trading 给出的 hosted 模式示例中,启动阶段轮询handle.is_running,若 run task 先完成则抛出RuntimeError("LiveNode stopped during startup"),这就是文档定义的启动失败判定。
各适配器还自带 smoke-test 示例(data tester 和 execution tester),见 Run live trading (Rust) 的 adapter 表格,例如crates/adapters/okx/examples/、examples/live/okx/data_tester.py。Get Started with Lighter 文档化的做法是:先跑 data tester 确认数据订阅,再跑 exec tester 验证执行链路;其 exec tester 默认会真实下单(dry_run=False),OKX 的 exec tester 通过dry_run参数控制。跑 exec tester 前应确认 instrument、环境、账户和凭证,先用 demo/testnet 或最小可接受数量。
限制与边界
配置和运行节点时还有几条文档明确的硬约束:
- 一个进程一个
LiveNode:同一进程内并发运行多个LiveNode不受支持,run_async()也会拒绝同一事件循环上的第二个 hosted 节点。多策略挂在同一节点上,多节点用独立进程。 - 不要在 Jupyter notebook 里跑实盘节点:节点在调用线程上拥有长时运行循环,notebook 的 cell 乱序执行和内核崩溃使生产操作不安全。Jupyter 只用于回测和分析。
- 不要阻塞事件循环:事件循环线程上的用户代码(策略回调、actor 处理、时间事件回调)必须快速返回,长任务要放到 executor 或独立线程/进程,否则会造成漏单、数据陈旧和下单延迟。
- 带缓存数据库的节点必须用
run():run_async()会拒绝会阻塞宿主事件循环的 cache database backing。 - Windows 信号处理与 Unix 不同,在 Windows 上运行时先阅读 Configure a Live Trading Node 的 Windows 信号处理一节。
- OKX 的 region 匹配:API key 只在注册区域有效,对另一区域端点使用会报
API key doesn't exist,region默认GLOBAL,跨区账户需显式设置。
如果希望节点在出现 Rust 错误日志时自动停止,可以设LiveNodeConfig(shutdown_on_error=True):Rust logger 记录 kernel 启动后第一条log::error!,随后 kernel 发布ShutdownSystem命令,节点走正常的停止流程(停 trader、等待 post-stop 延迟、断开客户端、停引擎),不会直接 abort 进程。
节点跑通之后,下一步通常是给节点添加策略(node.add_strategy/add_builtin_strategy)并把with_reconciliation(True)保留下来,进入对账与执行策略的细节,参见 Execution reconciliation。
【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考