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

Pine Script中跨式期权K线图开高低收盘价不符问题求助

修正Nifty跨式期权K线图Pine Script代码问题

问题描述

我用以下Pine Script v5代码生成Nifty跨式期权K线图,但在TradingView中绘制的图表高低价数值和预期不符。已经尝试过barmerge.gaps和lookahead参数,问题仍未解决,希望修正代码以获取正确数值。

原始代码

//@version=5
indicator('Straddle', shorttitle='Options_Straddle', timeframe='', overlay = false)
OptionsChart1 = input.symbol('', title='OptionsChart1 Symbol')
OptionsChart2 = input.symbol('', title='OptionsChart2 Symbol')
_developingLineStyle = 'Combined'

var o = 0.00
var h = 0.00
var l = 0.00
var c = 0.00

[oo, hh, ll, cc] = request.security(OptionsChart1, timeframe.period, [open, high, low, close], barmerge.gaps_on)
[ooo , hhh, lll , ccc]= request.security(OptionsChart2, timeframe.period, [open, high, low, close], barmerge.gaps_on)

if _developingLineStyle == 'Combined'

    o := oo + ooo
    h := hh + hhh
    l := ll + lll
    c := cc + ccc

// if _developingLineStyle == 'Difference'

//     o := oo - ooo
//     h := hh - hhh
//     l := ll - lll
//     c := cc - ccc

// if _developingLineStyle == 'Ratio'
//     o := oo / ooo
//     h := hh / hhh
//     l := ll / lll
//     c := cc / ccc


ourWickColor = c > c[1] ? color.green : color.red
plotcandle(o, h , l, c, title='OptionsStraddle', color=ourWickColor, force_overlay = false)

问题分析与修正方案

你的代码存在三个核心问题导致高低价异常:

  • var关键字误用:var声明的变量仅初始化一次,后续不会自动重置,旧数据持续累积干扰计算。
  • 缺失lookahead参数:默认的lookahead.barmerge会引入未来数据,破坏计算的实时准确性。
  • K线高低价逻辑错误:直接将两个合约的K线高低开收分别相加,不符合跨式期权组合价格的实时波动逻辑——正确做法是先计算每个时刻的组合价格,再基于这些价格生成K线的高低开收。

修正后的代码如下:

//@version=5
indicator('Nifty跨式期权K线图', shorttitle='Nifty_Straddle', timeframe='', overlay=false)

// 输入两个期权合约标的
call_contract = input.symbol("", title="认购期权合约")
put_contract = input.symbol("", title="认沽期权合约")
style = input.string("Combined", title="计算方式", options=["Combined", "Difference", "Ratio"])

// 获取两个合约的实时开高低收,禁用未来数据
[call_o, call_h, call_l, call_c] = request.security(call_contract, timeframe.period, [open, high, low, close], barmerge.gaps_on, lookahead.barmerge_off)
[put_o, put_h, put_l, put_c] = request.security(put_contract, timeframe.period, [open, high, low, close], barmerge.gaps_on, lookahead.barmerge_off)

// 初始化组合后的开高低收变量
var float combo_o = na
var float combo_h = na
var float combo_l = na
var float combo_c = na

// 根据计算方式生成组合价格
switch style
    "Combined"
        combo_o := call_o + put_o
        combo_c := call_c + put_c
        current_price = call_h + put_h
    "Difference"
        combo_o := call_o - put_o
        combo_c := call_c - put_c
        current_price = call_h - put_h
    "Ratio"
        combo_o := call_o / put_o
        combo_c := call_c / put_c
        current_price = call_h / put_h

// 每个新bar开始时重置高低价为开盘价
if barstate.isnew
    combo_h := combo_o
    combo_l := combo_o

// 实时更新当前未闭合bar的高低价
combo_h := math.max(combo_h, current_price)
combo_l := math.min(combo_l, current_price)

// 设置K线颜色
candle_color = combo_c > combo_c[1] ? color.new(color.green, 0) : color.new(color.red, 0)

// 绘制组合K线
plotcandle(combo_o, combo_h, combo_l, combo_c, title="跨式期权组合", color=candle_color, wickcolor=candle_color)

关键修正点说明

  1. 重置var变量逻辑:通过barstate.isnew在每个新bar开始时,将高低价初始化为当前bar的开盘价,避免旧数据残留。
  2. 禁用未来数据:添加lookahead.barmerge_off参数,确保request.security返回的是已确认的历史数据,无未来值干扰。
  3. 实时更新高低价:对未闭合的当前bar,用math.max和math.min实时追踪组合价格的极值,符合K线生成的真实逻辑。
  4. 优化代码结构:用switch替代多个if分支,输入命名更贴合期权场景,代码可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:15:59