OPEN-SOURCE SCRIPT

ind wfp 1.2

344
//version=6
indicator('ind wfp 1.2', overlay = true, max_bars_back = 300)

// Input parameters (Existing)
lookbackPeriod = input.int(50, 'Lookback Period', minval = 5, maxval = 200)
minimumPoleHeight = input.float(1.0, 'Minimum Pole Height %', minval = 0.1, maxval = 10.0)
maximumFlagDepth = input.float(75.0, 'Maximum Flag Depth %', minval = 10.0, maxval = 100.0)

// New Input Parameters for Trend Detection
shortTermN = input.int(5, 'Short-term Pivot Lookback', minval=1)
longTermN = input.int(20, 'Long-term Pivot Lookback', minval=1)

// Variables (Existing)
var float wBottom1 = na
var float wTop = na
var float wBottom2 = na
var float flagHigh = na
var float flagLow = na
var int wBottom1Bar = na
var int wTopBar = na
var int wBottom2Bar = na
var int flagStartBar = na
var int flagEndBar = na
var bool flagDetected = false
var bool patternValid = false
var bool plotBreakout = false

// New Variables for Trend and Support/Resistance
var array<float> shortTermHighs = array.new_float(0)
var array<int> shortTermHighBars = array.new_int(0)
var array<float> shortTermLows = array.new_float(0)
var array<int> shortTermLowBars = array.new_int(0)
var array<float> longTermHighs = array.new_float(0)
var array<int> longTermHighBars = array.new_int(0)
var array<float> longTermLows = array.new_float(0)
var array<int> longTermLowBars = array.new_int(0)
var line shortTermUptrendLine = na
var line shortTermDowntrendLine = na
var line longTermUptrendLine = na
var line longTermDowntrendLine = na
var line shortTermSupport = na
var line shortTermResistance = na
var line longTermSupport = na
var line longTermResistance = na

// W Pattern Detection (only on new bars) - Unchanged
if barstate.islast
for i = 1 to math.min(lookbackPeriod - 1, bar_index) by 1
if low < low[i + 1] and low < low[i - 1] and na(wBottom1)
wBottom1 := low
wBottom1Bar := bar_index - i
label.new(wBottom1Bar, low, 'W1', color = color.green, textcolor = color.white, style = label.style_label_up)
continue
if high > high[i + 1] and high > high[i - 1] and not na(wBottom1) and na(wTop)
wTop := high
wTopBar := bar_index - i
label.new(wTopBar, high, 'WT', color = color.red, textcolor = color.white, style = label.style_label_down)
continue
if low < low[i + 1] and low < low[i - 1] and not na(wTop) and na(wBottom2)
wBottom2 := low
wBottom2Bar := bar_index - i
label.new(wBottom2Bar, low, 'W2', color = color.green, textcolor = color.white, style = label.style_label_up)
break

// Verify W pattern - Unchanged
patternValid := false
if not na(wBottom1) and not na(wTop) and not na(wBottom2)
poleHeight = (wTop - math.min(wBottom1, wBottom2)) / math.min(wBottom1, wBottom2) * 100
if poleHeight >= minimumPoleHeight
patternValid := true
label.new(bar_index, high, 'W Valid', color = color.blue, textcolor = color.white, style = label.style_label_down)

// Flag Detection - Unchanged
if patternValid
flagHigh := wTop
flagLow := wTop
flagStartBar := wBottom2Bar
flagDetected := false
for i = math.max(0, bar_index - wBottom2Bar - 1) to 0
if high > wTop
flagEndBar := bar_index - i
break
flagHigh := math.max(flagHigh, high)
flagLow := math.min(flagLow, low)
flagDepth = (wTop - flagLow) / (wTop - math.min(wBottom1, wBottom2)) * 100
if flagDepth <= maximumFlagDepth
flagDetected := true
label.new(flagStartBar, flagHigh, 'Flag', color = color.yellow, textcolor = color.black, style = label.style_label_down)
else
break

// Breakout Detection - Unchanged
plotBreakout := patternValid and flagDetected and close > flagHigh and close[1] <= flagHigh
if plotBreakout
label.new(bar_index, close, 'Breakout', color = color.blue, textcolor = color.white, style = label.style_label_up)

// Plotting (in global scope) - Unchanged
plotshape(patternValid ? wBottom1Bar : na, 'Bottom1', shape.triangleup, location.belowbar, color.green, size = size.tiny)
plotshape(patternValid ? wTopBar : na, 'Top', shape.triangledown, location.abovebar, color.red, size = size.tiny)
plotshape(patternValid ? wBottom2Bar : na, 'Bottom2', shape.triangleup, location.belowbar, color.green, size = size.tiny)
line.new(patternValid ? wBottom1Bar : na, patternValid ? wBottom1 : na, patternValid ? wTopBar : na, patternValid ? wTop : na, color = color.blue, width = 2)
box.new(left = flagDetected and not na(flagEndBar) ? flagStartBar : na, top = flagDetected and not na(flagEndBar) ? flagHigh : na, right = flagDetected and not na(flagEndBar) ? flagEndBar : na, bottom = flagDetected and not na(flagEndBar) ? flagLow : na, bgcolor = color.new(color.yellow, 80), border_color = color.yellow)
plotshape(plotBreakout ? bar_index : na, 'Breakout', shape.labelup, location.belowbar, color.blue, size = size.small)

