首页 > 解决方案 > 应在每次计算时调用该函数以保持一致性。建议从三元运算符或作用域中提取调用

问题描述

我在 pine 脚本中遇到错误:- 应在每次计算时调用函数 '#f2' 以保持一致性。建议从三元运算符或范围中提取调用。这是函数:- Variance(src,p) => p == 1 ?0 : Sma(src*src,p) - pow(Sma(src,p),2)

'''
//@version=4
study("My Script",overlay=true,max_bars_back=1000)
//-----------------------------------Trend lines--------------------------------
//Basic
heading11 = input(title="Trend Lines" ,type=input.bool,defval=true)
lengthppl   = input(30,group='Basic Settings'
,tooltip='Pivot length. Use higher values for having lines connected to more significant 
  pivots')
lookbackppl = input(3,minval=1,group='Basic Settings'
,tooltip='Number of lines connecting a pivot high/low to display')
SLOPEPPL    = input(1.,minval=-1,maxval=1,step=0.1,group='Basic Settings'
,tooltip='Allows to multiply the linear regression slopeppl by a number within -1 and 1')

//Style
ph_col = input(#2157f3,'Pivot High Lines Color',group='Line Colors')
pl_col = input(#ff1100,'Pivot Low Lines Color',group='Line Colors')

//──────────────────────────────────────────────────────────────────────────────
Sma (src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)
Variance(src,p) => p == 1 ? 0 : Sma(src*src,p) - pow(Sma(src,p),2)
Covariance(x,y,p) => Sma(x*y,p) - Sma(x,p)*Sma(y,p)
//──────────────────────────────────────────────────────────────────────────────
nppl = bar_index
ph = pivothigh(lengthppl,lengthppl)
pl = pivotlow(lengthppl,lengthppl)
//──────────────────────────────────────────────────────────────────────────────
varip ph_array = array.new_float(0)
varip pl_array = array.new_float(0)
varip ph_n_array = array.new_int(0)
varip pl_n_array = array.new_int(0)
if ph
    array.insert(ph_array,0,ph)
    array.insert(ph_n_array,0,nppl)
if pl
    array.insert(pl_array,0,pl)
    array.insert(pl_n_array,0,nppl)
//──────────────────────────────────────────────────────────────────────────────
val_ph = valuewhen(ph,nppl-lengthppl,lookbackppl-1)
val_pl = valuewhen(pl,nppl-lengthppl,lookbackppl-1)
val = min(val_ph,val_pl)
k = nppl - val > 0 ? nppl - val : 2
slopeppl = Covariance(close,nppl,k)/Variance(nppl,k)*SLOPEPPL
var line ph_l = na,var line pl_l = na
if barstate.islast
    for i = 0 to lookbackppl-1
        ph_y2 = array.get(ph_array,i),ph_x1 = array.get(ph_n_array,i)-lengthppl
        pl_y2 = array.get(pl_array,i),pl_x1 = array.get(pl_n_array,i)-lengthppl
        ph_l := line.new(ph_x1,ph_y2,ph_x1+1,ph_y2+slopeppl,extend=extend.right,color=ph_col)
        pl_l := line.new(pl_x1,pl_y2,pl_x1+1,pl_y2+slopeppl,extend=extend.right,color=pl_col)
        '''

标签: pine-script

解决方案


对时间序列数据进行操作的函数不应位于 if 语句或三元组中。只需将函数作为单独的变量移出:


Variance(src,p) => 
    sma_a = sma(src*src,p)
    sma_b = sma(src,p)
    return = p == 1 ? 0 : sma_a - pow(sma_b,2)
    return

这假设您在 if 或三元或其他范围之外调用该函数。如果没有,则为函数设置一个变量:

variance = Variance(a,b)

然后根据需要在逻辑中使用变量。


推荐阅读