快速開始
開始前,請先選擇並設定 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.nvcheck 檢查語法、型別、編譯和匯入。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: 0PineScript 相容性 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);
