I have a script that is calculating pivots, but I only want to show the pivots for the last 2 time periods. So if I choose Day as the range, then show the pivots only for the last 2 days. On Weekly, show the last 2 weeks. The built-in Pivot Point Standard has an input variable to limit the number of pivots. I just can't figure out how they are doing this. My chart gets ugly with so many previous pivots displaying: 1
My code:
//@version=4
study(title="New Pivot", max_bars_back=100, overlay=true)
// Input settings
pivotRange = input(title="Pivot Range", options=["Day","Week","Month"], defval="Week")
pp_timeframe = pivotRange == "Day" ? "D" : pivotRange == "Week" ? "W" : "M"
pivot_type = input(title="Pivot Type",type=input.string, defval="Fibonacci", options = ['Fibonacci', 'Traditional'])
// Function outputs 1 when it's the first bar of the D/W/M
is_newbar(res) =>
change(time(res == 'Y' ? 'D' : res))
// Create a function to fetch data based on resolution
GetData(res, data) =>
security(syminfo.tickerid, res, data[1], lookahead=barmerge.lookahead_on)
// Now pass pp_timeframe to get which kind of price data to use for the pivot calculation
theHigh = GetData(pp_timeframe, high)
theLow = GetData(pp_timeframe, low)
theClose = GetData(pp_timeframe, close)
// Calculate the pivot levels
r1 = 0.0
r2 = 0.0
r3 = 0.0
s1 = 0.0
s2 = 0.0
s3 = 0.0
pp = (theHigh + theLow + theClose) / 3
if (pivot_type == "Traditional")
r1 := (pp * 2) - theLow
s1 := (pp * 2) - theHigh
r2 := pp + (theHigh - theLow)
s2 := pp - (theHigh - theLow)
r3 := theHigh + 2 * (pp - theLow)
s3 := theLow - 2 * (theHigh - pp)
else
// Fibonacci pivots
r3 := pp + ((theHigh - theLow) * 1.000)
r2 := pp + ((theHigh - theLow) * .618)
r1 := pp + ((theHigh - theLow) * .382)
s1 := pp - ((theHigh - theLow) * .382)
s2 := pp - ((theHigh - theLow) * .618)
s3 := pp - ((theHigh - theLow) * 1.000)
// Midpoint pivots
m2 = (pp + s1) / 2
m1 = (s1 + s2) / 2
m3 = (pp + r1) / 2
m4 = (r1 + r2) / 2
// Returns the average number of current chart bars in the given target HTF resolution (this reflects the dataset's history).
f_avgDilationOf(_res) =>
b = barssince(change(time(_res)))
cumTotal = cum(b == 0 ? b[1] + 1 : 0)
cumCount = cum(b == 0 ? 1 : 0)
cumTotal / cumCount
// Get some previous value from last HTF period.
pHi = security(syminfo.tickerid, pp_timeframe, high[1], lookahead = barmerge.lookahead_on)
// Verify if current charts bars are part of the last dilation of HTF.
lastPBar = security(syminfo.tickerid, pp_timeframe, barstate.islast, lookahead = barmerge.lookahead_on)
// Get avg no of chart bars in one dilation of HTF.
dilation = round(f_avgDilationOf(pp_timeframe))
timeDelta = time - time[1]
// Store bar index when a new timeframe starts
var newBar = 0
bars_since = 0
if is_newbar(pp_timeframe)
newBar := bar_index
else
bars_since := bars_since[1] + 1
// Output pivot points
var line pp_line = na
var line r1_line = na
var line r2_line = na
var line r3_line = na
var line s1_line = na
var line s2_line = na
var line s3_line = na
var line m1_line = na
var line m2_line = na
var line m3_line = na
var line m4_line = na
var label pp_label = na
var label r1_label = na
var label r2_label = na
var label r3_label = na
var label s1_label = na
var label s2_label = na
var label s3_label = na
//label.new(bar_index[0], high, text=tostring(bars_since))
pp_line := line.new(bar_index[bars_since], pp, bar_index, pp, color=#000000, style=line.style_solid)
s1_line := line.new(bar_index[bars_since], s1, bar_index, s1, color=color.silver, style=line.style_solid)
s2_line := line.new(bar_index[bars_since], s2, bar_index, s2, color=color.green, style=line.style_solid)
s3_line := line.new(bar_index[bars_since], s3, bar_index, s3, color=color.silver, style=line.style_solid)
r1_line := line.new(bar_index[bars_since], r1, bar_index, r1, color=color.silver, style=line.style_solid)
r2_line := line.new(bar_index[bars_since], r2, bar_index, r2, color=color.red, style=line.style_solid)
r3_line := line.new(bar_index[bars_since], r3, bar_index, r3, color=color.silver, style=line.style_solid)
m4_line := line.new(bar_index[bars_since], m4, bar_index, m4, color=color.red, style=line.style_dashed)
m1_line := line.new(bar_index[bars_since], m1, bar_index, m1, color=color.green, style=line.style_dashed)
// If we are in the last bars of the HTF resolution's dilation, project line into the future with remaining bars in average# of bars in dilation
if lastPBar
line.set_xloc(id=pp_line, x1=time[bars_since], x2=time + (timeDelta * (dilation - (bar_index - newBar))), xloc=xloc.bar_time)
line.set_xloc(id=r3_line, x1=time[bars_since], x2=time + (timeDelta * (dilation - (bar_index - newBar))), xloc=xloc.bar_time)
line.set_xloc(id=r2_line, x1=time[bars_since], x2=time + (timeDelta * (dilation - (bar_index - newBar))), xloc=xloc.bar_time)
line.set_xloc(id=r1_line, x1=time[bars_since], x2=time + (timeDelta * (dilation - (bar_index - newBar))), xloc=xloc.bar_time)
line.set_xloc(id=s1_line, x1=time[bars_since], x2=time + (timeDelta * (dilation - (bar_index - newBar))), xloc=xloc.bar_time)
line.set_xloc(id=s2_line, x1=time[bars_since], x2=time + (timeDelta * (dilation - (bar_index - newBar))), xloc=xloc.bar_time)
line.set_xloc(id=s3_line, x1=time[bars_since], x2=time + (timeDelta * (dilation - (bar_index - newBar))), xloc=xloc.bar_time)
line.set_xloc(id=m1_line, x1=time[bars_since], x2=time + (timeDelta * (dilation - (bar_index - newBar))), xloc=xloc.bar_time)
line.set_xloc(id=m4_line, x1=time[bars_since], x2=time + (timeDelta * (dilation - (bar_index - newBar))), xloc=xloc.bar_time)
// Set labels
r1_label := label.new(bar_index, r1, "R1", style=label.style_none)
r2_label := label.new(bar_index, r2, "R2", style=label.style_none)
r3_label := label.new(bar_index, r3, "R3", style=label.style_none)
s1_label := label.new(bar_index, s1, "S1", style=label.style_none)
s2_label := label.new(bar_index, s2, "S2", style=label.style_none)
s3_label := label.new(bar_index, s3, "S3", style=label.style_none)
if not is_newbar(pp_timeframe)
line.delete(pp_line[1])
line.delete(r3_line[1])
line.delete(r2_line[1])
line.delete(r1_line[1])
line.delete(s3_line[1])
line.delete(s2_line[1])
line.delete(s1_line[1])
label.delete(pp_label[0])
label.delete(r1_label[0])
label.delete(r2_label[0])
label.delete(r3_label[0])
label.delete(s1_label[0])
label.delete(s2_label[0])
label.delete(s3_label[0])
What I ended up doing is adding code to figure out if the current bar is in the current or previous time range (meaning if calculating pivots for Daily, then only display the pivots for today and yesterday). Not sure this is the most elegant way to code this, but it's working:
currMonth = 0
isCurrOrPrevPeriod = false
// Get the time difference between current time and time of current bar
timeDiff = timenow - time
// Turn that time difference into days
diffDays = round(timeDiff / 86400000)
if pp_timeframe == "D"
// Is the current bar on today or yesterday?
if diffDays < 2
isCurrOrPrevPeriod := true
else
if pp_timeframe == "W"
// Is current bar on this week or last week
offSetDays = dayofweek(timenow) == dayofweek.sunday ? 7 :
dayofweek(timenow) == dayofweek.monday ? 8 :
dayofweek(timenow) == dayofweek.tuesday ? 9 :
dayofweek(timenow) == dayofweek.wednesday ? 10 :
dayofweek(timenow) == dayofweek.thursday ? 11 :
dayofweek(timenow) == dayofweek.friday ? 12 : 13
if diffDays <= offSetDays
isCurrOrPrevPeriod := true
else
// Is current bar on this month or last month
currMonth := month(timenow)
if (year(timenow) == year(time) and currMonth == month(time)) or (currMonth == 1 and year(timenow)-1 == year(time) and month(time) == 12) or (year(timenow) == year(time) and currMonth-1 == month(time))
isCurrOrPrevPeriod := true
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.