Skip to content

快速开始

开始前,请先选择并配置 Navi 的使用方式。本指南使用 Longbridge CLI 和行情数据运行脚本,并将独立的 navi CLI 作为可选的本地开发检查工具。

编写第一个指标

创建 sma.nv

navi
indicator("SMA", overlay: true);

let len = input.int(14, "Length", minval: 1);
plot(ta.sma(close, len), "SMA", color: Color.BLUE);
AAPL · 1D · SMA 14
Loading chart…

蓝色线是该指标基于 AAPL 日 K 线计算出的 14 周期简单移动平均线。

本地检查(可选)

如果已安装用于开发的独立 navi CLI,可以在运行脚本前进行验证:

bash
navi check sma.nv
navi fmt --check sma.nv

check 检查语法、类型、编译和导入。fmt --check 只报告源码是否符合规范格式而不改动文件;navi fmt 则直接原地重写。

两个命令都接受任意多个路径,每个路径可以是文件、目录或 glob 模式,因此一条命令即可校验整个项目:

bash
navi check "**/*.nv"
navi fmt .

独立 CLI 不包含行情数据,也不执行脚本。想看指标在真实 K 线上的表现,请使用下方的 Longbridge CLI,或在 Playground 中打开。

使用 Longbridge 运行

通过 Longbridge CLI 使用历史行情数据运行指标:

bash
cat sma.nv | longbridge quant run AAPL.US \
  --start 2024-01-01 \
  --end 2024-12-31

数据周期、输入参数、输出格式和回测选项请参阅 longbridge quant run 文档。同一个脚本也可以在 Longbridge App 或桌面端中交互式使用。

编写策略

navi
strategy("MA Cross", overlay: true);

let fast = ta.ema(close, input.int(10, "Fast"));
let slow = ta.ema(close, input.int(20, "Slow"));

if ta.cross_over(fast, slow) {
    strategy.close("Short");
    strategy.entry("Long", Direction.Long);
}
if ta.cross_under(fast, slow) {
    strategy.close("Long");
    strategy.entry("Short", Direction.Short);
}

plot(fast, "Fast EMA");
plot(slow, "Slow EMA");
bash
navi check ma_cross.nv
navi fmt --check ma_cross.nv

使用 500 根 AAPL 日 K 线运行该示例,CLI 输出为:

text
ran 500 bars; plots: 2; trades: 0 ; net profit: 0

PineScript 兼容性 experimental

Navi 兼容 PineScript v6 语法,因此已有的 .pine 脚本无需先行改写即可在 Longbridge 平台上运行。独立的 navi CLI 只处理 Navi,仅接受 .nv 文件。

转换为 Navi

下面两个示例都计算布林带。PineScript 填充上下轨区域,紧凑的 Navi 版本则使用趋势变色中轨和简洁的区间边界。

pine
// @version=6
indicator("Bollinger Bands", overlay=true)

length = input.int(20, "Length")
mult   = input.float(2.0, "Multiplier")

[basis, upper, lower] = ta.bb(close, length, mult)

plot(basis, "Basis", color.blue)
upper_plot = plot(upper, "Upper", color.red)
lower_plot = plot(lower, "Lower", color.green)
fill(upper_plot, lower_plot, color.new(color.blue, 90))
navi
indicator("Bollinger Range", overlay: true);

let price_source = input.source(close, "Source");
let period = input.int(20, "Period", minval: 1);
let deviation = input.float(2.0, "Deviation", minval: 0.1);

let (middle, upper_band, lower_band) = ta.bb(price_source, period, deviation);
let middle_color = middle > middle[1] ? Color.GREEN : Color.RED;

plot(middle, "Trend Basis", color: middle_color, line_width: 2);
plot(upper_band, "Upper Range", color: Color.BLUE);
plot(lower_band, "Lower Range", color: Color.BLUE);

下一步

基于 MIT 许可证发布。