0% found this document useful (0 votes)
45 views18 pages

New Rich Text Document

Uploaded by

onepercentcharts
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as RTF, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
45 views18 pages

New Rich Text Document

Uploaded by

onepercentcharts
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as RTF, PDF, TXT or read online on Scribd
You are on page 1/ 18

//@version=4

// Naked Levels

// Copyright (C) 2020 Kam Low <[email protected]>

//

study("Naked Levels", shorttitle="Levels", overlay=true, max_bars_back=5000)

dailyShow = input(true, "Show daily levels?", group="Daily")

dailyColor = input(color.purple, "Daily color", group="Daily")

weeklyShow = input(true, "Show weekly levels?", group="Weekly")

weeklyColor = input(color.blue, "Weekly color", group="Weekly")

monthlyShow = input(true, "Show monthly levels?", group="Monthly")

monthlyColor = input(color.yellow, "Monthly color", group="Monthly")

updateLevels(resolution, direction, levelArr, lineArr, lineColor, show) =>

level = security(syminfo.tickerid, resolution, close[1], barmerge.gaps_off, barmerge.lookahead_on)

levelChanged = level != level[1]

length = array.size(levelArr)

if levelChanged and (direction == 1 ? level > level[1] : level < level[1])

array.unshift(levelArr, level)

array.unshift(lineArr, show ? line.new(x1=bar_index[1], y1=level, x2=bar_index, y2=level,


extend=extend.right, color=lineColor, width=1) : na)

length := length + 1

if levelChanged and length > 0


for i = 0 to length - 1

val = nz(array.get(levelArr, i))

if val and (direction == 1 ? level > val : level < val)

// FIXME: remove inside loop causing issues, using set instead

// array.remove(weeklyResistanceLevels, i)

array.set(levelArr, i, na)

line.delete(array.get(lineArr, i))

array.set(lineArr, i, na)

if length > 500

array.pop(levelArr)

line val = array.get(lineArr, length - 1)

if not na(val)

line.delete(val)

array.pop(lineArr)

var dailySupportLevels = array.new_float()

var dailySupportLines = array.new_line()

var dailyResistanceLevels = array.new_float()

var dailyResistanceLines = array.new_line()

updateLevels('D', 0, dailySupportLevels, dailySupportLines, dailyColor, dailyShow)

updateLevels('D', 1, dailyResistanceLevels, dailyResistanceLines, dailyColor, dailyShow)


var weeklySupportLevels = array.new_float()

var weeklySupportLines = array.new_line()

var weeklyResistanceLevels = array.new_float()

var weeklyResistanceLines = array.new_line()

updateLevels('W', 0, weeklySupportLevels, weeklySupportLines, weeklyColor, weeklyShow)

updateLevels('W', 1, weeklyResistanceLevels, weeklyResistanceLines, weeklyColor, weeklyShow)

var monthlySupportLevels = array.new_float()

var monthlySupportLines = array.new_line()

var monthlyResistanceLevels = array.new_float()

var monthlyResistanceLines = array.new_line()

updateLevels('M', 0, monthlySupportLevels, monthlySupportLines, monthlyColor, monthlyShow)

updateLevels('M', 1, monthlyResistanceLevels, monthlyResistanceLines, monthlyColor, monthlyShow)

//

// Helpers

str(x) => tostring(x, "#.###")

resInMinutes() =>

timeframe.multiplier * (

timeframe.isseconds ? 1. / 60. :

timeframe.isminutes ? 1. :

timeframe.isdaily ? 1440. :
timeframe.isweekly ? 10080. :

timeframe.ismonthly ? 43800. : na)

//

// Inputs

lookbackDays = input(180, "Number of lookback days", input.integer)

pivotLeftRightBars = input(10, "Number of pivot left/right bars")

zoneAreaPercent = input(1, "Zone width %", input.float)

zoneMinPivots = input(2, "Minimum number of pivots for confirmation")

useAverageLevels = input(false, "Use average value to calculate zones?")

useWicks = input(true, "Use wicks calculate pivot points?")

showLines = input(true, "Show lines on chart?")

showDebugLabel = input(false, "Show debug labels on chart?")

showUpperResistanceLine = input(true, "Show highest resistance level on chart?")

showLowerSupportLine = input(false, "Show lowest support level on chart?")

showZoneArea = input(false, "Show zone area on chart?")

