У меня есть следующий PineScript, чтобы проверить, находится ли значение RSI 2 или более последовательных свечей в пределах диапазона, указанного в условии if
//@version=5
indicator("RSICondition", overlay=true, max_bars_back = 20)
RSI = ta.rsi(close, 14)
varip int ToPlot = 0 //0 means nothing to plot, 1 means to plot RED-BOX
varip int left = 0 //Pointer for the left edge of the box
varip float highestHigh = na //Declaring Global Variable
varip float lowestLow = na //Declaring Global Variable
if (RSI >= 58 and RSI <= 62)
left := left + 1
if (left > 1) //If we have consecutive candles within 58 & 62, eg. lets take 3 consecutive candles
highestHigh := ta.highest(high, left) //Calculating the Highest High from the 3 candles
lowestLow := ta.lowest(low, left) //Calculating the Lowest Low from the 3 candles
ToPlot := 1 //Specifying RED color box to plot
else
if (ToPlot == 1) //When the candle after 3 consecutive candles within specified range comes, time to plot RED box for those 3 candles
box.new(bar_index[left], highestHigh, bar_index[1], lowestLow, border_color=color.red, bgcolor=color.new(color.red, 80))
ToPlot := 0 //Reset ToPlot to 0 after plotting specifying there is nothing to plot now
left := 0 //Reset the pointer after box plotted
Компилятор показывает следующие предупреждения как для ta.lowest
, так и для ta.highest
: The function '<function_name>' should be called on each calculation for consistency. It is recommended to extract the call from this scope
, а также созданные поля показывают неверные значения для переменных highestHigh
и lowestLow
, поскольку они указаны для верхнего и нижнего края поля соответственно.
Я мог бы указать эти функции вне оператора if
, но иногда значение переменной left
также становится равным 0, когда возникает ошибка length for ta.highest and ta.lowest cannot be 0
.
Вы должны оценить ta.highest()
вне условного выражения if.
highestHighTmp = ta.highest(high, math.max(1, left)) // should "left" be 0 you don't use it anyway
lowestLowTmp = ta.lowest(low, math.max(1, left))
if (RSI >= 58 and RSI <= 62)
left := left + 1
if (left > 1)
highestHigh := highestHighTmp
lowestLow := lowestLowTmp
ToPlot := 1
...
Я не уверен, что понимаю тебя. 2 части моего решения для предупреждения, выданного телевизором: 1. извлеките ta.highest() за пределы if 2. убедитесь, что скрипт не сломается с длиной == 0. Обе части верны и работают по назначению, как таковые. Проверьте это просто с помощью "indicator("RSICondition", overlay=true, max_bars_back = 20) plot(ta.highest(high, math.max(1, 4)))" Это всегда возвращает вам самое высокое значение за последние 4 бара. . Я предполагаю, что у вас есть другая проблема, например, динамическая установка "left", но эта проблема больше не имеет ничего общего с ta.highest().
Я имею в виду, что даже когда значение 'left' равно 4, переменные наивысшийHighTmp и наименьшийLowTmp получают значение, как будто левое значение равно 1, хотя значение левого поля оказывается правильным в других областях, просто проблема в том, где ta Используются .highest и ta.lowest.
Это может сработать, но теперь проблема заключается в том, что даже когда «left = 4», переменная «highestHighTmp» получает значение, где «left = 1». Он не принимает значение «влево» = 4. Я проверил значение «влево», нанеся его отдельно. Если я вручную поставлю «4» вместо «левой» переменной, я получу правильный ответ, но не тогда, когда туда будет помещена «левая» переменная. Я также попытался удалить функцию «math.max» и напрямую поместить переменную «left», но безуспешно.