Reputation: 1117
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:
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!
Upvotes: 4
Views: 22357
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
Upvotes: 1
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):
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 low
est, red is high
est, and orange is close
(you can change it for open
, but I do recommend you to use the closing value).
Upvotes: 2
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
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])
Upvotes: 1