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)

คำจำกัดสิทธิ์ความรับผิดชอบ

ข้อมูลและบทความไม่ได้มีวัตถุประสงค์เพื่อก่อให้เกิดกิจกรรมทางการเงิน, การลงทุน, การซื้อขาย, ข้อเสนอแนะ หรือคำแนะนำประเภทอื่น ๆ ที่ให้หรือรับรองโดย TradingView อ่านเพิ่มเติมใน ข้อกำหนดการใช้งาน