OPEN-SOURCE SCRIPT

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

155
//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)

Pernyataan Penyangkalan

Informasi dan publikasi ini tidak dimaksudkan, dan bukan merupakan, saran atau rekomendasi keuangan, investasi, trading, atau jenis lainnya yang diberikan atau didukung oleh TradingView. Baca selengkapnya di Ketentuan Penggunaan.