//

// Implementation

srLookbackBars = min(int((lookbackDays * 1440) / resInMinutes()), 5000 - pivotLeftRightBars)

srPvtBars = array.new_int()
srPvtValues = array.new_float()

srLevels = array.new_float()

_ph = pivothigh(useWicks ? high : close, pivotLeftRightBars, pivotLeftRightBars)

_pl = pivotlow(useWicks ? low : close, pivotLeftRightBars, pivotLeftRightBars)

_pp = _ph ? _ph : _pl ? _pl : na

var line _ln0 = na, var line _ln1 = na, var line _ln2 = na, var line _ln3 = na, var line _ln4 = na

var line _ln5 = na, var line _ln6 = na, var line _ln7 = na, var line _ln8 = na, var line _ln9 = na

var line _ln10 = na, var line _ln11 = na, var line _ln12 = na, var line _ln13 = na, var line _ln14 = na

var line _ln15 = na, var line _ln16 = na, var line _ln17 = na, var line _ln18 = na, var line _ln19 = na

var line _lnh0 = na, var line _lnh1 = na, var line _lnh2 = na, var line _lnh3 = na, var line _lnh4 = na

var line _lnh5 = na, var line _lnh6 = na, var line _lnh7 = na, var line _lnh8 = na, var line _lnh9 = na

var line _lnh10 = na, var line _lnh11 = na, var line _lnh12 = na, var line _lnh13 = na, var line _lnh14 = na

var line _lnh15 = na, var line _lnh16 = na, var line _lnh17 = na, var line _lnh18 = na, var line _lnh19 = na

var line _lnl0 = na, var line _lnl1 = na, var line _lnl2 = na, var line _lnl3 = na, var line _lnl4 = na

var line _lnl5 = na, var line _lnl6 = na, var line _lnl7 = na, var line _lnl8 = na, var line _lnl9 = na

var line _lnl10 = na, var line _lnl11 = na, var line _lnl12 = na, var line _lnl13 = na, var line _lnl14 = na

var line _lnl15 = na, var line _lnl16 = na, var line _lnl17 = na, var line _lnl18 = na, var line _lnl19 = na

var label _lbl0 = na, var label _lbl1 = na, var label _lbl2 = na, var label _lbl3 = na, var label _lbl4 = na

var label _lbl5 = na, var label _lbl6 = na, var label _lbl7 = na, var label _lbl8 = na, var label _lbl9 = na

var label _lbl10 = na, var label _lbl11 = na, var label _lbl12 = na, var label _lbl13 = na, var label _lbl14 = na
var label _lbl15 = na, var label _lbl16 = na, var label _lbl17 = na, var label _lbl18 = na, var label _lbl19 = na

// Return the upper limit of a zone from its median value

srZoneUpper(value) =>

value + (value * (zoneAreaPercent / 100))

// Return the lower limit of a zone from its median value

srZoneLower(value) =>

value - (value * (zoneAreaPercent / 100))

// Return true if the target intersects with the source zone

srZoneIntersect(value, target) =>

target >= srZoneLower(value) and target <= srZoneUpper(value)

// Count the number of times the pivot point at index overlaps with other pivot

// points along the chain

srCountIntersections(index) =>

value = array.get(srPvtValues, index)

count = 0

for i = 0 to array.size(srPvtValues)-1

if srZoneIntersect(value, array.get(srPvtValues, i))

count := count + 1

count
// Count the number of times the pivot point at index overlaps with more recent

// pivot points

srCountNewerIntersections(index) =>

value = array.get(srPvtValues, index)

count = 0

if index > 0

for i = index-1 to 0

if srZoneIntersect(value, array.get(srPvtValues, i))

count := count + 1

count

// Calculate zone values

srZone(value) =>

power = 0

sum = 0.0

bar = 0 // bar index

ph = value

pl = value

info = ""

for i = 0 to array.size(srPvtValues)-1

pp = array.get(srPvtValues, i)

if srZoneIntersect(value, pp)

power := power + 1

sum := sum + pp

bar := array.get(srPvtBars, i)
ph := max(pp, ph)

pl := min(pp, pl)

info := info + (power > 1 ? ":" : "") + str(i)

avg = sum / power

[power, bar, avg, ph, pl, info]

// Return the highest pivot point in the current range

srHighest() =>

pp = array.max(srPvtValues)

