You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pine Script中calc_on_every_tick=true时如何获取上一个tick的值?

解决Pine Script Tick级价格对比问题

在Pine Script中,close[1]是基于当前K线周期的上一根已完成K线收盘价,而非上一个tick的价格。要实现tick级的价格对比,需要手动维护上一个tick的价格值,具体方案如下:

核心思路

使用var关键字声明变量存储上一个tick的价格——var变量只会在脚本初始化时赋值一次,后续不会随K线重置,能持续保留tick级的历史值。每次tick更新时,先对比当前价格与保存的上一个tick价格,再更新变量为当前价格。

基础代码示例

//@version=5
indicator("Tick级价格对比", overlay=true, calc_on_every_tick=true)

// 初始化变量存储上一个tick的收盘价,var确保只初始化一次
var float prev_tick_close = na

// 仅在实时tick触发时执行逻辑,避免回测重复计算
if barstate.isrealtime
    // 判断当前tick收盘价是否高于上一个tick
    is_higher = close > prev_tick_close
    
    // 示例:当前tick价格更高时,在价格下方画绿色向上标记
    plotshape(is_higher, title="Tick Higher", location=location.belowbar, color=color.new(color.green, 0), style=shape.labelup, text="↑", textcolor=color.white)
    
    // 更新上一个tick的收盘价为当前值
    prev_tick_close := close

扩展:记录多tick历史

如果需要保存更多tick的历史数据,可以使用array实现:

//@version=5
indicator("多Tick历史记录", overlay=true, calc_on_every_tick=true)

// 初始化数组存储最近10个tick的收盘价
var array<float> tick_closes = array.new_float(10)

if barstate.isrealtime
    // 将当前收盘价添加到数组开头
    array.unshift(tick_closes, close)
    // 保持数组长度不超过设定值
    if array.size(tick_closes) > 10
        array.pop(tick_closes)
    
    // 获取上一个tick的收盘价(数组第二个元素)
    prev_tick_close = array.get(tick_closes, 1)
    is_higher = not na(prev_tick_close) and close > prev_tick_close
    
    // 示例:价格更高时画绿色小圆点
    plotshape(is_higher, title="Tick Higher", location=location.belowbar, color=color.green, style=shape.circle, size=size.small)

关键说明

  • barstate.isrealtime:确保逻辑只在实时行情的tick更新时执行,避免回测阶段重复计算
  • var关键字:保证变量不会随新K线生成而重置,持续保留tick级状态
  • 初始值设为na:第一个tick时不会触发对比(无历史值),从第二个tick开始正常工作

内容的提问来源于stack exchange,提问作者iForests

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:21:00