Skip to content

图表渲染

执行 Navi 后,调用 instance.chart() 可获取 Chart —— 脚本产生的完整视觉输出集合。本文档描述图表数据模型,以便你可在任何前端(Canvas、SVG、WebGL、原生 UI 等)中进行渲染。

基本访问图表和脚本信息的 Rust API 模式请参阅读取输出

概述

Chart 包含两类视觉元素:

类别访问方式描述
序列图chart.series_graphs()逐 K 线数据:每根 K 线一个值。包括 plot()plot_shape()plot_char()plot_arrow()plot_candle()plot_bar()bg_color()fill()
非序列图chart.graphs()*.new() 创建的时间点绘图对象。包括 labellineboxtablepolylinehlinelinefill

序列图按 K 线索引(索引 0 = 第一根 K 线)。非序列图为具有显式坐标的独立对象。


访问图表

rust
use navi_vm::*;

// 1. Build an instance with bar data
let instance = Instance::builder(candlesticks, source, TimeFrame::days(1), "NASDAQ:AAPL")
    .build().await?
    .run_to_end("NASDAQ:AAPL", TimeFrame::days(1)).await?;

// 3. Access the chart (borrow)
let chart = instance.chart();

// Or take ownership (consumes the instance)
let chart = instance.into_chart();

// 4. Access script configuration
let info = instance.script_info();

关键图表方法

方法返回类型描述
background_color()Option<Color>图表级背景色
series_graphs()Iterator<(SeriesGraphId, &SeriesGraph)>所有逐 K 线视觉序列
series_graph(id)Option<&SeriesGraph>按 ID 查找特定序列图
graphs()Iterator<(GraphId, &Graph)>所有绘图对象
graph(id)Option<&Graph>按 ID 查找特定绘图对象
series_len()usizeK 线总数
bar_colors()&BarColors每根 K 线的 K 线颜色覆盖
filled_orders_on_bar(i)&[FilledOrder]i 根 K 线上的成交订单(信号名、价格、数量)

图表结构

Chart
 |-- background_color: Option<Color>
 |-- bar_colors: BarColors
 |-- filled_orders: { bar_index -> [FilledOrder] }
 |
 |-- series_graphs: { SeriesGraphId -> SeriesGraph }
 |     |-- Plot
 |     |-- PlotShape
 |     |-- PlotChar
 |     |-- PlotArrow
 |     |-- PlotBar
 |     |-- PlotCandle
 |     |-- BackgroundColor
 |     |-- Fill
 |
 |-- graphs: { GraphId -> Graph }
       |-- Hline
       |-- Label
       |-- Line
       |-- LineFill
       |-- Box
       |-- Polyline
       |-- Table

脚本配置 (ScriptInfo)

通过 instance.script_info() 访问。这描述脚本如何声明自身 —— 控制窗格布局、绘制顺序和数值格式。indicator()strategy() 共享相同的渲染相关字段。

rust
let info = instance.script_info();

// Access rendering fields via script_type
let is_overlay = match &info.script_type {
    ScriptType::Indicator(ind) => ind.overlay,
    ScriptType::Strategy(strat) => strat.overlay,
    ScriptType::Library(lib) => lib.overlay,
};
字段类型默认值描述
titleString显示名称,用于图表图例和数据窗口
short_titleOption&lt;String&gt;None紧凑显示的缩写名称(状态行、价格刻度)
overlayboolfalsetrue = 绘制在主图价格窗格;false = 在单独副图中绘制
formatFormatInherit价格刻度、工具提示、数据窗口上显示数值的格式
precisionOption&lt;u8&gt;None数值小数位。None = 使用品种默认值
scaleScaleTypeNone价格刻度位置:None(自动)、LeftRight
explicit_plot_zorderboolfalsetrue = 按声明顺序渲染(先声明 = 底层)。false = 默认绘制顺序
behind_chartboolfalsetrue = 在 K 线后方绘制而非上方

overlay 是最重要的渲染决策:

  • true -> 在主图价格窗格绘制所有视觉元素,共享价格 Y 轴。
  • false -> 在图表下方创建单独副图,拥有自己的 Y 轴。

overlay 同时设置脚本创建的每个视觉元素的 force_overlay 默认值。当 overlay = true 时,所有视觉元素默认为 force_overlay = true(主图)。当 overlay = false 时,默认为 force_overlay = false(副图)。用户可通过显式传递 force_overlay 参数,按视觉元素覆盖此设置。