index = array.indexof(srPvtValues, pp)

bar = array.get(srPvtBars, index)

[pp, bar]

// Return the lowest pivot point in the current range

srLowest() =>

pp = array.min(srPvtValues)

index = array.indexof(srPvtValues, pp)

bar = array.get(srPvtBars, index)

[pp, bar]

// Return true when the source enters a zone

srEnterZone(source) =>

cond = false

if array.size(srLevels)

for i = 0 to array.size(srLevels)-1
value = array.get(srLevels, i)

ch = srZoneUpper(value)

cl = srZoneLower(value)

if (source < ch and source[1] > ch) or (source > cl and source[1] < cl)

cond := true

break

cond

// Return true when the source exits a zone

srExitZone(source) =>

cond = false

if array.size(srLevels)

for i = 0 to array.size(srLevels)-1

value = array.get(srLevels, i)

ch = srZoneUpper(value)

cl = srZoneLower(value)

if (source > ch and source[1] < ch) or (source < cl and source[1] > cl)

cond := true

break

cond

srZoneAreaLine(bar, value) =>

line.new(bar, value, bar_index, value, width=1, color=color.new(color.blue, 50), style=line.style_solid,


extend=extend.right)

srZoneUpperLine(bar, value) =>


srZoneAreaLine(bar, srZoneUpper(value))

srZoneLowerLine(bar, value) =>

srZoneAreaLine(bar, srZoneLower(value))

srLineTheme(bar, value, width, col, style) =>

line.new(bar, value, bar_index, value, width=width, color=col, style=style, extend=extend.right)

srLine(bar, value, power) =>

width = power >= 4 ? 3 : power >= 3 ? 2 : 1

srLineTheme(bar, value, width, color.new(color.blue, 30), line.style_dashed)

srLabelTheme(value, txt, col, style) =>

dt = time - time[1]

label.new(x=(time+dt*80), y=value, text=txt, color=col, textcolor=color.white, style=style,


size=size.small, xloc=xloc.bar_time, yloc=yloc.price)

srLabel(bar, value, power, txt, i) =>

t = str(value) + " 🗲" + str(power)

srLabelTheme(value, t, color.new(color.blue, 80), label.style_labeldown)

srDebugLabel(merged, skipped, success) =>

if merged != "" or skipped != "" or success != ""

label.new(bar_index-pivotLeftRightBars, array.get(srPvtValues, 0), text="merged (" + merged + ")\n"


+ "skipped (" + skipped + ")\n" + "matched (" + success + ")", textcolor=color.white,
color=color.new(color.blue, 90))
if _pp

// Redraw on each confirmed pivot point

line.delete(_ln0), line.delete(_ln1), line.delete(_ln2), line.delete(_ln3), line.delete(_ln4)

line.delete(_ln5), line.delete(_ln6), line.delete(_ln7), line.delete(_ln8), line.delete(_ln9)

line.delete(_ln10), line.delete(_ln11), line.delete(_ln12), line.delete(_ln13), line.delete(_ln14)

line.delete(_ln15), line.delete(_ln16), line.delete(_ln17), line.delete(_ln18), line.delete(_ln19)

line.delete(_lnh0), line.delete(_lnh1), line.delete(_lnh2), line.delete(_lnh3), line.delete(_lnh4)

line.delete(_lnh5), line.delete(_lnh6), line.delete(_lnh7), line.delete(_lnh8), line.delete(_lnh9)

line.delete(_lnh10), line.delete(_lnh11), line.delete(_lnh12), line.delete(_lnh13), line.delete(_lnh14)

line.delete(_lnh15), line.delete(_lnh16), line.delete(_lnh17), line.delete(_lnh18), line.delete(_lnh19)

line.delete(_lnl0), line.delete(_lnl1), line.delete(_lnl2), line.delete(_lnl3), line.delete(_lnl4)

line.delete(_lnl5), line.delete(_lnl6), line.delete(_lnl7), line.delete(_lnl8), line.delete(_lnl9)

line.delete(_lnl10), line.delete(_lnl11), line.delete(_lnl12), line.delete(_lnl13), line.delete(_lnl14)

line.delete(_lnl15), line.delete(_lnl16), line.delete(_lnl17), line.delete(_lnl18), line.delete(_lnl19)

label.delete(_lbl0), label.delete(_lbl1), label.delete(_lbl2), label.delete(_lbl3), label.delete(_lbl4)

