Самый низкий уровень Pine с переменной динамической длиной

#pine-script

#pine-скрипт

Вопрос:

Я хочу найти самый низкий минимум между входом и выходом из сделки для длинной позиции. Поэтому самый низкий уровень имеет динамическую длину, но Pine выдает мне некоторые ошибки: функция ‘ta.lowest’ следует вызывать при каждом вычислении для обеспечения согласованности. Рекомендуется извлекать вызов из тернарного оператора или из области видимости. Сам график не может быть построен. Сообщение об ошибке ссылается на max_bars_back, что не имеет большого смысла.

Это выдержка из моего кода:

 var maeLong         = 0.0
var maxMaeLong      = 0.0
var sinceTrade      = 0

if strategy.position_size != 0
    sinceTrade  := sinceTrade   1
if strategy.position_size == 0    
    sinceTrade  := 0

if strategy.closedtrades[0] > strategy.closedtrades[1] and strategy.position_size[1] > 0    
    sinceTrade          := sinceTrade[1]                                                    
    maeLong             := (open[sinceTrade] - ta.lowest(low, sinceTrade)) / open[sinceTrade]
    maxMaeLong          := maeLong > maxMaeLong ? maeLong : maxMaeLong
 

Решение от Pine https://www.tradingview.com/blog/en/pine-functions-support-dynamic-length-arguments-20554 / не смог мне помочь.

У меня такое чувство, что «если strategy.strategy_position_size != 0» считается неправильно.

Ответ №1:

Хотя ваше мышление верно, даже если мы сможем переместить вашу самую низкую функцию из локальной области, проблема возникает там, где мы запрашиваем слишком много столбцов функции, что приводит к описанной вами ошибке. Итак, я представляю другую альтернативу. Здесь мы используем пользовательскую функцию вашего покорного слуги, чтобы найти наименьшее значение чего-либо, поскольку произошло что-то еще. Мы будем использовать low в качестве входных данных, и мы будем использовать изменение размера позиции на long в качестве входных данных bool. Функция присваивает значение при первом появлении, затем принимает минимальное значение между этим или источником, пока условие не будет обнаружено снова. Я включил функцию построения графика, чтобы наблюдать и проверять минимальную точку во время вашей длинной торговли.

 lowestSince(src, cond) =>
    var float hi = na
    hi := cond ? src : math.min(hi, src)

long = strategy.position_size > 0 

enterLong = long and not long[1]

lowestLow = lowestSince(low, enterLong)

plot(long ? lowestLow : na, style=plot.style_linebr)
 

Приветствия и удачи в вашей торговле и программировании

Комментарии:

1. Спасибо! Я еще не очень хорошо знаком с функциями, поэтому, пожалуйста, позвольте мне задать следующий вопрос: поскольку я хочу рассчитать максимальное отклонение от всех моих сделок, я использовал вашу функцию и добавил ее к последнему условию if, где я все еще использую Sinc Trade .

2. if strategy.closedtrades[0] > strategy.closedtrades[1] and strategy.position_size[1] > 0 sinceTrade := sinceTrade[1] maeLong := (open[sinceTrade] - lowestLow / open[sinceTrade] maxMaeLong := maeLong > maxMaeLong ? maeLong : maxMaeLong Но, как вы сказали, мой счет не работает. Есть ли обходной путь для этого? Второй вопрос касается входа и выхода без минимума, если я использую вашу функцию. Если рынок между этими двумя точками увеличивается бар за баром, минимума нет, и это может привести к ошибке, я полагаю.

3. ты хоть пробовал? Нет, для возврата к максимальным барам нет обходного пути. Эта функция дает самый низкий минимум во время длинной сделки. Кажется, вы усложняете вопрос… tradingview.com/x/Auhkc3BZ

4. Я больше не использую Sinc Trade, поскольку я просто сохраняю цену открытия при входе в новую сделку. Заставляет это работать! Кстати, ваша функция довольно умна. Но почему вы называете переменную «hi», когда вы смотрите на низкий уровень?

5. Это была ошибка — адаптировано из моей функции highestSince, и я забыл ее изменить. Мои извинения