// Reset variables after breakout - Unchanged
if patternValid and flagDetected and close > flagHigh
wBottom1 := na
wTop := na
wBottom2 := na
flagHigh := na
flagLow := na
wBottom1Bar := na
wTopBar := na
wBottom2Bar := na
flagStartBar := na
flagEndBar := na
flagDetected := false
patternValid := false
plotBreakout := false

// Alert - Unchanged
alertcondition(plotBreakout, 'Breakout', 'W Pattern Flag Breakout')

// New Code: Swing Detection
shortTermHigh = ta.pivothigh(high, shortTermN, shortTermN)
shortTermLow = ta.pivotlow(low, shortTermN, shortTermN)
longTermHigh = ta.pivothigh(high, longTermN, longTermN)
longTermLow = ta.pivotlow(low, longTermN, longTermN)

// Update Arrays with Pivot Points
if not na(shortTermHigh)
array.push(shortTermHighs, shortTermHigh)
array.push(shortTermHighBars, bar_index - shortTermN)
if not na(shortTermLow)
array.push(shortTermLows, shortTermLow)
array.push(shortTermLowBars, bar_index - shortTermN)
if not na(longTermHigh)
array.push(longTermHighs, longTermHigh)
array.push(longTermHighBars, bar_index - longTermN)
if not na(longTermLow)
array.push(longTermLows, longTermLow)
array.push(longTermLowBars, bar_index - longTermN)

// Update Short-term Trend Lines
if array.size(shortTermLowBars) >= 2
x1 = array.get(shortTermLowBars, array.size(shortTermLowBars)-2)
y1 = array.get(shortTermLows, array.size(shortTermLows)-2)
x2 = array.get(shortTermLowBars, array.size(shortTermLowBars)-1)
y2 = array.get(shortTermLows, array.size(shortTermLows)-1)
if na(shortTermUptrendLine)
shortTermUptrendLine := line.new(x1, y1, x2, y2, extend=extend.right, color=color.lime)
else
line.set_xy1(shortTermUptrendLine, x1, y1)
line.set_xy2(shortTermUptrendLine, x2, y2)

if array.size(shortTermHighBars) >= 2
x1 = array.get(shortTermHighBars, array.size(shortTermHighBars)-2)
y1 = array.get(shortTermHighs, array.size(shortTermHighs)-2)
x2 = array.get(shortTermHighBars, array.size(shortTermHighBars)-1)
y2 = array.get(shortTermHighs, array.size(shortTermHighs)-1)
if na(shortTermDowntrendLine)
shortTermDowntrendLine := line.new(x1, y1, x2, y2, extend=extend.right, color=color.orange)
else
line.set_xy1(shortTermDowntrendLine, x1, y1)
line.set_xy2(shortTermDowntrendLine, x2, y2)

// Update Long-term Trend Lines
if array.size(longTermLowBars) >= 2
x1 = array.get(longTermLowBars, array.size(longTermLowBars)-2)
y1 = array.get(longTermLows, array.size(longTermLows)-2)
x2 = array.get(longTermLowBars, array.size(longTermLowBars)-1)
y2 = array.get(longTermLows, array.size(longTermLows)-1)
if na(longTermUptrendLine)
longTermUptrendLine := line.new(x1, y1, x2, y2, extend=extend.right, color=color.green)
else
line.set_xy1(longTermUptrendLine, x1, y1)
line.set_xy2(longTermUptrendLine, x2, y2)

if array.size(longTermHighBars) >= 2
x1 = array.get(longTermHighBars, array.size(longTermHighBars)-2)
y1 = array.get(longTermHighs, array.size(longTermHighs)-2)
x2 = array.get(longTermHighBars, array.size(longTermHighBars)-1)
y2 = array.get(longTermHighs, array.size(longTermHighs)-1)
if na(longTermDowntrendLine)
longTermDowntrendLine := line.new(x1, y1, x2, y2, extend=extend.right, color=color.red)
else
line.set_xy1(longTermDowntrendLine, x1, y1)
line.set_xy2(longTermDowntrendLine, x2, y2)

// Update Support and Resistance Lines
if not na(shortTermLow)
if not na(shortTermSupport)
line.delete(shortTermSupport)
shortTermSupport := line.new(bar_index - shortTermN, shortTermLow, bar_index, shortTermLow, extend=extend.right, color=color.blue, style=line.style_dashed)

if not na(shortTermHigh)
if not na(shortTermResistance)
line.delete(shortTermResistance)
shortTermResistance := line.new(bar_index - shortTermN, shortTermHigh, bar_index, shortTermHigh, extend=extend.right, color=color.red, style=line.style_dashed)

if not na(longTermLow)
if not na(longTermSupport)
line.delete(longTermSupport)
longTermSupport := line.new(bar_index - longTermN, longTermLow, bar_index, longTermLow, extend=extend.right, color=color.navy, style=line.style_dashed)

if not na(longTermHigh)
if not na(longTermResistance)
line.delete(longTermResistance)
longTermResistance := line.new(bar_index - longTermN, longTermHigh, bar_index, longTermHigh, extend=extend.right, color=color.maroon, style=line.style_dashed)

Aviso legal

As informações e publicações não devem ser e não constituem conselhos ou recomendações financeiras, de investimento, de negociação ou de qualquer outro tipo, fornecidas ou endossadas pela TradingView. Leia mais em Termos de uso.