как рисовать линии в скрипте Pine (Tradingview)?

Редактор Pine по-прежнему не имеет встроенных функций для построения линий (таких как линии поддержки, линии тренда). Я не мог найти прямого или косвенного метода рисования линий. Я хочу создать функцию, которая выглядит как показано ниже (только для примера)

draw_line(price1, time1,price2, time2)

любые идеи или предложения?


person Ibrahim    schedule 22.09.2017    source источник


Ответы (3)


К сожалению, я не думаю, что это то, что они хотят предоставить. Заметил несколько многообещающих постов 4-летней давности, которые так и не появились. Единственный другой способ, кажется, включает некоторые вычисления, аппроксимируя вашу линию некоторыми линейными графиками, где вы скрываете нерелевантные части.

Для пример:

...
c = close >= open ? lime : red
plot(close, color = c)

будет производить что-то вроде этого:

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

Затем вы можете попробовать заменить red на na, чтобы получить только зеленые части.

Пример 2

Я провел еще несколько экспериментов. По-видимому, Pine настолько искалечен, что вы даже не можете использовать график, поэтому единственный способ, похоже, - использовать формулу точечного наклона для линии, например:

//@version=3
study(title="Simple Line", shorttitle='AB', overlay=true)

P1x = input(5744)
P1y = input(1.2727)
P2x = input(5774)
P2y = input(1.2628)
plot(n, color=na, style=line)   // hidden plot to show the bar number in indicator

// point slope
m = - (P2y - P1y) / (P2x - P1x)

// plot range
AB = n < P1x or n > P2x ? na : P1y - m*(n - P1x)
LA = (n == P1x) ? P1y : na
LB = (n == P2x) ? P2y : na

plot(AB, title="AB", color=#ff00ff, linewidth=1, style=line, transp=0)
plotshape(LA, title='A', location=location.absolute, color=silver, transp=0, text='A', textcolor=black, style=shape.labeldown)
plotshape(LB, title='B', location=location.absolute, color=silver, transp=0, text='B', textcolor=black, style=shape.labelup )

Результат довольно приятный, но слишком неудобный в использовании. введите здесь описание изображения


ОБНОВЛЕНИЕ: 01.10.2019

Судя по всему, они добавили в Pinescript 4.0+ некоторые новые функции линий. Вот пример использования новой функции vline():

//@version=4
study("vline() Function for Pine Script v4.0+", overlay=true)

vline(BarIndex, Color, LineStyle, LineWidth) => // Verticle Line, 54 lines maximum allowable per indicator
    return = line.new(BarIndex, -1000, BarIndex, 1000, xloc.bar_index, extend.both, Color, LineStyle, LineWidth)

if(bar_index%10==0.0)
    vline(bar_index, #FF8000ff, line.style_solid, 1) // Variable assignment not required

Что касается другой «новой» линейной функции, я ее еще не тестировал.

person not2qubit    schedule 03.12.2017

Теперь это возможно в Pine Script v4:

Предварительный просмотр

//@version=4
study("Line", overlay=true)
l = line.new(bar_index, high, bar_index[10], low[10], width = 4)
line.delete(l[1])

Вот функция вертикальной линии от midtownsk8rguy на TradingView:

vline(BarIndex, Color, LineStyle, LineWidth) => // Verticle Line Function, ≈50-54 lines maximum allowable per indicator
    // return = line.new(BarIndex,   0.0, BarIndex,     100.0, xloc.bar_index, extend.both, Color, LineStyle, LineWidth) // Suitable for study(overlay=false) and RSI, Stochastic, etc...
    // return = line.new(BarIndex,  -1.0, BarIndex,       1.0, xloc.bar_index, extend.both, Color, LineStyle, LineWidth) // Suitable for study(overlay=false) and +/-1.0 oscillators
    return = line.new(BarIndex, low - tr, BarIndex, high + tr, xloc.bar_index, extend.both, Color, LineStyle, LineWidth) // Suitable for study(overlay=true)

if(bar_index%10==0.0) // Generically plots a line every 10 bars
    vline(bar_index, #FF8000ff, line.style_solid, 1) // Variable assignment not required

Вы также можете использовать if barstate.islast, если вы рисуете свои линии только один раз, а не на каждой свече, таким образом, вам не нужно delete предыдущие линии.

person jaggedsoft    schedule 06.07.2019
comment
Мелочь: ось x (время) принимает только целые числа. (первый и третий аргумент) (bar_index — целое число), в некотором роде это имеет смысл, но я не ожидал этого при попытке использовать скользящее среднее (это возвращает числа с плавающей запятой для x) - person Kev; 18.07.2019
comment
Вы также можете использовать if barstate.islast, если вы рисуете свои линии только один раз, а не на каждой свече, таким образом, вам не нужно delete предыдущие линии. - person jaggedsoft; 11.01.2020

Более компактный код для рисования линий:

//@version=3
study("Draw line", overlay=true)

plot(n, color=na, style=line)
AB(x1,x2,y1,y2) => n < x1 or n > x2 ? na : y1 + (y2 - y1) / (x2 - x1) * (n - x1)

plot(AB(10065,10136,3819,3893), color=#ff00ff, linewidth=1, style=line, 
transp=0)
plot(AB(10091,10136,3966.5,3931), color=#ff00ff, linewidth=1, style=line, 
transp=0)
person Andrey    schedule 27.02.2019