weizer
weizer

Reputation: 1117

Plotting previous day high/low/close using pine script

I have a pine script to draw previous day high/open/low as shown below:

//@version=4
strategy("Plot Lines", overlay=true)

PDH = security(syminfo.tickerid,"D",high)
PDO = security(syminfo.tickerid,"D",open)
PDL = security(syminfo.tickerid,"D",low)

plot(PDH, title="High",color=color.red,linewidth=2,trackprice=true)
plot(PDO, title="Open",color=color.yellow,linewidth=2,trackprice=true)
plot(PDL, title="Low",color=color.green,linewidth=2,trackprice=true)

The script work well but I only want previous day to be shown and ignore the others day before previous day so that the chart will not be that messy.

This is what I get from the script above: enter image description here

As you can see, it plot the PDH/PDO/PDL for every previous day, but I just want previous day (one day) only. Any help or advice will be greatly appreciated!

New Edited enter image description here

Result after apply the script enter image description here

Upvotes: 4

Views: 22357

Answers (4)

Chandre Gowda
Chandre Gowda

Reputation: 930

//@version=5
indicator("HLC", max_lines_count = 11, overlay=true)

// to highlight the session 
timeframe = "1D"
isNewDay = timeframe. Change(timeframe)
bgcolor(isNewDay ? color. New(color. Green, 80) : na) 

[dh,dl,dc] = request. Security(syminfo.ticker, "D", [high[1],low[1], close[1]], lookahead=barmerge.lookahead_on)

// high[1] to get the series starting from previous day to plot on latest day chart

plot(dh, title="Prev High",  color=color.red,  linewidth=2, trackprice=true, show_last = 1)

plot(dl, title="Prev Low",  color=color.blue,  linewidth=2, trackprice=true, show_last = 1)

plot(dc, title="Prev Close",  color=color. Green,  linewidth=2, trackprice=true, show_last = 1)

This will plot the lines for previous session High Low Close

enter image description here

Upvotes: 1

carloswm85
carloswm85

Reputation: 2382

Not exactly what you asked, but it could lead you in the right direction:

//@version=5
indicator("My script", overlay = true)

resolution = 'D'
var float highSecurityValue   = na
var float lowSecurityValue    = na
var float closeSecurityValue  = na

fNoRepainting(timeframe, expression) =>
    request.security(symbol = syminfo.tickerid, timeframe = timeframe, expression = expression[barstate.isrealtime ? 1 : 0], gaps = barmerge.gaps_off)[barstate.isrealtime ? 0 : 1] // PineCoders best practice.

trimLineAtRange = '0000-0001'
trimLinePlot = time('1', trimLineAtRange)
plottingCondition = not trimLinePlot


highRequest  = fNoRepainting(resolution, high)
lowRequest   = fNoRepainting(resolution, low)
closeRequest = fNoRepainting(resolution, close)
if trimLinePlot[1]
    highSecurityValue := highRequest
    lowSecurityValue := lowRequest
    closeSecurityValue := closeRequest

plot(plottingCondition ? highSecurityValue : na, title = 'H', style = plot.style_linebr, linewidth = 1, color = color.new(color.red, 0))
plot(plottingCondition ? lowSecurityValue : na, title = 'L', style = plot.style_linebr, linewidth = 1, color = color.new(color.lime, 0))
plot(plottingCondition ? closeSecurityValue : na, title = 'C', style = plot.style_linebr, linewidth = 1, color = color.new(color.orange, 0))

The result is (maybe a little more than your asked):

enter image description here

I placed the vertical lines just to enhance the division of days.

Notice that the horizontal line of each day, belongs to the value of the previous day. Green is lowest, red is highest, and orange is close (you can change it for open, but I do recommend you to use the closing value).

Upvotes: 2

Bjorn Mistiaen
Bjorn Mistiaen

Reputation: 6865

Great answer by @vitruvius, but I wanted to add a little something.
There's no need to draw lines and remove the old ones. You can just define them once, and move them on the last bar. Also, the values can be requested in one single security() call.

//@version=5
indicator("Plot Lines", overlay=true)

f_newLine(_color) => line.new(na, na, na, na, xloc.bar_time, extend.right, _color)

f_moveLine(_line, _x, _y) =>
    line.set_xy1(_line, _x,   _y)
    line.set_xy2(_line, _x+1, _y)

var line    line_open = f_newLine(color.yellow)
var line    line_high = f_newLine(color.red)
var line    line_low  = f_newLine(color.green)

[pdo,pdh,pdl] = request.security(syminfo.tickerid,"D", [open,high,low])

if barstate.islast
    f_moveLine(line_open, time, pdo)
    f_moveLine(line_high, time, pdh)
    f_moveLine(line_low , time, pdl)

Edit 1

//@version=5
indicator("Plot Lines", overlay=true)

f_newLine(_color) => line.new(na, na, na, na, xloc.bar_time, extend.right, _color)

f_moveLine(_line, _x, _y) =>
    line.set_xy1(_line, _x,   _y)
    line.set_xy2(_line, _x+1, _y)

var line    line_open = f_newLine(color.yellow)
var line    line_high = f_newLine(color.red)
var line    line_low  = f_newLine(color.green)

[pdo,pdh,pdl,pdt] = request.security(syminfo.tickerid,"D", [open[1],high[1],low[1],time[1]])

if barstate.islast
    f_moveLine(line_open, pdt, pdo)
    f_moveLine(line_high, pdt, pdh)
    f_moveLine(line_low , pdt, pdl)

Upvotes: 12

vitruvius
vitruvius

Reputation: 21121

You can use the line() function instead of plot().

Draw the lines if it is the last bar, and delete the previous ones along the way.

//@version=4
study("Plot Lines", overlay=true)

PDH = security(syminfo.tickerid,"D",high)
PDO = security(syminfo.tickerid,"D",open)
PDL = security(syminfo.tickerid,"D",low)

var line l_pdh = na, var line l_pdo = na, var line l_pdl = na

if barstate.islast
    l_pdh := line.new(bar_index-1, PDH, bar_index, PDH, extend=extend.both, color=color.green)
    l_pdo := line.new(bar_index-1, PDO, bar_index, PDO, extend=extend.both, color=color.blue)
    l_pdl := line.new(bar_index-1, PDL, bar_index, PDL, extend=extend.both, color=color.red)

line.delete(l_pdh[1])
line.delete(l_pdo[1])
line.delete(l_pdl[1])

enter image description here

Upvotes: 1

Related Questions