label.delete(_lbl5), label.delete(_lbl6), label.delete(_lbl7), label.delete(_lbl8), label.delete(_lbl9)

label.delete(_lbl10), label.delete(_lbl11), label.delete(_lbl12), label.delete(_lbl13), label.delete(_lbl14)

label.delete(_lbl15), label.delete(_lbl16), label.delete(_lbl17), label.delete(_lbl18), label.delete(_lbl19)

// Populate the arrays

for i = 0 to srLookbackBars
if _pp[i]

array.push(srPvtBars, bar_index[pivotLeftRightBars + i])

array.push(srPvtValues, _pp[i])

// Debug output

merged = ""

skipped = ""

success = ""

// Loop pivot points to connect and draw zones

for i = 0 to array.size(srPvtValues)-1

// Skip this pivot if it overlaps a more recent pivot

if srCountNewerIntersections(i) > 0

merged := merged + str(i) + ','

continue

// Make it rain

pp = array.get(srPvtValues, i)

[power, bar, avg, ph, pl, txt] = srZone(pp)

if power >= zoneMinPivots

value = useAverageLevels ? avg : pp

array.push(srLevels, value)

_ln0 := i == 0 ? srLine(bar, value, power) : _ln0


_ln1 := i == 1 ? srLine(bar, value, power) : _ln1

_ln2 := i == 2 ? srLine(bar, value, power) : _ln2

_ln3 := i == 3 ? srLine(bar, value, power) : _ln3

_ln4 := i == 4 ? srLine(bar, value, power) : _ln4

_ln5 := i == 5 ? srLine(bar, value, power) : _ln5

_ln6 := i == 6 ? srLine(bar, value, power) : _ln6

_ln7 := i == 7 ? srLine(bar, value, power) : _ln7

_ln8 := i == 8 ? srLine(bar, value, power) : _ln8

_ln9 := i == 9 ? srLine(bar, value, power) : _ln9

_ln10 := i == 10 ? srLine(bar, value, power) : _ln10

_ln11 := i == 11 ? srLine(bar, value, power) : _ln11

_ln12 := i == 12 ? srLine(bar, value, power) : _ln12

_ln13 := i == 13 ? srLine(bar, value, power) : _ln13

_ln14 := i == 14 ? srLine(bar, value, power) : _ln14

_ln15 := i == 15 ? srLine(bar, value, power) : _ln15

_ln16 := i == 16 ? srLine(bar, value, power) : _ln16

_ln17 := i == 17 ? srLine(bar, value, power) : _ln17

_ln18 := i == 18 ? srLine(bar, value, power) : _ln18

_ln19 := i == 19 ? srLine(bar, value, power) : _ln19

_lnh0 := i == 0 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh0

_lnh1 := i == 1 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh1

_lnh2 := i == 2 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh2

_lnh3 := i == 3 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh3

_lnh4 := i == 4 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh4


_lnh5 := i == 5 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh5

_lnh6 := i == 6 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh6

_lnh7 := i == 7 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh7

_lnh8 := i == 8 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh8

_lnh9 := i == 9 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh9

_lnh10 := i == 10 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh10

_lnh11 := i == 11 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh11

_lnh12 := i == 12 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh12

_lnh13 := i == 13 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh13

_lnh14 := i == 14 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh14

_lnh15 := i == 15 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh15

_lnh16 := i == 16 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh16

_lnh17 := i == 17 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh17

_lnh18 := i == 18 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh18

_lnh19 := i == 19 and showZoneArea ? srZoneUpperLine(bar, value) : _lnh19

_lnl0 := i == 0 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl0

_lnl1 := i == 1 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl1

_lnl2 := i == 2 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl2

_lnl3 := i == 3 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl3

_lnl4 := i == 4 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl4

_lnl5 := i == 5 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl5

_lnl6 := i == 6 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl6

_lnl7 := i == 7 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl7

_lnl8 := i == 8 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl8


_lnl9 := i == 9 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl9

_lnl10 := i == 10 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl10

_lnl11 := i == 11 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl11

_lnl12 := i == 12 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl12

_lnl13 := i == 13 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl13

_lnl14 := i == 14 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl14

_lnl15 := i == 15 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl15

_lnl16 := i == 16 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl16

_lnl17 := i == 17 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl17

