Настройки и отрисовка
Настройки input.* в окне индикатора, линии plot и их стили, уровни hline, заливки fill, фон и цвет свечей, маркеры, подписи, отрезки, прямоугольники, таблицы, цвета и прозрачность. Пределы: три рисуемых plot и 500 объектов каждого вида.
Эта страница о том, что пользователь видит и может менять. Здесь описаны настройки, которые скрипт выносит в окно индикатора, линии и их стили, уровни и заливки, фон и цвет свечей, маркеры, подписи, отрезки, прямоугольники и таблицы, а также цвета и прозрачность. В конце есть раздел о пределах, которые стоит знать заранее.
Настройки: input.*
Каждый вызов input.* становится строкой на вкладке Входные данные в окне настроек индикатора. Строки идут в том порядке, в каком вызовы написаны в скрипте. Первый аргумент задаёт значение по умолчанию, второй — подпись строки.
| Вызов | Что появится в окне настроек |
|---|---|
input.int |
Поле для целого числа |
input.float |
Поле для дробного числа |
input.bool |
Флажок |
input.color |
Выбор цвета |
input.string |
Выпадающий список, если задан options; без него — текстовое поле |
input.source |
Выпадающий список рядов: open, high, low, close, hl2, hlc3, ohlc4, hlcc4, volume |
input.enum |
Выпадающий список из подписей перечисления |
input.timeframe |
Текстовое поле; с options — выпадающий список |
input.symbol |
Текстовое поле |
Пример ниже собирает в одном скрипте пять видов настроек:
indicator("Средняя на выбор", overlay = true)
enum Basis {
sma = "Простая"
ema = "Экспоненциальная"
wma = "Взвешенная"
}
basis = input.enum(Basis.ema, "Тип средней")
length = input.int(50, "Период", minval = 1, maxval = 500)
src = input.source(close, "Источник")
lineColor = input.color(color.orange, "Цвет линии")
showBg = input.bool(false, "Подсвечивать фон")
avg = switch basis {
Basis.sma => ta.sma(src, length)
Basis.ema => ta.ema(src, length)
=> ta.wma(src, length)
}
plot(avg, "Средняя", color = lineColor, linewidth = 2)
bgcolor(showBg and close > avg ? color.new(color.teal, 40) : na, title = "Фон")В окне настроек получится выпадающий список «Тип средней» с пунктами «Простая», «Экспоненциальная» и «Взвешенная». Ниже будут поле периода, список источников, выбор цвета и флажок. Как объявлять перечисления, рассказано в разделе Свои типы и перечисления.
Параметры чисел и строк
minvalиmaxvalзадают границы: поле не примет период меньшеminvalили большеmaxval.stepуinput.floatзадаёт, сколько знаков после запятой показывает поле: приstep = 0.1виден один знак. Стрелок у поля нет, значение вводится с клавиатуры.optionsуinput.stringиinput.timeframeпревращает поле в выпадающий список. Значение по умолчанию обязано быть одним из пунктов, иначе компилятор выдаст ошибку.tooltip,groupиinlineкомпилятор принимает, но на вид окна настроек они пока не влияют.
indicator("Цена для расчёта")
mode = input.string("Закрытие", "Считать по", options = ["Закрытие", "Середина свечи"])
price = mode == "Закрытие" ? close : hl2
plot(ta.rsi(price, 14), "RSI", color = color.purple)У input.source умолчанием может быть и ряд рыночных данных, например delta.cum. Такой ряд встанет первым пунктом списка, перед ценовыми рядами. Если же умолчанием стоит выражение вроде (high + low) / 2, строки в окне настроек не будет: выбирать не из чего.
Отдельных настроек для времени, торговой сессии и цены, которую выбирают щелчком на графике, в языке пока нет.
Где хранятся выбранные значения
Значения запоминаются для каждого индикатора на каждом графике отдельно: две копии одного скрипта на разных панелях могут стоять с разными периодами. Кнопка По умолчанию в окне настроек возвращает значения, написанные в коде.
Значение привязано к имени переменной, в которую записан вызов input.*. Подпись строки можно менять свободно, выбранное значение сохранится. Строки можно и переставлять. А если переименовать переменную (length в period), настройка вернётся к значению из кода.
Окно настроек открывается двойным щелчком по строке индикатора в легенде графика или значком настроек в этой строке. Кроме вкладки Входные данные в нём есть Стиль и Видимость — о них ниже.
Линии: plot
plot рисует ряд, по одному значению на каждый бар. Обязателен только первый аргумент — сам ряд. Остальные параметры задаются по имени:
title— имя линии в легенде и в окне настроек;color— цвет, постоянный или вычисляемый на каждом баре;linewidth— толщина;style— способ отрисовки, см. таблицу;offset— сдвиг на заданное число баров: положительный вправо, отрицательный влево;show_last— рисовать только последние N баров;join = true— соединить линией точки стилейcirclesиcross;editable = false— убрать линию из окна настроек;display = display.none— скрыть линию при добавлении; включить её можно на вкладке Видимость.
| Стиль | Как выглядит |
|---|---|
plot.style_line |
Ломаная линия, стиль по умолчанию |
plot.style_linebr |
То же, что line |
plot.style_stepline |
Ступеньки |
plot.style_stepline_diamond |
Ступеньки с ромбами |
plot.style_histogram |
Тонкие столбики от нуля толщиной в линию |
plot.style_columns |
Столбики от нуля шириной в свечу |
plot.style_area |
Область, закрашенная до нуля |
plot.style_areabr |
То же, что area |
plot.style_circles |
Точки |
plot.style_cross |
Крестики |
Линия всегда прерывается там, где у ряда нет значения (na), и не перепрыгивает пропуск прямым отрезком. Поэтому пары line/linebr и area/areabr рисуются одинаково.
indicator("Стили линий")
d = close - open
plot(d, "Тело свечи", style = plot.style_histogram, color = d >= 0 ? color.teal : color.red)
plot(ta.sma(d, 10), "Средняя 10", style = plot.style_stepline, color = color.orange, linewidth = 2)
plot(ta.sma(d, 30), "Средняя 30", style = plot.style_circles, color = color.gray)Цвет по барам
Цвет может быть выражением: тогда он считается на каждом баре заново. Цвет na означает, что на этом баре линии нет:
indicator("Средняя только над ценой", overlay = true)
m = ta.sma(close, 50)
plot(m, "Средняя", color = close > m ? color.teal : na)Что линия получает в окне настроек
- На вкладке Стиль настраивается толщина каждой линии. Строка цвета появляется только у линии с постоянным цветом: если цвет выбирает скрипт на каждом баре, менять в окне нечего.
- На вкладке Видимость у каждой линии есть флажок показа. Он появляется, если линий больше одной или если линия скрыта через
display. - Линия с
editable = falseне получает строк ни на одной вкладке.
Уровни и заливки
hline рисует горизонтальную линию на постоянной цене — например, границы зон RSI. Цена должна быть числом или настройкой input.*: ряд, меняющийся от бара к бару, сюда не подходит. Для такой линии нужен plot. Стиль линии задают hline.style_solid, hline.style_dashed и hline.style_dotted.
fill закрашивает область между двумя границами. Чтобы получить границу, результат hline или plot записывают в переменную:
indicator("RSI с зонами")
length = input.int(14, "Период", minval = 1)
r = ta.rsi(close, length)
top = hline(70, "Перекупленность", color = color.gray, linestyle = hline.style_dashed)
bottom = hline(30, "Перепроданность", color = color.gray, linestyle = hline.style_dashed)
fill(top, bottom, color = color.new(color.purple, 30), title = "Зона")
plot(r, "RSI", color = r > 70 ? color.red : r < 30 ? color.teal : color.purple)Обе границы должны быть одного рода: два уровня hline или две линии plot. Заливку между линией и уровнем компилятор не примет.
Цвет заливки между двумя линиями может меняться от бара к бару. Так получается «облако» из двух средних:
indicator("Облако", overlay = true)
fast = ta.ema(close, 9)
slow = ta.ema(close, 21)
pf = plot(fast, "Быстрая", color = color.teal)
ps = plot(slow, "Медленная", color = color.orange)
fill(pf, ps, color = fast > slow ? color.new(color.teal, 50) : color.new(color.red, 50), title = "Облако")Есть и градиентная заливка. Задайте top_value и bottom_value, чтобы указать высоты, где цвет равен top_color и bottom_color; между ними цвет плавно переходит. Эти высоты должны быть постоянными числами. Если нужна заливка до постоянного уровня, сделайте его линией, plot(50). Но помните, что это одна из трёх рисуемых линий.
indicator("RSI с градиентом")
r = ta.rsi(close, 14)
pr = plot(r, "RSI", color = color.purple)
pm = plot(50, "Середина", color = color.gray)
fill(pr, pm, top_value = 80, bottom_value = 50,
top_color = color.new(color.teal, 160), bottom_color = color.new(color.teal, 0))Фон и цвет свечей
bgcolor закрашивает фон под баром, barcolor перекрашивает саму свечу. Оба принимают цвет, вычисляемый на каждом баре; на барах с цветом na ничего не меняется.
indicator("Подсветка объёма", overlay = true)
avgVol = ta.sma(volume, 20)
spike = volume > avgVol * 2
bgcolor(spike ? color.new(color.orange, 40) : na, title = "Всплеск объёма")
barcolor(close > open ? color.teal : color.red, title = "Цвет свечей")Маркеры: plotshape и plotchar
plotshape ставит значок на тех барах, где условие истинно. plotchar делает то же с любым символом.
indicator("Пересечения", overlay = true)
fast = ta.ema(close, 9)
slow = ta.ema(close, 21)
plotshape(ta.crossover(fast, slow), "Вверх", style = shape.triangleup,
location = location.belowbar, color = color.teal, size = size.small)
plotshape(ta.crossunder(fast, slow), "Вниз", style = shape.triangledown,
location = location.abovebar, color = color.red, size = size.small)
plotchar(volume > ta.sma(volume, 20) * 3, "Объём", char = "●", location = location.top, color = color.orange)- Форма,
shape.*:triangleup,triangledown,arrowup,arrowdown,circle,square,diamond,cross,xcross,flag,labelup,labeldown. - Место,
location.*:abovebar— над свечой,belowbar— под свечой,topиbottom— у верхнего и нижнего края панели. В отдельной панели под графиком «над свечой» и «под свечой» тоже означают верхний и нижний край: у такой панели своя шкала, и цены свечей на ней не отложены. - Размер,
size.*:auto,tiny,small,normal,large,huge. textдобавляет к значку короткую подпись. Когда график сильно отдалён и свечи узкие, подписи скрываются, а значки остаются.
Графические объекты
Кроме рядов, скрипт может рисовать отдельные объекты: подписи label.new, отрезки line.new, прямоугольники box.new и таблицы table.new. Каждый вызов *.new возвращает объект. Его можно передвинуть функциями set_* (label.set_xy, line.set_x2, box.set_top и так далее), прочитать через get_*, скопировать через copy или удалить через delete.
По горизонтали объект по умолчанию привязан к номеру бара, bar_index. С параметром xloc = xloc.bar_time координата задаётся временем бара. Отрезку и прямоугольнику параметр extend (extend.right, extend.left, extend.both) продлевает край до границы графика.
Объект остаётся на графике, пока его не удалят. Скрипт выполняется на каждом баре, поэтому label.new без условия создаст по подписи на каждый бар. Чтобы держать один объект и двигать его, храните его в переменной var, а старый удаляйте:
indicator("Последний пивот", overlay = true, maxLabelsCount = 50)
ph = ta.pivothigh(high, 10, 10)
var line level = na
if not na(ph) {
label.new(bar_index - 10, ph, str.tostring(ph), style = label.style_label_down,
color = color.orange, textcolor = color.white, size = size.small)
line.delete(level)
level := line.new(bar_index - 10, ph, bar_index, ph, extend = extend.right,
color = color.orange, style = line.style_dashed)
}Скрипт подписывает каждый найденный максимум и тянет пунктир от последнего из них вправо. Прежний пунктир он при этом удаляет.
Живых объектов каждого вида одновременно бывает не больше 500. Когда появляется пятьсот первый, самый старый исчезает. Параметры maxLinesCount, maxLabelsCount и maxBoxesCount в indicator() уменьшают этот предел. Значение больше 500 урезается до 500.
Таблицы
Таблица привязана не к барам, а к углу или краю панели и не двигается при прокрутке графика. Место задаёт position.*: top_left, top_center, top_right, middle_left, middle_center, middle_right, bottom_left, bottom_center, bottom_right. Ячейки заполняет table.cell. Удобно делать это только на последнем баре, чтобы не переписывать таблицу на всей истории:
indicator("Сводка", overlay = true)
var t = table.new(position.top_right, 2, 2, bgcolor = color.new(color.black, 160))
if barstate.islast {
table.cell(t, 0, 0, "RSI", text_color = color.white)
table.cell(t, 1, 0, str.tostring(math.round(ta.rsi(close, 14), 1)), text_color = color.white)
table.cell(t, 0, 1, "ATR", text_color = color.white)
table.cell(t, 1, 1, str.tostring(math.round(ta.atr(14), 2)), text_color = color.white)
}У таблицы не больше 200 столбцов и 200 строк. Таблица, в которой больше 2000 ячеек, не создаётся.
Цвета
Именованные цвета: color.red, color.green, color.blue, color.teal, color.orange, color.purple, color.yellow, color.white, color.black, color.gray, color.silver, color.maroon, color.navy, color.olive, color.lime, color.aqua, color.fuchsia.
Цвет можно записать и кодом: #FF8800 — непрозрачный, #FF880040 — с прозрачностью. Последняя пара цифр задаёт непрозрачность: 00 — полностью прозрачный, FF — сплошной.
color.rgb(r, g, b)собирает цвет из составляющих от 0 до 255. Четвёртый аргумент — непрозрачность, по умолчанию 255.color.from_gradient(value, bottomValue, topValue, bottomColor, topColor)возвращает цвет между двумя крайними по положениюvalueв диапазоне. Удобно раскрашивать осциллятор от холодного к горячему.naвместо цвета значит «не рисовать».
indicator("RSI в цвете")
r = ta.rsi(close, 14)
heat = color.from_gradient(r, 30, 70, color.rgb(0, 150, 136), color.rgb(244, 67, 54))
plot(r, "RSI", color = heat, linewidth = 2)
bgcolor(r > 70 ? color.new(color.red, 30) : r < 30 ? color.new(color.teal, 30) : na, title = "Зоны")