OPEN-SOURCE SCRIPT

ind wfp 1.2

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

إخلاء المسؤولية

لا يُقصد بالمعلومات والمنشورات أن تكون، أو تشكل، أي نصيحة مالية أو استثمارية أو تجارية أو أنواع أخرى من النصائح أو التوصيات المقدمة أو المعتمدة من TradingView. اقرأ المزيد في شروط الاستخدام.