Как создать индикаторы TradingView, которые выглядят так?

Я пытался создать аналогичный индикатор этому

Это ссылка

У меня есть код для RSI, Stochastic RSI, MACD и 50/100/200 MA (с крестами), но я не мог найти информацию о том, как создать визуализацию, как в справочнике, хотя я довольно долго изучал

Вот код этих индикаторов:

50/100/200 МА с крестами (кодировал сам)

indicator(title = "3 EMA with Cross", shorttitle = "3EMA Cross", overlay=true)
fast = 50
mid = 100
slow = 200
fastEMA = ta.ema(close, fast)
midEMA = ta.ema(close, mid)
slowEMA = ta.ema(close, slow)

bullishCross = ta.crossover(fastEMA, slowEMA)
bearishCross = ta.crossunder(fastEMA, slowEMA)

if (bullishCross)
    lbl = label.new(bar_index, low, "Golden Cross")
    label.set_color(lbl, color.green)
    label.set_yloc(lbl, yloc.belowbar)
    label.set_style(lbl, label.style_label_up)

if (bearishCross)
    lbl = label.new(bar_index, low, "Death Cross")
    label.set_color(lbl, color.red)
    label.set_yloc(lbl, yloc.abovebar)
    label.set_style(lbl, label.style_label_down)
plot(fastEMA, color=color.green, linewidth=2)
plot(midEMA, color=color.yellow, linewidth=2)
plot(slowEMA, color=color.red, linewidth=2)

Индекс относительной силы

indicator(title = "Relative Strength Index", shorttitle = "RSI", format=format.price, precision=2,                 
timeframe = "", timeframe_gaps=true)

ma(source, length, type) =>
switch type
    "SMA" => ta.sma(source, length)
    "Bollinger Bands" => ta.sma(source, length)
    "EMA" => ta.ema(source, length)
    "SMMA (RMA)" => ta.rma(source, length)
    "WMA" => ta.wma(source, length)
    "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(14, minval=1, title = "RSI Length", group = "RSI Settings")
rsiSourceInput = input.source(close, "Source", group = "RSI Settings")
maTypeInput = input.string("SMA", title = "MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group = "MA Settings")
maLengthInput = input.int(14, title = "MA Length", group = "MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title = "BB StdDev", group = "MA Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

plot(rsi, "RSI", color=#7E57C2)
plot(rsiMA, "RSI-based MA", color=color.yellow)
rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title = "RSI Background Fill")
bbUpperBand = plot(isBB ? rsiMA + ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Upper Bollinger Band", color=color.green)
bbLowerBand = plot(isBB ? rsiMA - ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Lower Bollinger Band", color=color.green)
fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title = "Bollinger Bands Background Fill")

MACD

indicator(title = "Moving Average Convergence Divergence", shorttitle = "MACD", timeframe = "", 
timeframe_gaps=true)
// Getting inputs
fast_length = input(title = "Fast Length", defval=12)
slow_length = input(title = "Slow Length", defval=26)
src = input(title = "Source", defval=close)
signal_length = input.int(title = "Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title = "Oscillator MA Type",  defval = "EMA", options=["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options=["SMA", "EMA"])
// Plot colors
col_macd = input(#2962FF, "MACD Line  ", group = "Color Settings", inline = "MACD")
col_signal = input(#FF6D00, "Signal Line  ", group = "Color Settings", inline = "Signal")
col_grow_above = input(#26A69A, "Above   Grow", group = "Histogram", inline = "Above")
col_fall_above = input(#B2DFDB, "Fall", group = "Histogram", inline = "Above")
col_grow_below = input(#FFCDD2, "Below Grow", group = "Histogram", inline = "Below")
col_fall_below = input(#FF5252, "Fall", group = "Histogram", inline = "Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
plot(hist, title = "Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ?                 
col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
plot(macd, title = "MACD", color=col_macd)
plot(signal, title = "Signal", color=col_signal)

Стохастический RSI

smoothK = input.int(3, "K", minval=1)
smoothD = input.int(3, "D", minval=1)
lengthRSI = input.int(14, "RSI Length", minval=1)
lengthStoch = input.int(14, "Stochastic Length", minval=1)
src = input(close, title = "RSI Source")
rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)
plot(k, "K", color=#2962FF)
plot(d, "D", color=#FF6D00)
h0 = hline(80, "Upper Band", color=#787B86)
h1 = hline(20, "Lower Band", color=#787B86)
fill(h0, h1, color=color.rgb(33, 150, 243, 90), title = "Background")```

//MACD
indicator(title = "Moving Average Convergence Divergence", shorttitle = "MACD", timeframe = "", timeframe_gaps=true)
// Getting inputs
fast_length = input(title = "Fast Length", defval=12)
slow_length = input(title = "Slow Length", defval=26)
src = input(title = "Source", defval=close)
signal_length = input.int(title = "Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title = "Oscillator MA Type",  defval = "EMA", options=["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options=["SMA", "EMA"])
// Plot colors
col_macd = input(#2962FF, "MACD Line  ", group = "Color Settings", inline = "MACD")
col_signal = input(#FF6D00, "Signal Line  ", group = "Color Settings", inline = "Signal")
col_grow_above = input(#26A69A, "Above   Grow", group = "Histogram", inline = "Above")
col_fall_above = input(#B2DFDB, "Fall", group = "Histogram", inline = "Above")
col_grow_below = input(#FFCDD2, "Below Grow", group = "Histogram", inline = "Below")
col_fall_below = input(#FF5252, "Fall", group = "Histogram", inline = "Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
plot(hist, title = "Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
plot(macd, title = "MACD", color=col_macd)
plot(signal, title = "Signal", color=col_signal)

Стоит ли изучать 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
0
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Для этого вы можете использовать labels со смещением. Offset поможет вам с размещением.

Обновите метки для каждого бара и удалите старые бары.

Простой пример:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © vitruvius

//@version=5
indicator("My script")

rsi = ta.rsi(close, 14)
ema50 = ta.ema(close, 50)

rsi_off = 50
ema50_off = 25

rsi_up_trend = rsi < 30
ema_up_trend = close > ema50

var label l_rsi = na
var label l_ema50 = na

if barstate.islast
    l_rsi := label.new(bar_index - rsi_off, 1, "RSI", color=rsi_up_trend ? color.green : color.red, style=label.style_triangleup, textcolor=color.white)
    l_ema50 := label.new(bar_index - ema50_off, 1, "EMA50", color=ema_up_trend ? color.green : color.red, style=label.style_triangleup, textcolor=color.white)
    
    label.delete(l_rsi[1])
    label.delete(l_ema50[1])

Большое спасибо! Я действительно помог мне, я не мог найти ничего, связанного с этим

PsyDuck Gaming 07.05.2022 17:28

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

Похожие вопросы

Как решить математическую последовательность в R?
Как расширить или «увеличить» массив 1d?
Объединение двух пересекающихся окружностей разного размера и нахождение координат центра, взвешенного по радиусу
Ни один из методов десятичного округления, которые я знаю, не работал для моей текущей потребности (преобразование строки из дробных коэффициентов в десятичные коэффициенты)
Eigen::Quaternion::FromTwoVectors(a, b) * a != b
Как бы вы рассчитали дату прошлой недели, пятницы и субботы, на основе сегодняшней даты и дня?
Распределяйте сборы равномерно по многим адресам (метод вытягивания) в Solidity
Простой класс функциональной композиции не работает (отсутствуют 2 обязательных позиционных аргумента)
Ошибка математической области не суммируется с использованием различных триггерных функций с переменной
Как рассчитать попарное сходство (расстояние Жаккара) между наборами