Проблемы с ошибкой "ссылочные длины max_bars_back"

В настоящее время я работаю над новым скриптом, но сталкиваюсь со странным поведением в зависимости от того, с какими акциями или индексами я сейчас работаю.
Мой новый скрипт отлично работает с некоторыми акциями, но выдает следующую ошибку для других акций, индексов или валютных пар:

Сосна не может определить длину ссылки серии. Попробуйте использовать max_bars_back в функции изучения или стратегии

Я уже читал запись в документации Pine, а также пытался добавить в исследование "max_bars_back" без каких-либо результатов.

Поэтому я разобрал свой скрипт для демонстрационных целей, и теперь у меня есть версия, которая выдает эту ошибку на каждой акции.

Вот код:

//@version=4
study("StackOverflow_Test", overlay = true, max_bars_back=100)

var int loopRange = 0                  
var int trendState = 2                  

var bool firstBreak = true

var float hp_last = low                   
var float hp_current = high               

float tempHighest = 0                   
int tempHighPosition = 0                

var bool waitForConfirmation = false

float source = close              // Used Price

for i = loopRange to 0
    if ( source[i] > tempHighest )
        tempHighest := source[i]
        tempHighPosition := i

if ( source > hp_current )          
    waitForConfirmation := true     
    hp_current := source            

if ( waitForConfirmation )                  
    if ( firstBreak )                   
        firstBreak := false             
        if ( trendState == 1 )          
            trendState := 2
        else                            
            trendState := 0
        hp_last := hp_current[1]           
    
    if ( tempHighPosition > 3 )       
        loopRange := 3                
        waitForConfirmation := false                    
        firstBreak := true                              

loopRange := loopRange + 1                  

color trendLineColor = color.green
if ( trendState == 0 )
    trendLineColor := color.green
else if ( trendState == 1 )
    trendLineColor := color.red
else
    trendLineColor := color.silver

// Plot trendline
plot(source, color = trendLineColor)

Если я удалю первый цикл for или строки:

if ( trendState == 1 )          
    trendState := 2
else                            
    trendState := 0

Ошибка не возникнет.

Я думал, что ошибка означает, что я пытаюсь получить доступ к данным за пределами границ, но я не вижу, где именно...
Кто-нибудь из вас знает, какая строка вызывает такое поведение?

Не могли бы вы отредактировать свой вопрос с объяснением того, чего вы пытаетесь достичь? Я думаю, это позволит сообществу помочь вам. Кроме того, я думаю, что вы неправильно подходите к своей проблеме, используя циклы for.

Bjorn Mistiaen 22.12.2020 16:04

Спасибо за ответ, я добавил больше информации ниже в качестве комментария под ответом Андрея. Но я, возможно, добавлю сюда, почему я использую цикл for. Я хочу искать новые высокие точки и буду использовать их в качестве областей ценности и оценки, если рынок находится в диапазоне или в восходящем тренде. Я не использую методы Highest/Loest, потому что мне не нужен «прорыв» для каждой новой свечи в восходящем тренде. Мне нужна только новая точка максимума в конце восходящего тренда, поэтому, когда определенное количество свечей закрывается ниже новой точки максимума, слева и справа. По этой причине я использую петлю, чтобы получить не только высшую точку

Evox402 23.12.2020 14:52

значение, но и его положение в loopRange. loopRange всегда является последней верхней точкой до новой верхней точки и будет обновляться после подтверждения новой верхней точки.

Evox402 23.12.2020 14:53
Стоит ли изучать 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
3
1 858
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Проблема здесь:

for i = loopRange to 0
    if ( source[i] > tempHighest )
        tempHighest := source[i]
        tempHighPosition := i
...              
loopRange := loopRange + 1  

вы просматриваете всю доступную историю на каждом баре, чтобы найти Highest High. Это неэффективно и дает вам ошибку «ссылка на длину серии». Если вы опишите конечную цель вашего скрипта, мы можем предложить более эффективное решение.

Привет, Борн и Андрей, я хочу найти самое высокое и самое низкое значение в заданном диапазоне, который регулярно корректируется (~ 10-50 свечей большую часть времени). не будет использовать эти методы. Я не понимаю, почему этот цикл вызывает проблемы, я начинаю с диапазона цикла 0 (то есть только 1 итерация), а затем только положительные значения, которые никогда не превышают исторические свечи. Я даже добавил в исследование «max_bars_back=100», чтобы избежать проблем. И самое странное, что мой оригинальный скрипт работает на некоторых акциях, но выдает ошибку

Evox402 23.12.2020 14:20

на других акциях. Таким образом, если цикл будет иметь доступ к большему количеству, чем исторические свечи, он не должен работать на всех акциях, а не только на индексных или валютных парах... Когда я увеличиваю loopRange, начиная с 0, у меня не должно быть способа получить доступ к данным из границы или я что-то упускаю из виду? Как видите, я настраиваю диапазон зацикливания после того, как после последнего максимума формируются 3 нижние свечи. Таким образом, мой ориентир никогда не должен превышать ~50 свечей в прошлом и всегда начинаться с первой свечи последнего максимума.

Evox402 23.12.2020 14:26

Я могу опубликовать весь свой сценарий здесь, но в прошлый раз, когда я делал что-то подобное, люди жаловались, что код слишком длинный и что я должен изолировать и разбить код, чтобы можно было легче увидеть проблему.

Evox402 23.12.2020 14:35

Обновление: я только что попытался добавить if ( loopRange > bar_index) loopRange := bar_index Чтобы убедиться, что невозможно ссылаться на данные дальше, чем на самую первую историческую свечу, но все равно выдает эту ошибку...

Evox402 23.12.2020 14:39
So my reference should be never higher than ~50 candles - если да, то решить проблему можно так: loopRange := min(loopRange + 1, 50)
Andrey D 23.12.2020 17:20

Большое спасибо, кажется, это решило проблему :), я добавил loopRange := min(loopRange + 1, 150) в конце скрипта. Но последний вопрос: я думал, что max_bar_index в исследовании выполняет именно эту цель, не так ли?

Evox402 23.12.2020 18:04
max_bars_back = 150 говорит движку, что максимальная длина истории для всех серий (с историей) переменных и объектов имеет максимум 150 значений истории. Если не указать значение max_bars_back, движок попытается определить максимальную длину истории для каждой переменной серии отдельно на первых 200-300 барах. Если вы обращаетесь к большему количеству истории после 1000-го бара, возникает ошибка «reference lengths max_bars_back».
Andrey D 24.12.2020 14:43

Вместо цикла вы можете попробовать следующий код

решение 1:

tempHighest = highest(source, loopRange)
tempHighPosition = highestbars(source, loopRange)

Однако эти встроенные функции также могут зацикливаться. Следующий код не будет зацикливаться

решение 2:

var tempHighest = 0.0
var tempHighPosition = 0

if (source > tempHighest)
    tempHighest := source
    tempHighPosition := 0
else
    tempHighPosition := tempHighPosition + 1

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