Pine Script 5 для TradingView: Пытаюсь получить значение сотни или тысячи, чтобы провести линию

Вопрос или проблема

Я пытаюсь провести горизонтальную линию с определенными интервалами на графике. Если цена меньше 10000, я хочу линию каждые 12.50 долларов. Если больше, то каждые 125 долларов. Я хочу, чтобы линии начинались с сотен или тысяч соответственно. В приведённом ниже коде всё нормально отображается на одном графике для одного символа, но на другом графике с тем же символом начинается с совершенно другой цены. Вот код:

//@version=5
indicator("Inflection Levels", overlay=true)

line_color = input.color(color.aqua,title = "Цвет линии")

// Начальная точка и интервал
var base_divider = 100    
var interval_mult = 1

if close >= 10000
    base_divider := 1000
    interval_mult := 10

priceBase = (math.ceil(close/base_divider) * base_divider)
var float start_price_level = priceBase
var float interval = 12.5 * interval_mult

var int loop_count = 8
var float line_price = 0.0

// Рисуем циановые линии на каждом интервале
for i = 0 to loop_count - 1
    line_price := start_price_level + (i * interval)
    line.new(x1 = bar_index - 100, y1 = line_price, x2 = bar_index, y2 = line_price, xloc = xloc.bar_index, extend = extend.right, color = line_color, style = line.style_solid)

Вот картинка с тем, что происходит:

введите описание изображения здесь
введите описание изображения здесь

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

Ответ или решение

Чтобы нарисовать горизонтальные линии на графике в TradingView с использованием Pine Script 5 в зависимости от значения цены, вам необходимо убедиться, что ваш код корректно определяет начальную цену в зависимости от текущего закрытия. Давайте внимательно рассмотрим вашу проблему и предложим исправление, чтобы линии рисовались правильно для любого символа.

Проблема

Ваш код использует переменную priceBase для вычисления начальной ценовой отметки. Однако, при использовании var, эта переменная инициализируется только один раз во время первого запуска скрипта. Это может приводить к тому, что начальная цена не обновляется при изменении цены на графике, что вы и наблюдаете на разных символах.

Решение

Мы можем использовать текущую цену close для вычисления начальной ценовой отметки каждый раз, когда рисуем линии. Это гарантирует, что каждое обновление цен будет приводить к правильной перерисовке линий. Ниже приведён исправленный код, который решает вашу задачу.

//@version=5
indicator("Inflection Levels", overlay=true)

line_color = input.color(color.aqua, title="Line Color")

// Определяем базовый делитель и интервал
var float base_divider = 100
var interval_mult = 1

if close >= 10000
    base_divider := 1000
    interval_mult := 10

// Генерируем начальную ценовую отметку
priceBase = math.ceil(close / base_divider) * base_divider
var float interval = 12.5 * interval_mult

var int loop_count = 8
var float line_price = 0.0

// Рисуем линии на графике
for i = 0 to loop_count - 1
    line_price := priceBase + (i * interval)
    line.new(x1 = bar_index - 100, y1 = line_price, x2 = bar_index, y2 = line_price, xloc = xloc.bar_index, extend = extend.right, color = line_color, style = line.style_solid)

Объяснение изменений

  1. Генерация priceBase: Мы переместили расчет priceBase вне переменной var. Теперь при каждом обновлении (например, при каждом новом баре) начальная цена будет пересчитываться, что обеспечит корректность для разных символов.

  2. Использование var для interval: Мы сохранили interval как var, так как его значение зависит от base_divider и, соответственно, периодически меняется, когда цена превышает 10000.

Заключение

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

Пожалуйста, протестируйте обновленный код и дайте знать, если возникнут дополнительные вопросы или трудности!

Оцените материал
Добавить комментарий

Капча загружается...