PineScript 'ta.lowest' и 'ta.highest' показывает неправильное значение в состоянии 'if'

У меня есть следующий 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.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны оценить 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                     
...

Это может сработать, но теперь проблема заключается в том, что даже когда «left = 4», переменная «highestHighTmp» получает значение, где «left = 1». Он не принимает значение «влево» = 4. Я проверил значение «влево», нанеся его отдельно. Если я вручную поставлю «4» вместо «левой» переменной, я получу правильный ответ, но не тогда, когда туда будет помещена «левая» переменная. Я также попытался удалить функцию «math.max» и напрямую поместить переменную «left», но безуспешно.

DeshBhakt 26.01.2023 19:28

Я не уверен, что понимаю тебя. 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().

elod008 26.01.2023 21:29

Я имею в виду, что даже когда значение 'left' равно 4, переменные наивысшийHighTmp и наименьшийLowTmp получают значение, как будто левое значение равно 1, хотя значение левого поля оказывается правильным в других областях, просто проблема в том, где ta Используются .highest и ta.lowest.

DeshBhakt 27.01.2023 15:25

Другие вопросы по теме