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)
关键修正点说明
- 重置
var变量逻辑:通过barstate.isnew在每个新bar开始时,将高低价初始化为当前bar的开盘价,避免旧数据残留。 - 禁用未来数据:添加
lookahead.barmerge_off参数,确保request.security返回的是已确认的历史数据,无未来值干扰。 - 实时更新高低价:对未闭合的当前bar,用
math.max和math.min实时追踪组合价格的极值,符合K线生成的真实逻辑。 - 优化代码结构:用
switch替代多个if分支,输入命名更贴合期权场景,代码可读性更强。
内容的提问来源于stack exchange,提问作者Ajit Shah
相关产品推荐
相关产品推荐

