В настоящее время я работаю над новым скриптом, но сталкиваюсь со странным поведением в зависимости от того, с какими акциями или индексами я сейчас работаю.
Мой новый скрипт отлично работает с некоторыми акциями, но выдает следующую ошибку для других акций, индексов или валютных пар:
Сосна не может определить длину ссылки серии. Попробуйте использовать 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. Я хочу искать новые высокие точки и буду использовать их в качестве областей ценности и оценки, если рынок находится в диапазоне или в восходящем тренде. Я не использую методы Highest/Loest, потому что мне не нужен «прорыв» для каждой новой свечи в восходящем тренде. Мне нужна только новая точка максимума в конце восходящего тренда, поэтому, когда определенное количество свечей закрывается ниже новой точки максимума, слева и справа. По этой причине я использую петлю, чтобы получить не только высшую точку
значение, но и его положение в loopRange. loopRange всегда является последней верхней точкой до новой верхней точки и будет обновляться после подтверждения новой верхней точки.
Проблема здесь:
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», чтобы избежать проблем. И самое странное, что мой оригинальный скрипт работает на некоторых акциях, но выдает ошибку
на других акциях. Таким образом, если цикл будет иметь доступ к большему количеству, чем исторические свечи, он не должен работать на всех акциях, а не только на индексных или валютных парах... Когда я увеличиваю loopRange, начиная с 0, у меня не должно быть способа получить доступ к данным из границы или я что-то упускаю из виду? Как видите, я настраиваю диапазон зацикливания после того, как после последнего максимума формируются 3 нижние свечи. Таким образом, мой ориентир никогда не должен превышать ~50 свечей в прошлом и всегда начинаться с первой свечи последнего максимума.
Я могу опубликовать весь свой сценарий здесь, но в прошлый раз, когда я делал что-то подобное, люди жаловались, что код слишком длинный и что я должен изолировать и разбить код, чтобы можно было легче увидеть проблему.
Обновление: я только что попытался добавить if ( loopRange > bar_index) loopRange := bar_index Чтобы убедиться, что невозможно ссылаться на данные дальше, чем на самую первую историческую свечу, но все равно выдает эту ошибку...
So my reference should be never higher than ~50 candles
- если да, то решить проблему можно так: loopRange := min(loopRange + 1, 50)
Большое спасибо, кажется, это решило проблему :), я добавил loopRange := min(loopRange + 1, 150) в конце скрипта. Но последний вопрос: я думал, что max_bar_index в исследовании выполняет именно эту цель, не так ли?
max_bars_back = 150
говорит движку, что максимальная длина истории для всех серий (с историей) переменных и объектов имеет максимум 150 значений истории. Если не указать значение max_bars_back
, движок попытается определить максимальную длину истории для каждой переменной серии отдельно на первых 200-300 барах. Если вы обращаетесь к большему количеству истории после 1000-го бара, возникает ошибка «reference lengths max_bars_back».
Вместо цикла вы можете попробовать следующий код
решение 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
Не могли бы вы отредактировать свой вопрос с объяснением того, чего вы пытаетесь достичь? Я думаю, это позволит сообществу помочь вам. Кроме того, я думаю, что вы неправильно подходите к своей проблеме, используя циклы for.