OPEN-SOURCE SCRIPT
Wave 1-2-3 PRO (Typed NA + OTE + Confirm)

//version=5
indicator("Wave 1-2-3 PRO (Typed NA + OTE + Confirm)", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
pivotLen = input.int(6, "Pivot Length", minval=2, maxval=30)
useOTE = input.bool(true, "Use OTE Zone (0.618-0.786)")
oteA = input.float(0.618, "OTE A", minval=0.1, maxval=0.95)
oteB = input.float(0.786, "OTE B", minval=0.1, maxval=0.95)
maxDeep = input.float(0.886, "Max Wave2 Depth", minval=0.5, maxval=0.99)
confirmByClose = input.bool(true, "Confirm Break By Close")
breakAtrMult = input.float(0.10, "Break Buffer ATR Mult", minval=0.0, maxval=2.0)
showEntryZone = input.bool(true, "Show Entry Zone")
entryAtrPad = input.float(0.10, "Entry Zone ATR Pad", minval=0.0, maxval=2.0)
showRetestZone = input.bool(true, "Show Retest Zone")
retestAtrMult = input.float(0.60, "Retest Zone ATR Mult", minval=0.1, maxval=5.0)
showTargets = input.bool(true, "Show Target (1.618)")
targetExt = input.float(1.618, "Target Extension", minval=0.5, maxval=3.0)
showLabels = input.bool(true, "Show Wave Labels")
showSignals = input.bool(true, "Show BUY/SELL Confirm Labels")
atr = ta.atr(14)
var float[] prices = array.new_float()
var int[] indexs = array.new_int()
var int[] types = array.new_int()
var box entryBox = na
var box retestBox = na
var line slLine = na
var line tpLine = na
var line breakLine = na
var label lb0 = na
var label lb1 = na
var label lb2 = na
var label sigLb = na
var int lastPivotBar = na
var bool setupBull = false
var bool setupBear = false
var float s_p0 = na
var float s_p1 = na
var float s_p2 = na
var int s_i0 = na
var int s_i1 = na
var int s_i2 = na
var float s_len = na
ph = ta.pivothigh(high, pivotLen, pivotLen)
pl = ta.pivotlow(low, pivotLen, pivotLen)
int pivotBar = na
float pivotPrice = na
int pivotType = 0
if not na(ph)
pivotBar := bar_index - pivotLen
pivotPrice := ph
pivotType := 1
if not na(pl)
pivotBar := bar_index - pivotLen
pivotPrice := pl
pivotType := -1
bool newPivot = not na(pivotBar) and (na(lastPivotBar) or pivotBar != lastPivotBar)
if newPivot
lastPivotBar := pivotBar
int sz = array.size(prices)
if sz == 0
array.push(types, pivotType)
array.push(prices, pivotPrice)
array.push(indexs, pivotBar)
else
int lastType = array.get(types, sz - 1)
float lastPrice = array.get(prices, sz - 1)
if pivotType == lastType
bool better = (pivotType == 1 and pivotPrice > lastPrice) or (pivotType == -1 and pivotPrice < lastPrice)
if better
array.set(prices, sz - 1, pivotPrice)
array.set(indexs, sz - 1, pivotBar)
else
array.push(types, pivotType)
array.push(prices, pivotPrice)
array.push(indexs, pivotBar)
if array.size(prices) > 12
array.shift(types), array.shift(prices), array.shift(indexs)
if not na(entryBox)
box.delete(entryBox)
entryBox := na
if not na(retestBox)
box.delete(retestBox)
retestBox := na
if not na(slLine)
line.delete(slLine)
slLine := na
if not na(tpLine)
line.delete(tpLine)
tpLine := na
if not na(breakLine)
line.delete(breakLine)
breakLine := na
if not na(lb0)
label.delete(lb0)
lb0 := na
if not na(lb1)
label.delete(lb1)
lb1 := na
if not na(lb2)
label.delete(lb2)
lb2 := na
if not na(sigLb)
label.delete(sigLb)
sigLb := na
setupBull := false
setupBear := false
s_p0 := na
s_p1 := na
s_p2 := na
s_i0 := na
s_i1 := na
s_i2 := na
s_len := na
int sz2 = array.size(prices)
if sz2 >= 3
int t0 = array.get(types, sz2 - 3)
int t1 = array.get(types, sz2 - 2)
int t2 = array.get(types, sz2 - 1)
float p0 = array.get(prices, sz2 - 3)
float p1 = array.get(prices, sz2 - 2)
float p2 = array.get(prices, sz2 - 1)
int i0 = array.get(indexs, sz2 - 3)
int i1 = array.get(indexs, sz2 - 2)
int i2 = array.get(indexs, sz2 - 1)
bool bullCandidate = (t0 == -1 and t1 == 1 and t2 == -1 and p2 > p0)
bool bearCandidate = (t0 == 1 and t1 == -1 and t2 == 1 and p2 < p0)
if bullCandidate
float len = p1 - p0
float depth = (p1 - p2) / len
bool okDepth = len > 0 and depth > 0 and depth <= maxDeep
float hiOTE = math.max(oteA, oteB)
float loOTE = math.min(oteA, oteB)
float zTop = p1 - len * loOTE
float zBot = p1 - len * hiOTE
bool okOTE = not useOTE or (p2 <= zTop and p2 >= zBot)
if okDepth and okOTE
setupBull := true
s_p0 := p0
s_p1 := p1
s_p2 := p2
s_i0 := i0
s_i1 := i1
s_i2 := i2
s_len := len
float pad = atr * entryAtrPad
if showEntryZone
entryBox := box.new(i1, zTop + pad, bar_index, zBot - pad)
slLine := line.new(i0, p0, bar_index + 200, p0)
breakLine := line.new(i1, p1, bar_index + 200, p1)
if showLabels
lb0 := label.new(i0, p0, "0")
lb1 := label.new(i1, p1, "1")
lb2 := label.new(i2, p2, "2")
if bearCandidate
float len = p0 - p1
float depth = (p2 - p1) / len
bool okDepth = len > 0 and depth > 0 and depth <= maxDeep
float hiOTE = math.max(oteA, oteB)
float loOTE = math.min(oteA, oteB)
float zBot = p1 + len * loOTE
float zTop = p1 + len * hiOTE
bool okOTE = not useOTE or (p2 >= zBot and p2 <= zTop)
if okDepth and okOTE
setupBear := true
s_p0 := p0
s_p1 := p1
s_p2 := p2
s_i0 := i0
s_i1 := i1
s_i2 := i2
s_len := len
float pad = atr * entryAtrPad
if showEntryZone
entryBox := box.new(i1, zTop + pad, bar_index, zBot - pad)
slLine := line.new(i0, p0, bar_index + 200, p0)
breakLine := line.new(i1, p1, bar_index + 200, p1)
if showLabels
lb0 := label.new(i0, p0, "0")
lb1 := label.new(i1, p1, "1")
lb2 := label.new(i2, p2, "2")
float buf = atr * breakAtrMult
bool bullBreak = false
bool bearBreak = false
if setupBull and not na(s_p1)
bullBreak := confirmByClose ? (close > s_p1 + buf) : (high > s_p1 + buf)
if setupBear and not na(s_p1)
bearBreak := confirmByClose ? (close < s_p1 - buf) : (low < s_p1 - buf)
if bullBreak
setupBull := false
if showTargets and not na(s_len)
float tp = s_p2 + s_len * targetExt
tpLine := line.new(s_i2, tp, bar_index + 200, tp)
if showRetestZone
float z = atr * retestAtrMult
retestBox := box.new(bar_index, s_p1 + z, bar_index + 120, s_p1 - z)
if showSignals
sigLb := label.new(bar_index, high, "BUY (W3 Confirm)", style=label.style_label_down)
if bearBreak
setupBear := false
if showTargets and not na(s_len)
float tp = s_p2 - s_len * targetExt
tpLine := line.new(s_i2, tp, bar_index + 200, tp)
if showRetestZone
float z = atr * retestAtrMult
retestBox := box.new(bar_index, s_p1 + z, bar_index + 120, s_p1 - z)
if showSignals
sigLb := label.new(bar_index, low, "SELL (W3 Confirm)", style=label.style_label_up)
indicator("Wave 1-2-3 PRO (Typed NA + OTE + Confirm)", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
pivotLen = input.int(6, "Pivot Length", minval=2, maxval=30)
useOTE = input.bool(true, "Use OTE Zone (0.618-0.786)")
oteA = input.float(0.618, "OTE A", minval=0.1, maxval=0.95)
oteB = input.float(0.786, "OTE B", minval=0.1, maxval=0.95)
maxDeep = input.float(0.886, "Max Wave2 Depth", minval=0.5, maxval=0.99)
confirmByClose = input.bool(true, "Confirm Break By Close")
breakAtrMult = input.float(0.10, "Break Buffer ATR Mult", minval=0.0, maxval=2.0)
showEntryZone = input.bool(true, "Show Entry Zone")
entryAtrPad = input.float(0.10, "Entry Zone ATR Pad", minval=0.0, maxval=2.0)
showRetestZone = input.bool(true, "Show Retest Zone")
retestAtrMult = input.float(0.60, "Retest Zone ATR Mult", minval=0.1, maxval=5.0)
showTargets = input.bool(true, "Show Target (1.618)")
targetExt = input.float(1.618, "Target Extension", minval=0.5, maxval=3.0)
showLabels = input.bool(true, "Show Wave Labels")
showSignals = input.bool(true, "Show BUY/SELL Confirm Labels")
atr = ta.atr(14)
var float[] prices = array.new_float()
var int[] indexs = array.new_int()
var int[] types = array.new_int()
var box entryBox = na
var box retestBox = na
var line slLine = na
var line tpLine = na
var line breakLine = na
var label lb0 = na
var label lb1 = na
var label lb2 = na
var label sigLb = na
var int lastPivotBar = na
var bool setupBull = false
var bool setupBear = false
var float s_p0 = na
var float s_p1 = na
var float s_p2 = na
var int s_i0 = na
var int s_i1 = na
var int s_i2 = na
var float s_len = na
ph = ta.pivothigh(high, pivotLen, pivotLen)
pl = ta.pivotlow(low, pivotLen, pivotLen)
int pivotBar = na
float pivotPrice = na
int pivotType = 0
if not na(ph)
pivotBar := bar_index - pivotLen
pivotPrice := ph
pivotType := 1
if not na(pl)
pivotBar := bar_index - pivotLen
pivotPrice := pl
pivotType := -1
bool newPivot = not na(pivotBar) and (na(lastPivotBar) or pivotBar != lastPivotBar)
if newPivot
lastPivotBar := pivotBar
int sz = array.size(prices)
if sz == 0
array.push(types, pivotType)
array.push(prices, pivotPrice)
array.push(indexs, pivotBar)
else
int lastType = array.get(types, sz - 1)
float lastPrice = array.get(prices, sz - 1)
if pivotType == lastType
bool better = (pivotType == 1 and pivotPrice > lastPrice) or (pivotType == -1 and pivotPrice < lastPrice)
if better
array.set(prices, sz - 1, pivotPrice)
array.set(indexs, sz - 1, pivotBar)
else
array.push(types, pivotType)
array.push(prices, pivotPrice)
array.push(indexs, pivotBar)
if array.size(prices) > 12
array.shift(types), array.shift(prices), array.shift(indexs)
if not na(entryBox)
box.delete(entryBox)
entryBox := na
if not na(retestBox)
box.delete(retestBox)
retestBox := na
if not na(slLine)
line.delete(slLine)
slLine := na
if not na(tpLine)
line.delete(tpLine)
tpLine := na
if not na(breakLine)
line.delete(breakLine)
breakLine := na
if not na(lb0)
label.delete(lb0)
lb0 := na
if not na(lb1)
label.delete(lb1)
lb1 := na
if not na(lb2)
label.delete(lb2)
lb2 := na
if not na(sigLb)
label.delete(sigLb)
sigLb := na
setupBull := false
setupBear := false
s_p0 := na
s_p1 := na
s_p2 := na
s_i0 := na
s_i1 := na
s_i2 := na
s_len := na
int sz2 = array.size(prices)
if sz2 >= 3
int t0 = array.get(types, sz2 - 3)
int t1 = array.get(types, sz2 - 2)
int t2 = array.get(types, sz2 - 1)
float p0 = array.get(prices, sz2 - 3)
float p1 = array.get(prices, sz2 - 2)
float p2 = array.get(prices, sz2 - 1)
int i0 = array.get(indexs, sz2 - 3)
int i1 = array.get(indexs, sz2 - 2)
int i2 = array.get(indexs, sz2 - 1)
bool bullCandidate = (t0 == -1 and t1 == 1 and t2 == -1 and p2 > p0)
bool bearCandidate = (t0 == 1 and t1 == -1 and t2 == 1 and p2 < p0)
if bullCandidate
float len = p1 - p0
float depth = (p1 - p2) / len
bool okDepth = len > 0 and depth > 0 and depth <= maxDeep
float hiOTE = math.max(oteA, oteB)
float loOTE = math.min(oteA, oteB)
float zTop = p1 - len * loOTE
float zBot = p1 - len * hiOTE
bool okOTE = not useOTE or (p2 <= zTop and p2 >= zBot)
if okDepth and okOTE
setupBull := true
s_p0 := p0
s_p1 := p1
s_p2 := p2
s_i0 := i0
s_i1 := i1
s_i2 := i2
s_len := len
float pad = atr * entryAtrPad
if showEntryZone
entryBox := box.new(i1, zTop + pad, bar_index, zBot - pad)
slLine := line.new(i0, p0, bar_index + 200, p0)
breakLine := line.new(i1, p1, bar_index + 200, p1)
if showLabels
lb0 := label.new(i0, p0, "0")
lb1 := label.new(i1, p1, "1")
lb2 := label.new(i2, p2, "2")
if bearCandidate
float len = p0 - p1
float depth = (p2 - p1) / len
bool okDepth = len > 0 and depth > 0 and depth <= maxDeep
float hiOTE = math.max(oteA, oteB)
float loOTE = math.min(oteA, oteB)
float zBot = p1 + len * loOTE
float zTop = p1 + len * hiOTE
bool okOTE = not useOTE or (p2 >= zBot and p2 <= zTop)
if okDepth and okOTE
setupBear := true
s_p0 := p0
s_p1 := p1
s_p2 := p2
s_i0 := i0
s_i1 := i1
s_i2 := i2
s_len := len
float pad = atr * entryAtrPad
if showEntryZone
entryBox := box.new(i1, zTop + pad, bar_index, zBot - pad)
slLine := line.new(i0, p0, bar_index + 200, p0)
breakLine := line.new(i1, p1, bar_index + 200, p1)
if showLabels
lb0 := label.new(i0, p0, "0")
lb1 := label.new(i1, p1, "1")
lb2 := label.new(i2, p2, "2")
float buf = atr * breakAtrMult
bool bullBreak = false
bool bearBreak = false
if setupBull and not na(s_p1)
bullBreak := confirmByClose ? (close > s_p1 + buf) : (high > s_p1 + buf)
if setupBear and not na(s_p1)
bearBreak := confirmByClose ? (close < s_p1 - buf) : (low < s_p1 - buf)
if bullBreak
setupBull := false
if showTargets and not na(s_len)
float tp = s_p2 + s_len * targetExt
tpLine := line.new(s_i2, tp, bar_index + 200, tp)
if showRetestZone
float z = atr * retestAtrMult
retestBox := box.new(bar_index, s_p1 + z, bar_index + 120, s_p1 - z)
if showSignals
sigLb := label.new(bar_index, high, "BUY (W3 Confirm)", style=label.style_label_down)
if bearBreak
setupBear := false
if showTargets and not na(s_len)
float tp = s_p2 - s_len * targetExt
tpLine := line.new(s_i2, tp, bar_index + 200, tp)
if showRetestZone
float z = atr * retestAtrMult
retestBox := box.new(bar_index, s_p1 + z, bar_index + 120, s_p1 - z)
if showSignals
sigLb := label.new(bar_index, low, "SELL (W3 Confirm)", style=label.style_label_up)
Open-source script
In true TradingView spirit, the creator of this script has made it open-source, so that traders can review and verify its functionality. Kudos to the author! While you can use it for free, remember that republishing the code is subject to our House Rules.
Disclaimer
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.
Open-source script
In true TradingView spirit, the creator of this script has made it open-source, so that traders can review and verify its functionality. Kudos to the author! While you can use it for free, remember that republishing the code is subject to our House Rules.
Disclaimer
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.