【免费下载链接】NexusTrader
NexusTrader is a professional-grade open-source quantitative trading platform designed by Scott Zhang
NexusTrader 是一个专业级的开源量化交易平台,内置了灵活的指标(Indicator)框架。本教程教你如何自定义指标,并通过warmup_period参数让平台自动拉取历史K线完成预热(Warmup)——新指标启动即有准确数值,不必再等几十根K线慢慢"攒数据"。
为什么自定义指标需要 Warmup?
移动平均线、布林带、RSI 这类指标都依赖过去 N 根K线的数据。如果策略启动后只靠实时推送逐根计算,前几十分钟里指标值是缺失或不准确的,信号自然也就不可靠。
NexusTrader 的解决方案是:在指标上声明需要多少根历史K线,框架在注册时自动调用 REST API 拉取历史数据并喂给指标。整个预热过程对策略代码是透明的。
从下面的架构图中可以看到数据链路:交易所原始数据经WsClient进入PublicConnectors,再以on_kline()等回调分发给 Strategy,而指标正是挂在IndicatorManager消息订阅上的:
第一步:理解 Indicator 基类
所有自定义指标都继承自 nexustrader/indicator.py 中的Indicator基类,构造函数有 4 个关键参数:
| 参数 | 说明 |
|---|---|
params | 指标参数字典,如{"period": 20} |
name | 指标名称,后续通过self.indicator.<name>[symbol]访问 |
warmup_period | ⭐ 需要多少根历史K线,设置后即触发自动预热 |
kline_interval | 指标使用的K线周期,如KlineInterval.MINUTE_1 |
两个参数同时设置时,requires_warmup才为True;预热完成后可通过is_warmed_up属性查询状态。相关 API 文档见 docs/source/api/indicator.rst。
第二步:写一个带预热的 MA20 指标
完整示例可参考 strategy/bybit/warmup_moving_average_example.py。核心骨架如下:
class MovingAverageIndicator(Indicator): def __init__(self, period: int = 20): super().__init__( params={"period": period}, name=f"MA_{period}", warmup_period=period * 2, # 需要 40 根历史K线 kline_interval=KlineInterval.MINUTE_1, ) self.prices = deque(maxlen=period) def handle_kline(self, kline: Kline): if not kline.confirm: # 只用已收盘确认的K线 return self.prices.append(kline.close) if len(self.prices) >= self.period: self.current_ma = sum(self.prices) / len(self.prices) @property def value(self): return self.current_ma三个要点:
- 只覆写你关心的数据回调。K线指标实现
handle_kline()即可,其余回调留空; - 判断
kline.confirm:未收盘的K线会反复更新,正式计算建议只用已确认K线; - 实现
value属性:策略通过这个属性读取指标当前值。
第三步:在策略中注册,预热自动完成
在策略的on_start()中订阅K线并调用register_indicator(见 nexustrader/strategy.py):
self.subscribe_kline(symbols=self.symbols, interval=KlineInterval.MINUTE_1) self.register_indicator( symbols=self.symbols, indicator=self.ma_20, data_type=DataType.KLINE, account_type=BybitAccountType.LINEAR, )接下来框架会自动完成三件事:
- 按 symbol 深拷贝:传入多个交易对时,每个 symbol 都会获得独立的指标实例,状态互不干扰;
- 自动拉历史K线:
_perform_indicator_warmup()按warmup_period × K线周期计算时间窗口,调用request_klines()取回历史数据并从旧到新逐根喂给指标(见 nexustrader/strategy.py); - 实时数据接管:历史预热完成后,指标进入
_kline_indicators活跃列表,后续实时推送的K线继续更新它(见 nexustrader/indicator.py)。
如果历史拉取失败或数量不足,指标仍保留在_warmup_pending队列中等待实时K线补齐——你也可以调用wait_for_warmup(timeout)阻塞等待全部预热完成,或调用get_warmup_status()查看每个指标的进度。
第四步:读取指标值与多交易对访问
注册后,每个 symbol 的指标实例通过self.indicator代理按名称和交易对访问:
def on_kline(self, kline: Kline): ma_20 = self.indicator.MA_20[kline.symbol] if not ma_20.is_warmed_up: # 预热完成前不出信号 return if ma_20.value and kline.close > ma_20.value: self.log.info(f"价格站上 MA20,触发信号")上面的完整多交易对金叉/死叉演示(BTC/ETH/UNI 三标的各跑独立 MA20 + MA50)就在 strategy/bybit/warmup_moving_average_example.py,跑通后日志会输出每个交易对的均线值和交叉信号。
实践建议与常见坑 📌
- 预热数量留余量:周期为 N 的指标建议设
warmup_period = N * 2,给指标内部状态(如均线自身)留出收敛空间; - 名称是访问入口:
name必须符合 Python 标识符规则且不能以下划线开头,否则注册时会直接抛ValueError(校验逻辑见 nexustrader/indicator.py); - 只支持 K线指标预热:
warmup_period仅在data_type=DataType.KLINE时生效,BookL1/Trade 类指标会忽略预热声明; - 非K线指标无需预热:像 strategy/bybit/demo_indicator.py 中的 MicroPrice 指标,不传
warmup_period即可,收到第一笔数据就能用。
写到这里,一个支持历史K线自动预热的自定义指标就完整了:继承Indicator声明warmup_period和kline_interval→ 策略里register_indicator→ 平台拉历史、喂数据、接管实时流。更多交易所的自定义策略可以参考 strategy/ 目录下 Bybit、Binance、OKX、Hyperliquid、Bitget 的完整示例。
【免费下载链接】NexusTrader
NexusTrader is a professional-grade open-source quantitative trading platform designed by Scott Zhang
相关推荐
SVGKit自定义扩展终极指南:如何支持非标准SVG标签
SVGKit自定义扩展终极指南:如何支持非标准SVG标签 在iOS和macOS应用开发中,SVGKit是一个强大的开源库,能够原生渲染SVG矢量图形。但在实际项
UI组件图形学如何用TickDB K线数据做策略回测:10种周期的历史K线获取与技术指标计算实战教程
如何用TickDB K线数据做策略回测:10种周期的历史K线获取与技术指标计算实战教程 TickDB 是一个 AI 原生的实时行情数据 API(tickdb u
终极CAD图纸在线预览指南:kkFileView支持标注样式自定义功能
终极CAD图纸在线预览指南:kkFileView支持标注样式自定义功能 kkFileView是一款基于Spring Boot的通用文件在线预览项目,它能帮助用户
后端音视频
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考