_lnl18 := i == 18 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl18

_lnl19 := i == 19 and showZoneArea ? srZoneLowerLine(bar, value) : _lnl19

_lbl0 := i == 0 ? srLabel(bar, value, power, txt, i) : _lbl0

_lbl1 := i == 1 ? srLabel(bar, value, power, txt, i) : _lbl1

_lbl2 := i == 2 ? srLabel(bar, value, power, txt, i) : _lbl2

_lbl3 := i == 3 ? srLabel(bar, value, power, txt, i) : _lbl3

_lbl4 := i == 4 ? srLabel(bar, value, power, txt, i) : _lbl4

_lbl5 := i == 5 ? srLabel(bar, value, power, txt, i) : _lbl5

_lbl6 := i == 6 ? srLabel(bar, value, power, txt, i) : _lbl6

_lbl7 := i == 7 ? srLabel(bar, value, power, txt, i) : _lbl7

_lbl8 := i == 8 ? srLabel(bar, value, power, txt, i) : _lbl8

_lbl9 := i == 9 ? srLabel(bar, value, power, txt, i) : _lbl9

_lbl10 := i == 10 ? srLabel(bar, value, power, txt, i) : _lbl10

_lbl11 := i == 11 ? srLabel(bar, value, power, txt, i) : _lbl11

_lbl12 := i == 12 ? srLabel(bar, value, power, txt, i) : _lbl12


_lbl13 := i == 13 ? srLabel(bar, value, power, txt, i) : _lbl13

_lbl14 := i == 14 ? srLabel(bar, value, power, txt, i) : _lbl14

_lbl15 := i == 15 ? srLabel(bar, value, power, txt, i) : _lbl15

_lbl16 := i == 16 ? srLabel(bar, value, power, txt, i) : _lbl16

_lbl17 := i == 17 ? srLabel(bar, value, power, txt, i) : _lbl17

_lbl18 := i == 18 ? srLabel(bar, value, power, txt, i) : _lbl18

_lbl19 := i == 19 ? srLabel(bar, value, power, txt, i) : _lbl19

success := success + str(i) + '|' + str(power) + '#{' + txt + '},'

else

skipped := skipped + str(i) + ','

if showUpperResistanceLine

var line _lnhh = na

var label _lblhh = na

line.delete(_lnhh)

label.delete(_lblhh)

[ph, phbar] = srHighest()

_lnhh := srLineTheme(phbar, ph, 1, color.new(color.fuchsia, 50), line.style_dashed)

_lblhh := srLabelTheme(ph, str(ph), color.new(color.fuchsia, 80), label.style_labelup)

if showLowerSupportLine

var line _lnll = na

var label _lblll = na

line.delete(_lnll)
label.delete(_lblll)

[pl, plbar] = srLowest()

_lnll := srLineTheme(plbar, pl, 1, color.new(color.fuchsia, 50), line.style_dashed)

_lblll := srLabelTheme(pl, str(pl), color.new(color.fuchsia, 80), label.style_labeldown)

if showDebugLabel

var label _dbglbl = na

label.delete(_dbglbl)

_dbglbl := srDebugLabel(merged, skipped, success)

plotshape(showLines and _ph, style=shape.triangleup, size=size.auto, color=color.green, offset=-


pivotLeftRightBars)

plotshape(showLines and _pl, style=shape.triangledown, size=size.auto, color=color.red, offset=-


pivotLeftRightBars, location=location.belowbar)

//

// Alert Conditions

enterZoneCond = srEnterZone(close)

exitZoneCond = srExitZone(close)

crossUpperResistance = crossover(close, array.max(srPvtValues))

crossLowerSupport = crossunder(close, array.min(srPvtValues))

alertcondition(enterZoneCond, "Enter SR Zone", "{{ticker}}: Enter SR Zone: {{close}}")


alertcondition(exitZoneCond, "Exit SR Zone", "{{ticker}}: Exit SR Zone: {{close}}")

alertcondition(enterZoneCond or exitZoneCond, "Enter/Exit SR Zone", "{{ticker}}: Enter/Exit Zone:


{{close}}")

alertcondition(crossUpperResistance, "Break Upper Resistance", "{{ticker}}: Break Upper Resistance:


{{close}}")

alertcondition(crossLowerSupport, "Break Lower Support", "{{ticker}}: Break Lower Support: {{close}}")

You might also like