format 控制副图 Y 轴标签及十字准线/工具提示中数值的格式化方式,应用于所有副图数值标签:

  • Inherit / Price — 格式化为价格(如 150.250.0042
  • Percent — 添加百分号(如 3.14%
  • Volume — 缩写大数值(如 1.5M200K
  • MinTick — 使用品种最小 tick 格式化(不可用时视为 Price

explicit_plot_zorder 控制图层:

  • false(默认)— 由渲染器决定绘制顺序
  • true — 按 series_graphs() 中的出现顺序绘制(先出现 = 底层)

常见类型

Color

打包为 32 位 RGBA 的值,以 0xRRGGBBAA 格式存储为 u32

方法描述
red() -&gt; u8红色通道 (0-255)
green() -&gt; u8绿色通道 (0-255)
blue() -&gt; u8蓝色通道 (0-255)
alpha() -&gt; u8透明通道 (0 = 透明,255 = 不透明)
transparency() -&gt; u8alpha 的倒数 (0 = 不透明,100 = 透明)
as_u32() -&gt; u32原始打包值

转换为 CSS:rgba(color.r(c), color.g(c), color.b(c), color.alpha() as f64 / 255.0)

序列化为 JSON 时,Color 显示为普通整数(例如红色 0xFF0000FF4294901760)。

值为 NoneOption&lt;Color&gt; 表示“使用默认颜色”或“不可见”,取决于上下文。

Series<T>

Series&lt;T&gt; 是逐 K 线值的顺序数组,由 VecDeque&lt;T&gt; 支持。索引 0 为第一根 K 线,索引 len() - 1 为最后一根 K 线。

方法描述
get(index) -&gt; Option&lt;&T&gt;获取 K 线索引处的值
len() -&gt; usizeK 线数量
is_empty() -&gt; bool序列是否为空
last() -&gt; Option&lt;&T&gt;最后一根 K 线的值

大多数序列类型为 Series&lt;Option&lt;f64&gt;&gt;Series&lt;Option&lt;Color&gt;&gt;None 条目表示 na(不可用/该 K 线无数值)。渲染时跳过 None 条目 —— 该 K 线不绘制任何内容。

序列化为 JSON 时,Series 显示为普通数组:[null, 150.0, 153.2, null, ...]

PlotDisplay (Bitflags)

控制视觉元素的显示位置。为位掩码 —— 可组合多个标志。

标志描述
ALL0xFFFF随处显示(默认)
NONE0x0隐藏 —— 不渲染任何地方
PANE0x2在图表窗格中显示(视觉图形本身)
DATA_WINDOW0x1在数据窗口面板中显示
PRICE_SCALE0x8在价格刻度轴上显示数值
STATUS_LINE0x10在状态/图例行上显示数值

渲染规则:仅当 display 包含 PANE 标志(display & 0x2 != 0)时,在图表窗格中渲染视觉元素。若 displayNONE0x0),则完全跳过渲染。


序列图(逐 K 线数据)

使用 chart.series_graphs() 迭代。每项为 (SeriesGraphId, &SeriesGraph) 对。使用模式匹配识别类型:

rust
for (id, sg) in chart.series_graphs() {
    match sg {
        SeriesGraph::Plot(plot) => { /* render plot */ }
        SeriesGraph::PlotShape(shape) => { /* render shapes */ }
        SeriesGraph::PlotChar(pchar) => { /* render characters */ }
        SeriesGraph::PlotArrow(arrow) => { /* render arrows */ }
        SeriesGraph::PlotCandle(candle) => { /* render candles */ }
        SeriesGraph::PlotBar(bar) => { /* render OHLC bars */ }
        SeriesGraph::BackgroundColors(bg) => { /* render bg colors */ }
        SeriesGraph::Fill(fill) => { /* render fill area */ }
    }
}

或使用访问方法:sg.as_plot()sg.as_plot_shape() 等。


Plot

最常见的序列图。由 plot() 函数产生。

示例:

navi
plot(close, "Close", color.BLUE, linewidth: 2, style: PlotStyle.Line);

字段:

字段类型描述
titleOption&lt;String&gt;图形标题。显示在图表图例、数据窗口中,用作默认工具提示标签。None = 无标题。
seriesSeries&lt;Option&lt;f64&gt;&gt;逐 K 线数值。每项对应一根 K 线。None = na(该 K 线无点 —— 根据 stylejoin 断开或留空)。
colorsSeries&lt;Option&lt;Color&gt;&gt;图形的逐 K 线颜色。可随 K 线动态变化(如上涨绿色、下跌红色)。None = 使用默认颜色。
line_widthi32线条或轮廓的像素宽度。默认:1。适用于所有样式。
stylePlotStyle决定序列数据的视觉渲染方式:连续线、阶梯线、面积填充、直方图柱、列或点标记(圆、十字、菱形)。参见 PlotStyle 枚举的所有选项。
line_stylePlotLineStyle基于线条样式的描边模式:SolidDashedDotted。仅适用于 LineLineBrStepLineStepLineBr 样式。
track_pricebool若为 true,从最后绘制值向右延伸一条水平虚线至图表右边缘,并在价格刻度上显示该值。用于突出当前指标值。
histbasef64HistogramAreaAreaBrColumns 样式的基准值。这些样式填充序列值与 histbase 之间的区域。默认:0.0。例如 histbase = 50.0 时,数值 80 的直方图柱从 50 向上绘至 80,数值 30 的柱从 50 向下绘至 30。
offseti32将整个图形按给定 K 线数左右偏移。正值向右(未来),负值向左(过去)。默认:0。渲染器应在 bar_index + offset 而非 bar_index 处绘制。
joinbool控制 LineStepLineArea 样式的空值处理。true = 连接连续的 non-na 点,即使中间有 na 值(跨越空值)。false = 在 na 处断开。*Br 样式(LineBrStepLineBrAreaBr)无论此设置如何,始终在 na 处断开。
show_lastOption&lt;usize&gt;若设置,仅渲染图形最后 N 根 K 线。更早的 K 线隐藏。用于减少视觉杂乱。None = 显示全部。
displayPlotDisplay控制图形可见位置的位标志:图表窗格、数据窗口、价格刻度、状态行,或全部/无。仅当设置 PANE 标志时在图表上渲染。参见 PlotDisplay
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置(参见 ScriptInfo)。可通过 plot()force_overlay 参数按调用覆盖。

渲染逻辑:

for bar_index in 0..chart.series_len():
    value = plot.series[bar_index]   // Option<f64>
    color = plot.colors[bar_index]   // Option<Color>

    if value is None:
        if style is Line/StepLine/Area and join is true:
            // skip but connect to next valid point
        else:
            // break the line / skip the bar
        continue

    actual_bar = bar_index + plot.offset
    y = value_to_pixel(value)
    x = bar_to_pixel(actual_bar)

    match plot.style:
        Line/LineBr     -> draw line segment to (x, y)
        StepLine/...    -> draw horizontal then vertical to (x, y)
        Area/AreaBr     -> fill between y and histbase
        Histogram       -> draw thin vertical bar from histbase to y
        Columns         -> draw wide vertical bar from histbase to y
        Circles         -> draw circle at (x, y)
        Cross           -> draw + at (x, y)
        Diamond         -> draw diamond at (x, y)

PlotShape

在图表上渲染形状符号。由 plot_shape() 函数产生。

示例:

navi
plot_shape(close > open, style: Shape.TriangleUp, location: Location.BelowBar, color: color.GREEN);

字段:

字段类型描述
titleString图形标题,显示在图表图例和数据窗口中。
series(private)逐 K 线值,决定是否绘制形状。通过 bool_value(i)(若形状应在 K 线 i 上显示则返回 Some(true))或 float_value(i)(原始数值)访问。当 locationAbsolute 时,float 值用作 Y 坐标。
styleShape要绘制的形状符号类型(如三角形、箭头、圆、十字、菱形、旗帜、标签、方形、X 形)。
locationLocation控制形状的垂直位置。AboveBar/BelowBar 在 K 线最高/最低价上下固定偏移处放置。Top/Bottom 锚定到窗格顶部/底部。Absolute 将序列 float 值用作精确 Y 价格坐标。
colorsSeries&lt;Option&lt;Color&gt;&gt;形状的逐 K 线颜色。可为常量或随 K 线动态变化(如看涨信号绿色、看跌信号红色)。
offseti32按给定 K 线数左右偏移形状。默认:0
textOption&lt;String&gt;形状旁显示的可选文本。支持 \n 多行。在形状位置附近渲染。
text_colorsSeries&lt;Option&lt;Color&gt;&gt;文本的逐 K 线颜色。与形状颜色独立。
sizeSize控制图表上形状的视觉大小:AutoTinySmallNormalLargeHuge
show_lastOption&lt;usize&gt;若设置,仅在最末 N 根 K 线上绘制形状(从最近 K 线向前计数)。
displayPlotDisplay控制可见性的位标志。参见 PlotDisplay
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

访问方法:

  • bool_value(bar_index) -&gt; Option&lt;bool&gt; — 值非零时返回 true(应绘制形状),零时 false,na 时 None
  • float_value(bar_index) -&gt; Option&lt;f64&gt; — 返回原始 float 值。

渲染逻辑:

for bar_index in 0..chart.series_len():
    show = plot_shape.bool_value(bar_index)    // Option<bool>
    if show is None or show == false:
        continue

    x = bar_to_pixel(bar_index + offset)
    y = match location:
        AboveBar  -> bar_high_pixel - margin
        BelowBar  -> bar_low_pixel + margin
        Absolute  -> value_to_pixel(plot_shape.float_value(bar_index))
        Top       -> pane_top
        Bottom    -> pane_bottom

    draw_shape(style, x, y, size, colors[bar_index])
    if text is not None:
        draw_text(text, x, y, text_colors[bar_index])

PlotChar

PlotShape 类似,但渲染单个字符。由 plot_char() 函数产生。

示例:

navi
plot_char(crossover, char: "*", location: Location.AboveBar, color: color.YELLOW);

字段:

字段类型描述
titleString图形标题,显示在图表图例和数据窗口中。
series(private)逐 K 线值。通过 bool_value(i)/float_value(i) 访问。与 PlotShape 行为相同:locationAbsolute 时 float 值决定 Y 位置;否则布尔值决定字符是否显示。
charchar用作视觉标记的任意单个 Unicode 字符(如 '*''✓''❄')。
locationLocation垂直位置。与 PlotShape 相同:AboveBarBelowBarTopBottomAbsolute
colorsSeries<Option<Color>>字符的逐 K 线颜色。
offseti32按给定 K 线数左右偏移字符。默认:0
textOption<String>字符旁显示的可选额外文本。支持 \n 多行。
text_colorsSeries<Option<Color>>额外文本的逐 K 线颜色。
sizeSize图表上字符的大小:AutoTinySmallNormalLargeHuge
show_lastOption<usize>若设置,仅在最末 N 根 K 线上绘制。
displayPlotDisplay控制可见性的位标志。参见 PlotDisplay
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

渲染与 PlotShape 相同,仅用 char 字符替代形状符号。


PlotArrow

渲染方向箭头。由 plot_arrow() 函数产生。箭头方向由值的符号决定。

示例:

navi
plot_arrow(close - open, color_up: color.GREEN, color_down: color.RED);

字段:

字段类型描述
titleString图形标题,显示在图表图例和数据窗口中。
seriesSeries&lt;Option&lt;f64&gt;&gt;决定箭头方向和相对高度的逐 K 线数值。正值在 K 线上方绘制向上箭头;负值在 K 线下方绘制向下箭头None (na) = 该 K 线不绘制箭头。绝对值决定箭头相对于序列中其他箭头的高度 —— 更大绝对值产生更高箭头。
up_colorsSeries&lt;Option&lt;Color&gt;&gt;向上箭头的逐 K 线颜色(序列值为正时绘制)。可随 K 线动态变化。None = 使用默认颜色。
down_colorsSeries&lt;Option&lt;Color&gt;&gt;向下箭头的逐 K 线颜色(序列值为负时绘制)。可随 K 线动态变化。None = 使用默认颜色。
offseti32按给定 K 线数左右偏移箭头。默认:0。渲染器应在 bar_index + offset 而非 bar_index 处绘制箭头。
min_heightusize箭头最小可能高度(像素)。序列中最小绝对值映射到此高度。默认:5
max_heightusize箭头最大可能高度(像素)。序列中最大绝对值映射到此高度。默认:100。箭头高度根据该 K 线绝对值与整个序列最大绝对值的比例,在 min_heightmax_height 之间线性插值。
show_lastOption&lt;usize&gt;若设置,仅在最末 N 根 K 线上绘制箭头(从最近 K 线向前计数)。更早的 K 线隐藏。None = 显示全部。
displayPlotDisplay控制箭头数据可见位置的位标志:图表窗格、数据窗口、价格刻度、状态行,或全部/无。仅当设置 PANE 标志时在图表上渲染。参见 PlotDisplay
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

渲染逻辑:

for bar_index in 0..chart.series_len():
    value = series[bar_index]
    if value is None:
        continue

    x = bar_to_pixel(bar_index + offset)

    if value > 0:
        // Up arrow: draw above the bar
        color = up_colors[bar_index]
        height = scale(abs(value), min_height, max_height)
        draw_up_arrow(x, bar_high - margin, height, color)
    else:
        // Down arrow: draw below the bar
        color = down_colors[bar_index]
        height = scale(abs(value), min_height, max_height)
        draw_down_arrow(x, bar_low + margin, height, color)

箭头高度根据绝对值相对于序列最大绝对值的比例,在 min_heightmax_height 之间成比例缩放。


PlotCandle

渲染 OHLC K 线。由 plot_candle() 函数产生。用于绘制自定义 K 线叠加(如 Heikin Ashi)。

示例:

navi
plot_candle(ha_open, ha_high, ha_low, ha_close, title: "Heikin Ashi", color: ha_close >= ha_open ? color.GREEN : color.RED);

字段:

字段类型描述
titleString图形标题,显示在图表图例和数据窗口中。
seriesSeries<Option<Bar>>逐 K 线 OHLC 数据(开、高、低、收)。每项为 Bar 结构体。None = 该 K 线不绘制。若四个 OHLC 值中有 NaN,则不应绘制该 K 线。四个值的最大值用作最高价,最小值用作最低价,与来自哪个字段无关。
colorsSeries<Option<Color>>K 线实体(开收之间的矩形)的逐 K 线颜色。可随 K 线动态变化 —— 通常 close >= open 时为绿色/看涨,否则红色/看跌。None = 使用默认颜色。
wick_colorsSeries<Option<Color>>K 线影线(从实体延伸至最高最低价的细垂线)的逐 K 线颜色。None = 使用默认影线颜色(通常与实体或边框色相同)。
border_colorsSeries<Option<Color>>K 线实体边框的逐 K 线颜色。作为实体矩形周围的描边绘制。None = 使用默认边框颜色。
show_lastOption<usize>若设置,仅在最末 N 根 K 线上绘制 K 线(从最近 K 线向前计数)。更早的 K 线隐藏。None = 显示全部。
displayPlotDisplay控制 K 线数据可见位置的位标志。仅当设置 PANE 标志时在图表上渲染。参见 PlotDisplay
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

Bar 结构体(OHLC 数据):

字段类型描述
openf64开盘价
highf64最高价
lowf64最低价
closef64收盘价

渲染:

对每根具有非 None OHLC 值的 K 线:

  1. 使用 wick_colors 绘制影线(从 lowhigh 的垂线)。
  2. 使用 colors 填充绘制实体(从 openclose 的矩形)。
  3. 使用 border_colors 绘制实体边框
  4. close >= open 为看涨;否则看跌。颜色已由脚本按 K 线设置。

PlotBar

渲染 OHLC 条形图(细线,非 K 线)。由 plot_bar() 函数产生。

字段:

字段类型描述
titleString图形标题,显示在图表图例和数据窗口中。
seriesSeries<Option<Bar>>逐 K 线 OHLC 数据。每项为 Bar 结构体。None = 该 K 线不绘制。若四个值中有 NaN,则不应绘制。四个值的最大值用作最高价,最小值用作最低价。
colorsSeries<Option<Color>>应用于整个 OHLC 条的逐 K 线颜色(垂线、开盘标记、收盘标记均用此颜色绘制)。可随 K 线动态变化。None = 使用默认颜色。
show_lastOption<usize>若设置,仅在最末 N 根 K 线上绘制 OHLC 条。None = 显示全部。
displayPlotDisplay控制 OHLC 条数据可见位置的位标志。仅当设置 PANE 标志时在图表上渲染。参见 PlotDisplay
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

渲染:

每根 K 线:绘制从 lowhigh 的垂线,在 open 处的左侧标记,在 close 处的右侧标记。均使用 colors[bar_index] 的颜色。


BackgroundColor (bg_color)

用逐 K 线颜色填充图表背景。由 bg_color() 函数产生。

示例:

navi
bg_color(close > open ? color.new(color.GREEN, 90) : color.new(color.RED, 90));

字段:

字段类型描述
colorsSeries&lt;Option&lt;Color&gt;&gt;逐 K 线背景色。每项用指定颜色填充该 K 线的整个垂直条(从窗格顶部到底部)。通常使用半透明颜色(高 alpha/透明度)以着色背景而不遮挡图表数据。None = 该 K 线无填充/透明。
offseti32将背景色序列按给定 K 线数左右偏移。默认:0。渲染器应在 bar_index + offset 而非 bar_index 处应用颜色。
titleOption&lt;String&gt;图表图例和数据窗口中显示的标题。None = 无标题。
show_lastOption&lt;usize&gt;若设置,仅对最末 N 根 K 线应用背景色。更早的 K 线不填充。None = 应用至全部。
displayPlotDisplay控制 bg_color 数据可见位置的位标志。仅当设置 PANE 标志时在图表上渲染。参见 PlotDisplay
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

渲染:

每根 K 线:若 colors[bar_index]None,用指定颜色填充该 K 线的垂直条(从窗格顶到底)。通常为半透明。


Fill

填充两个锚点(两个图形或两条 hline)之间的区域。由 fill() 函数产生。

示例:

navi
let p1 = plot(ta.sma(close, 10));
let p2 = plot(ta.sma(close, 20));
fill(p1, p2, color: color.new(color.BLUE, 80));

字段:

字段类型描述
fromFillAnchor填充区域的第一边界。引用 Plot 序列图(通过 SeriesGraphId)或 Hline 图形(通过 GraphId)。两个锚点必须为同一类型 —— 不能混合 Plot 与 Hline。
toFillAnchor填充区域的第二边界。与 from 锚点类型相同。每根 K 线在 fromto 的 Y 值之间绘制填充。
colorsSeries<Option<FillColor>>逐 K 线填充颜色或渐变。每项可为 Solid(Color) 表示均匀填充,或 Gradient(Gradient) 表示基于 Y 位置在两种颜色间插值的垂直渐变。None = 该 K 线无填充。可随 K 线动态变化。
titleOption<String>图表图例和数据窗口中显示的标题。None = 无标题。
show_lastOption<usize>若设置,仅填充最末 N 根 K 线。更早的 K 线不填充。None = 填充全部。
fillgapsbool当一个锚点在 K 线上有 na(缺失)值时控制行为。true = 使用缺失锚点的最后已知值,因此填充跨越空值。false = 任锚点为 na 的 K 线上填充中断。
displayPlotDisplay控制填充数据可见位置的位标志。仅当设置 PANE 标志时在图表上渲染。参见 PlotDisplay

Gradient 结构体(由 FillColor::Gradient 使用):

字段类型描述
top_valuef64color1 完全生效的 Y 轴价格。等于或高于此值的点完全以 color1 渲染。
bottom_valuef64color2 完全生效的 Y 轴价格。等于或低于此值的点完全以 color2 渲染。
color1Colortop_value 处应用的颜色。渐变在两值之间从 color1 线性插值到 color2
color2Colorbottom_value 处应用的颜色。

渲染逻辑:

// Resolve anchor Y values
for bar_index in 0..chart.series_len():
    y1 = resolve_anchor(fill.from, bar_index)   // f64 or None
    y2 = resolve_anchor(fill.to, bar_index)      // f64 or None

    if y1 is None or y2 is None:
        if fillgaps: use last known values
        else: skip this bar

    fill_color = fill.colors[bar_index]
    if fill_color is None:
        continue

    match fill_color:
        Solid(color) -> fill_rect(x, min(y1,y2), bar_width, abs(y1-y2), color)
        Gradient(g)  -> fill_gradient(x, y1, y2, g.color1, g.color2, g.top_value, g.bottom_value)

解析锚点:

  • FillAnchor::Plot(id) -> chart.series_graph(id)?.as_plot()?.series[bar_index]
  • FillAnchor::Hline(id) -> chart.graph(id)?.as_hline()?.value(对所有 K 线恒定)

非序列图(绘图对象)

使用 chart.graphs() 迭代。每项为 (GraphId, &Graph) 对。这些为时间点对象 —— 不按 K 线索引。它们具有显式坐标。

rust
for (id, graph) in chart.graphs() {
    match graph {
        Graph::Hline(h) => { /* render horizontal line */ }
        Graph::Label(l) => { /* render label */ }
        Graph::Line(l)  => { /* render line */ }
        Graph::LineFill(lf) => { /* render line fill */ }
        Graph::Box(b)   => { /* render box */ }
        Graph::Polyline(p) => { /* render polyline */ }
        Graph::Table(t) => { /* render table */ }
    }
}

或使用访问方法:graph.as_hline()graph.as_label() 等。


Hline

固定价格水平的水平线。由 hline() 函数产生。

示例:

navi
hline(70, "Overbought", color: color.RED, linestyle: HlineStyle.Dashed);

字段:

字段类型描述
valuef64绘制水平线的固定 Y 轴值。该值处线条横跨整个窗格宽度。必须为常量(非逐 K 线)。
colorOption&lt;Color&gt;水平线颜色。必须为常量。None = 使用默认颜色。
titleOption&lt;String&gt;图表图例和数据窗口中显示的标题。None = 无标题。
line_styleHlineStyle水平线描边模式:SolidDashedDotted。参见 HlineStyle
line_widthi32水平线像素宽度。默认:1
displayPlotDisplay控制 hline 可见位置的位标志。注意:hline 使用简化的 display,仅支持 display.nonedisplay.all。参见 PlotDisplay
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置 —— hlineforce_overlay 参数。

渲染: 根据 force_overlay 确定目标窗格及其值范围(与其他视觉元素逻辑相同)。在该窗格全宽处,绘制与 value 对应像素 Y 处的水平线。


Label

带可选背景形状的定位文本标注。由 Navi 中的 label.new() 产生。

示例:

navi
label.new(bar_index, high, "Buy Signal", style: LabelStyle.LabelDown, color: color.GREEN);

字段:

字段类型描述
xi64标签锚点的 X 坐标。解释取决于 xlocXLocation::Index 时为 0 基 K 线索引;XLocation::Time 时为毫秒级 Unix 时间戳。
yf64标签锚点的 Y 坐标(价格值)。ylocAboveBarBelowBar 时忽略此值,标签相对于给定 X 处 K 线的最高/最低价定位。
textString标签内显示的文本内容。支持 \n 多行。
xlocXLocationX 轴坐标系。Index = K 线索引(默认),Time = 毫秒级 Unix 时间戳。决定 x 的解释方式。
ylocYLocationY 轴定位模式。Price(默认)= 将 y 用作精确价格坐标。AboveBar = 在给定 X 处 K 线最高价上方定位。BelowBar = 在给定 X 处 K 线最低价下方定位。
colorOption<Color>标签形状的背景填充色。视觉形状由 style 决定。None = 透明背景。
styleLabelStyle控制标签背景的视觉形状:方向性气泡(上、下、左、右)、箭头、几何形状(圆、菱形、方形、三角)或纯文本(None)。参见 LabelStyle
text_colorOption<Color>标签内文本颜色。None = 使用默认文本颜色。
sizeu32文本字体大小(磅)。
text_alignHorizontalAlign文本在标签区域内的水平对齐:LeftCenterRight。仅对多行或比文本宽的标签有意义。
tooltipOption<String>用户悬停标签时在工具提示弹窗中显示的文本。None = 无工具提示。支持 \n 多行。
text_font_familyFontFamily标签文本字体族:Default(比例)或 Monospace
text_formattingTextFormatting文本样式:None(常规)、BoldItalic
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

Line

两点之间的线段。由 Navi 中的 line.new() 产生。

示例:

navi
line.new(bar_index[10], high[10], bar_index, high, color: color.BLUE, width: 2);

字段:

字段类型描述
x1i64线段起点的 X 坐标。解释取决于 xloc:K 线索引或毫秒级 Unix 时间戳。
y1f64线段起点的 Y 坐标(价格)。
x2i64线段终点的 X 坐标。与 x1 相同坐标系。
y2f64线段终点的 Y 坐标(价格)。
xlocXLocationX 轴坐标系。Index = K 线索引(默认),Time = 毫秒级 Unix 时间戳。适用于 x1x2
extendExtend控制线段是否在其定义端点之外延伸。None(默认)= 仅在 (x1,y1) 与 (x2,y2) 之间绘制。Left = 在 (x1,y1) 左侧无限延伸。Right = 在 (x2,y2) 右侧无限延伸。Both = 双向延伸。延伸沿线段斜率。
colorOption&lt;Color&gt;线段描边颜色。None = 使用默认颜色。
styleLineStyle描边模式:Solid(默认)、DashedDotted。参见 LineStyle
widthi32线段描边像素宽度。默认:1
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。
start_capLineEndpointx1(起点)端的装饰。None = 无装饰(默认),Arrow = 填充箭头。参见 LineEndpoint
end_capLineEndpointx2(终点)端的装饰。None = 无装饰(默认),Arrow = 填充箭头。参见 LineEndpoint

LineFill

填充两条 Line 对象之间的区域。由 Navi 中的 linefill.new() 产生。

字段:

字段类型描述
line1GraphId第一条 Line 绘图对象的 ID。通过 chart.graph(line1) 解析获取线段端点。两条线必须存在且有效才能渲染填充。
line2GraphId第二条 Line 绘图对象的 ID。通过 chart.graph(line2) 解析。填充绘制在两条线之间的区域。
colorOption&lt;Color&gt;两条线之间区域的填充颜色。通常为半透明。None = 透明(不渲染填充)。

渲染: 通过各自的 GraphId 解析两条线,然后填充它们形成的多边形/区域。填充区域由两条线段(或若任一线设置了 extend 则为其延伸)界定。若任一线被删除或缺失,则不渲染填充。


Box

带可选文本的轴对齐矩形。由 Navi 中的 box.new() 产生。

示例:

navi
box.new(bar_index - 10, high, bar_index, low, bgcolor: color.new(color.BLUE, 80));

字段:

字段类型描述
lefti64左边缘的 X 坐标。解释取决于 xloc:K 线索引或毫秒级 Unix 时间戳。
topf64上边缘的 Y 坐标(较高价格值)。
righti64右边缘的 X 坐标。与 left 相同坐标系。
bottomf64下边缘的 Y 坐标(较低价格值)。
border_colorOption<Color>矩形边框描边颜色。None = 不绘制边框。
border_widthi32矩形边框像素宽度。默认:1。设为 0 表示无边框。
border_styleLineStyle矩形边框描边模式:Solid(默认)、DashedDotted。参见 LineStyle
extendExtend控制矩形是否在左右边缘外延伸。None(默认)= 仅在 leftright 之间绘制。Left = 左边缘延伸至图表起始。Right = 右边缘延伸至图表末端。Both = 双向延伸。上下 Y 值保持不变。
xlocXLocationleftright 的 X 轴坐标系。Index = K 线索引(默认),Time = 毫秒级 Unix 时间戳。
background_colorOption<Color>矩形内部填充色。通常为半透明。None = 透明(无填充)。
textString矩形内显示的文本,根据 text_haligntext_valign 定位。空字符串 = 无文本。支持 \n 多行。
text_sizeu32文本字体大小(磅)。
text_colorOption<Color>矩形内文本颜色。None = 使用默认文本颜色。
text_halignHorizontalAlign文本在矩形内的水平对齐:LeftCenter(默认)或 Right
text_valignVerticalAlign文本在矩形内的垂直对齐:TopMiddle(默认)或 Bottom
text_wrapTextWrap文本换行行为:Auto = 换行以适应矩形宽度,None = 不换行(文本可能溢出)。
text_font_familyFontFamily文本字体族:Default(比例)或 Monospace
text_formattingTextFormatting文本样式:None(常规)、BoldItalic
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

Polyline

连接的线段序列(可选闭合和/或曲线)。由 Navi 中的 polyline.new() 产生。

字段:

字段类型描述
pointsVec<(i64, f64)>定义折线路径的 (x, y) 顶点有序列表。X 为 K 线索引,Y 为价格。点按顺序连接。空列表表示不绘制任何内容。
curvedbool控制点之间的插值。true = 先由点列推导出三次贝塞尔平滑段,再渲染为经过这些点的平滑曲线。false = 用直线段连接点。
closedbool控制路径是否形成闭合形状。true = 将最后点连接回第一点形成多边形。false = 路径开放(首尾点不连接)。
line_colorOption<Color>折线路径描边颜色。None = 不绘制描边。
fill_colorOption<Color>内部填充颜色。仅当 closedtrue 时有意义 —— 填充闭合多边形内部。closedfalse 时忽略。None = 无填充。通常为半透明。
line_styleLineStyle折线描边模式:SolidDashedDotted。参见 LineStyle
line_widthi32折线描边像素宽度。默认:1
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

渲染:

  1. 将所有 (x, y) 点转换为像素坐标。
  2. curved:先根据点列生成三次贝塞尔平滑段,再渲染得到平滑路径。
  3. closed:将最后点连接至第一点。
  4. line_colorline_styleline_width 描边路径。
  5. 若设置 fill_colorclosed:填充内部。

Table

锚定在图表固定位置的单元格网格。由 Navi 中的 table.new() 产生。

示例:

navi
var t = Table.new(Position.TopRight, 2, 3);
table.cell(t, 0, 0, "Header", text_color: color.WHITE, bgcolor: color.BLUE);

字段:

字段类型描述
positionPosition表格在图表上的锚定位置。表格作为浮动叠加层在 9 个位置之一渲染(如 TopRightBottomCenterMiddleLeft)。表格不随图表滚动 —— 保持在指定位置。参见 Position
background_colorOption&lt;Color&gt;整个表格的背景色。应用于所有单元格后方。None = 透明。
frame_colorOption&lt;Color&gt;外框(整个表格周围边框)颜色。None = 无外框。
frame_widthi32外框像素宽度。默认:0(无框)。
border_colorOption&lt;Color&gt;单元格之间网格线的默认边框颜色。None = 无单元格边框。
border_widthi32单元格边框默认像素宽度。默认:0(无边框)。
force_overlaybooltrue = 在主图窗格绘制。false = 在副图绘制。默认为脚本的 overlay 设置。

方法:

方法返回类型描述
num_columns()usize列数
num_rows()usize行数
cell(row, col)&TableCell访问单元格(越界时 panic)
cell_opt(row, col)Option&lt;&TableCell&gt;访问单元格(越界时返回 None)

TableCell 字段:

字段类型描述
textString单元格内显示的文本内容。支持 \n 多行。空字符串 = 无文本。
widthf32单元格宽度占图表可用宽度的百分比。0.0 = 根据内容自动调整。值为百分比(如 25.0 = 图表宽度的 25%)。
heightf32单元格高度占图表可用高度的百分比。0.0 = 根据内容自动调整。
text_colorOption&lt;Color&gt;单元格内文本颜色。None = 使用默认文本颜色。
text_halignHorizontalAlign文本在单元格内的水平对齐:LeftCenter(默认)或 Right
text_valignVerticalAlign文本在单元格内的垂直对齐:TopMiddle(默认)或 Bottom
text_sizeu32文本字体大小(磅)。
background_colorOption&lt;Color&gt;该单元格的背景色。覆盖表格级 background_colorNone = 继承自表格。
tooltipOption&lt;String&gt;用户悬停单元格时在工具提示弹窗中显示的文本。None = 无工具提示。
text_font_familyFontFamily单元格文本字体族:Default(比例)或 Monospace
text_formattingTextFormatting文本样式:None(常规)、BoldItalic
colspanusize该单元格跨列的列数。默认:1。大于 1 时将该单元格与右侧相邻单元格合并。
rowspanusize该单元格跨行的行数。默认:1。大于 1 时将该单元格与下方相邻单元格合并。

K 线颜色

通过 chart.bar_colors() 访问。控制主 K 线/条形图的逐 K 线颜色覆盖。由 bar_color() 函数产生。

示例:

navi
**字段:**

| 字段 | 类型 | 描述 |
|------|------|------|
| `colors` | `Series&lt;Option&lt;Color&gt;&gt;` | 主 K 线/条形图的逐 K 线颜色覆盖。设置后,整根 K 线或条(实体、影线、边框)以此颜色绘制,覆盖默认的涨跌配色。`None` = 该 K 线无覆盖(使用图表默认配色)。 |
| `offset` | `i32` | 将颜色序列按给定 K 线数左右偏移。默认:`0`。渲染器应在 `bar_index + offset` 而非 `bar_index` 处应用颜色覆盖。 |
| `show_last` | `Option&lt;usize&gt;` | 若设置,仅对最末 N 根 K 线应用颜色覆盖。更早的 K 线使用默认配色。`None` = 应用至全部。 |
| `title` | `Option&lt;String&gt;` | 图表图例和数据窗口中显示的标题。`None` = 无标题。 |
| `display` | `PlotDisplay` | 控制 bar_color 数据可见位置的位标志。仅当设置 `PANE` 标志时应用颜色覆盖。参见 [PlotDisplay](#plotdisplay-bitflags)。 |

**渲染:** 绘制主 OHLC K 线/条时,检查 `bar_colors.colors[bar_index]`。若为 `Some(color)`,使用该颜色替代默认涨跌配色。

---

## 成交订单(策略)

对于策略脚本,`chart.filled_orders_on_bar(bar_index)` 返回给定 K 线上的成交订单列表。每项为 `FilledOrder`(信号/订单 ID、价格、带符号数量)。

**FilledOrder 字段:**

| 字段 | 类型 | 描述 |
|------|------|------|
| `order_id` | `String` | `strategy.entry()`、`strategy.exit()` 或 `strategy.order()` 中的信号名(入场/出场 ID)。显示在图表上的成交标记旁。 |
| `price` | `f64` | 订单成交价格。用作在图表上渲染成交标记时的 Y 坐标。 |
| `quantity` | `f64` | 该次执行的成交量(合约/股数)。正 = 买入,负 = 卖出。用符号决定标记方向(如买入用上箭头,卖出用下箭头)。 |

渲染器应绘制每笔成交,并显示其信号名(`order_id`)和带符号数量:买入在 K 线上方,卖出在下方;同一 K 线多笔成交叠加。若需每 K 线总量,对列表中的 `quantity` 求和。

---

## 枚举参考

### ScriptInfo Enums

**Format** — 副图 Y 轴标签及十字准线/工具提示中的数值格式:

| 变体 | 描述 | 示例输出 |
|------|------|----------|
| `Inherit` | 使用图表默认格式(默认) | `150.25` |
| `Price` | 格式化为价格 | `150.25` |
| `Volume` | 使用成交量缩写 | `1.5M`、`200K` |
| `Percent` | 格式化为百分比 | `3.14%` |
| `MinTick` | 使用品种最小 tick 大小格式化 | (不可用时视为 `Price`) |

`format` 应用于所有副图轴标签和工具提示数值。主图价格轴(K 线图窗格)始终使用价格格式,不受此字段影响。

**ScaleType** — 价格刻度位置:

| 变体 | 描述 |
|------|------|
| `None` | 自动/无专用刻度(默认) |
| `Left` | 显示在左侧刻度 |
| `Right` | 显示在右侧刻度 |

### Plot Enums

**PlotStyle** — `Plot` 的渲染样式:

| 变体 | 描述 |
|------|------|
| `Line` | 用直线段连接点(默认) |
| `LineBr` | 类似 `Line`,但在 na 处断开 |
| `StepLine` | 阶梯线(先水平后垂直) |
| `StepLineBr` | 类似 `StepLine`,但在 na 处断开 |
| `Area` | 线条与 `histbase` 之间的填充区域 |
| `AreaBr` | 类似 `Area`,但在 na 处断开 |
| `Histogram` | 从 `histbase` 到值的细垂直柱 |
| `Columns` | 从 `histbase` 到值的宽垂直柱 |
| `Circles` | 每点处圆形标记 |
| `Cross` | 每点处十字 (+) 标记 |
| `Diamond` | 每点处菱形标记 |

**PlotLineStyle** — 基于线条图形的描边模式:

| 变体 | 描述 |
|------|------|
| `Solid` | 实线描边(默认) |
| `Dashed` | 虚线描边 |
| `Dotted` | 点线描边 |

**HlineStyle** — 水平线描边模式:

| 变体 | 描述 |
|------|------|
| `Solid` | 实线描边 |
| `Dashed` | 虚线描边 |
| `Dotted` | 点线描边 |

### Shape / Marker Enums

**Shape** — `PlotShape` 的符号类型:

| 变体 | 视觉 |
|------|------|
| `XCross` | X 形(默认) |
| `Cross` | + 形 |
| `Circle` | 圆形 |
| `Square` | 方形 |
| `Diamond` | 菱形 |
| `TriangleUp` | 向上三角形 |
| `TriangleDown` | 向下三角形 |
| `ArrowUp` | 向上箭头 |
| `ArrowDown` | 向下箭头 |
| `Flag` | 旗帜 |
| `LabelUp` | 指向上方的标签 |
| `LabelDown` | 指向下方的标签 |

**Location** — `PlotShape` / `PlotChar` 的垂直位置:

| 变体 | 描述 |
|------|------|
| `AboveBar` | K 线最高价上方的固定偏移(默认) |
| `BelowBar` | K 线最低价下方的固定偏移 |
| `Absolute` | 将序列值用作 Y 坐标 |
| `Top` | 在窗格顶部 |
| `Bottom` | 在窗格底部 |

**Size** — 形状和字符的大小:

| 变体 | 描述 |
|------|------|
| `Auto` | 自动调整大小(默认) |
| `Tiny` | 超小 |
| `Small` | 小 |
| `Normal` | 标准大小 |
| `Large` | 大 |
| `Huge` | 超大 |

### Drawing Enums

**LineStyle** — `Line`、`Box` 边框、`Polyline` 的描边模式:

| 变体 | 描述 |
|------|------|
| `Solid` | 实线描边(默认) |
| `Dashed` | 虚线描边 |
| `Dotted` | 点线描边 |

**LineEndpoint** — `Line` 端点装饰(`start_cap` / `end_cap`):

| 变体 | 描述 |
|------|------|
| `None` | 无装饰(默认) |
| `Arrow` | 端点处的填充箭头 |

**Extend** — 线/矩形延伸模式:

| 变体 | 描述 |
|------|------|
| `None` | 不延伸(默认) |
| `Left` | 向左无限延伸 |
| `Right` | 向右无限延伸 |
| `Both` | 双向无限延伸 |

**LabelStyle** — `Label` 的形状样式:

| 变体 | 描述 |
|------|------|
| `None` | 仅文本,无背景形状 |
| `LabelDown` | 向下的标签气泡(默认) |
| `LabelUp` | 向上的标签气泡 |
| `LabelLeft` | 向左的标签气泡 |
| `LabelRight` | 向右的标签气泡 |
| `LabelCenter` | 居中的标签气泡 |
| `LabelLowerLeft` | 左下标签气泡 |
| `LabelLowerRight` | 右下标签气泡 |
| `LabelUpperLeft` | 左上标签气泡 |
| `LabelUpperRight` | 右上标签气泡 |
| `ArrowDown` | 向下箭头 |
| `ArrowUp` | 向上箭头 |
| `Circle` | 圆形 |
| `Cross` | 十字 (+) 形 |
| `Diamond` | 菱形 |
| `Square` | 方形 |
| `Flag` | 旗帜形 |
| `TriangleDown` | 向下三角形 |
| `TriangleUp` | 向上三角形 |
| `XCross` | X 形 |
| `TextOutline` | 带轮廓的文本,无填充 |

### Coordinate Enums

**XLocation** — X 轴坐标系:

| 变体 | 描述 |
|------|------|
| `Index` | X 值为 K 线索引(0 基整数) |
| `Time` | X 值为毫秒级 Unix 时间戳 |

**YLocation** — Y 轴定位(仅标签):

| 变体 | 描述 |
|------|------|
| `Price` | Y 为 Y 轴上的价格值(默认) |
| `AboveBar` | 在给定 X 处 K 线最高价上方 |
| `BelowBar` | 在给定 X 处 K 线最低价下方 |

### Position Enum

表格在图表上的锚定位置:

| 变体 | 描述 |
|------|------|
| `TopLeft` | 左上角 |
| `TopCenter` | 顶部居中 |
| `TopRight` | 右上角 |
| `MiddleLeft` | 左侧居中 |
| `MiddleCenter` | 图表中心 |
| `MiddleRight` | 右侧居中 |
| `BottomLeft` | 左下角 |
| `BottomCenter` | 底部居中 |
| `BottomRight` | 右下角 |

### Text Enums

| 枚举 | 变体 | 描述 |
|------|------|------|
| `HorizontalAlign` | `Left`、`Center`、`Right` | 文本水平对齐 |
| `VerticalAlign` | `Top`、`Middle`、`Bottom` | 文本垂直对齐 |
| `FontFamily` | `Default`、`Monospace` | 字体选择 |
| `TextFormatting` | `None`、`Bold`、`Italic` | 文本样式 |
| `TextWrap` | `Auto`、`None` | 文本换行行为 |

### Fill Enums

**FillAnchor** — `Fill` 的边界引用:

| 变体 | 描述 |
|------|------|
| `Plot(SeriesGraphId)` | 引用 `Plot` 序列图 |
| `Hline(GraphId)` | 引用 `Hline` 图形 |

**FillColor** — 填充颜色类型:

| 变体 | 描述 |
|------|------|
| `Solid(Color)` | 均匀填充颜色 |
| `Gradient(Gradient)` | 两值间的垂直渐变 |

---

## 渲染顺序

推荐的绘制顺序(从后到前):

1. **图表背景** — 用主题背景色清空。
2. **网格线** — 价格和时间轴网格线。
3. **背景色** — 迭代 `series_graphs`,绘制 `BackgroundColor` 条。
4. **填充** — 迭代 `series_graphs`,绘制锚点之间的 `Fill` 区域。
5. **主 K 线/条** — 输入 OHLC 数据(应用 `bar_colors` 覆盖)。若 `behind_chart` 为 `false`,在其上绘制脚本视觉元素;否则在其后绘制。
6. **Hline** — 迭代 `graphs`,绘制水平线。
7. **Plot 序列** — 迭代 `series_graphs`,绘制 `Plot`(线、面积、直方图、标记)。
8. **扩展序列** — 迭代 `series_graphs`,绘制 `PlotCandle`、`PlotBar`、`PlotArrow`、`PlotChar`、`PlotShape`。
9. **绘图对象** — 迭代 `graphs`,绘制 `Line`、`Box`、`Polyline`、`LineFill`。
10. **Label** — 迭代 `graphs`,绘制 `Label`(文本 + 形状)。
11. **Table** — 迭代 `graphs`,在其锚定位置绘制 `Table`。
12. **坐标轴** — 价格刻度、时间刻度、成交量刻度。
13. **订单成交** — 对于策略,从 `filled_orders` 绘制成交标记。
14. **十字线/交互叠加层** — 鼠标跟踪、工具提示。

若 `explicit_plot_zorder` 为 `true`,严格按迭代顺序(即脚本中的声明顺序)绘制序列图。先声明 = 底层。

若任何视觉元素的 `force_overlay` 为 `true`,无论脚本是否为叠加,均在主图价格窗格渲染。

当设置 `show_last` 时,仅渲染最后 N 项。当设置 `offset` 时,按该 K 线数偏移视觉元素。

## 下一步

- [错误处理](/zh-CN/guide/integration/vm-errors) — 处理编译和运行时错误

基于 MIT 许可证发布。