Вопрос или проблема
Я пытаюсь провести горизонтальную линию с определенными интервалами на графике. Если цена меньше 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)
Объяснение изменений
-
Генерация
priceBase
: Мы переместили расчетpriceBase
вне переменнойvar
. Теперь при каждом обновлении (например, при каждом новом баре) начальная цена будет пересчитываться, что обеспечит корректность для разных символов. -
Использование
var
дляinterval
: Мы сохранилиinterval
какvar
, так как его значение зависит отbase_divider
и, соответственно, периодически меняется, когда цена превышает 10000.
Заключение
С помощью предложенного фрагмента кода вы получите возможность корректно рисовать линии с заданными интервалами в зависимости от текущей цены. Это обеспечит однородность на разных графиках для одного и того же символа.
Пожалуйста, протестируйте обновленный код и дайте знать, если возникнут дополнительные вопросы или трудности!