diff --git a/Niki/GPT/pine/swing.pine b/Niki/GPT/pine/swing.pine new file mode 100644 index 0000000..61f92c7 --- /dev/null +++ b/Niki/GPT/pine/swing.pine @@ -0,0 +1,222 @@ +// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ +// © d_popov + +//Larry Williams inspired multi-trend analysis strategy +// This script implements a multi-trend analysis strategy based on the concepts discussed in the transcript. + +//@version=6 +strategy("Multi-Trend Analysis Strategy", overlay=true, fill_orders_on_standard_ohlc = true) + +// Input parameters for swing detection and trend analysis +swingLookback = input.int(5, "Swing Point Lookback", minval=1, tooltip="Number of bars to look back for swing highs/lows") +blueRangeBars = input.int(13, "Blue Trend (Short-term) Range Bars", minval=1) +purpleRangeBars = input.int(21, "Purple Trend Range Bars", minval=1) +orangeRangeBars = input.int(34, "Orange Trend Range Bars", minval=1) +yellowRangeBars = input.int(55, "Yellow Trend (Long-term) Range Bars", minval=1) +magentaRangeBars = input.int(89, "Magenta Trend Range Bars", minval=1) + +// Detect base swing highs and lows +baseSwingHigh = ta.pivothigh(high, swingLookback, swingLookback) +baseSwingLow = ta.pivotlow(low, swingLookback, swingLookback) + +// Store base swing points +var float[] baseHighs = array.new_float(0) +var float[] baseLows = array.new_float(0) + +// Store trend swing points +var float[] blueHighs = array.new_float(0) +var float[] blueLows = array.new_float(0) +var float[] purpleHighs = array.new_float(0) +var float[] purpleLows = array.new_float(0) +var float[] orangeHighs = array.new_float(0) +var float[] orangeLows = array.new_float(0) +var float[] yellowHighs = array.new_float(0) +var float[] yellowLows = array.new_float(0) +var float[] magentaHighs = array.new_float(0) +var float[] magentaLows = array.new_float(0) + +// Update base swing points +if not na(baseSwingHigh) + array.push(baseHighs, baseSwingHigh) + if array.size(baseHighs) > blueRangeBars * 2 // Keep enough history + array.shift(baseHighs) + +if not na(baseSwingLow) + array.push(baseLows, baseSwingLow) + if array.size(baseLows) > blueRangeBars * 2 + array.shift(baseLows) + +// Hierarchical trend extraction +// Blue trend (directly from base points but filtered) +blueExtractInterval = 2 +if array.size(baseHighs) >= 3 and bar_index % blueExtractInterval == 0 + float lastHigh = array.get(baseHighs, array.size(baseHighs) - 1) + // Only add if it's a significant swing + if array.size(blueHighs) == 0 or math.abs(lastHigh - array.get(blueHighs, array.size(blueHighs) - 1)) > ta.atr(14) * 0.5 + array.push(blueHighs, lastHigh) + if array.size(blueHighs) > blueRangeBars + array.shift(blueHighs) + +if array.size(baseLows) >= 3 and bar_index % blueExtractInterval == 0 + float lastLow = array.get(baseLows, array.size(baseLows) - 1) + // Only add if it's a significant swing + if array.size(blueLows) == 0 or math.abs(lastLow - array.get(blueLows, array.size(blueLows) - 1)) > ta.atr(14) * 0.5 + array.push(blueLows, lastLow) + if array.size(blueLows) > blueRangeBars + array.shift(blueLows) + +// Purple trend (from blue) +purpleExtractInterval = 3 +if array.size(blueHighs) >= 3 and bar_index % purpleExtractInterval == 0 + float lastHigh = array.get(blueHighs, array.size(blueHighs) - 1) + if array.size(purpleHighs) == 0 or math.abs(lastHigh - array.get(purpleHighs, array.size(purpleHighs) - 1)) > ta.atr(14) * 0.8 + array.push(purpleHighs, lastHigh) + if array.size(purpleHighs) > purpleRangeBars + array.shift(purpleHighs) + +if array.size(blueLows) >= 3 and bar_index % purpleExtractInterval == 0 + float lastLow = array.get(blueLows, array.size(blueLows) - 1) + if array.size(purpleLows) == 0 or math.abs(lastLow - array.get(purpleLows, array.size(purpleLows) - 1)) > ta.atr(14) * 0.8 + array.push(purpleLows, lastLow) + if array.size(purpleLows) > purpleRangeBars + array.shift(purpleLows) + +// Orange trend (from purple) +orangeExtractInterval = 5 +if array.size(purpleHighs) >= 3 and bar_index % orangeExtractInterval == 0 + float lastHigh = array.get(purpleHighs, array.size(purpleHighs) - 1) + if array.size(orangeHighs) == 0 or math.abs(lastHigh - array.get(orangeHighs, array.size(orangeHighs) - 1)) > ta.atr(14) * 1.2 + array.push(orangeHighs, lastHigh) + if array.size(orangeHighs) > orangeRangeBars + array.shift(orangeHighs) + +if array.size(purpleLows) >= 3 and bar_index % orangeExtractInterval == 0 + float lastLow = array.get(purpleLows, array.size(purpleLows) - 1) + if array.size(orangeLows) == 0 or math.abs(lastLow - array.get(orangeLows, array.size(orangeLows) - 1)) > ta.atr(14) * 1.2 + array.push(orangeLows, lastLow) + if array.size(orangeLows) > orangeRangeBars + array.shift(orangeLows) + +// Yellow trend (from orange) +yellowExtractInterval = 8 +if array.size(orangeHighs) >= 3 and bar_index % yellowExtractInterval == 0 + float lastHigh = array.get(orangeHighs, array.size(orangeHighs) - 1) + if array.size(yellowHighs) == 0 or math.abs(lastHigh - array.get(yellowHighs, array.size(yellowHighs) - 1)) > ta.atr(14) * 1.5 + array.push(yellowHighs, lastHigh) + if array.size(yellowHighs) > yellowRangeBars + array.shift(yellowHighs) + +if array.size(orangeLows) >= 3 and bar_index % yellowExtractInterval == 0 + float lastLow = array.get(orangeLows, array.size(orangeLows) - 1) + if array.size(yellowLows) == 0 or math.abs(lastLow - array.get(yellowLows, array.size(yellowLows) - 1)) > ta.atr(14) * 1.5 + array.push(yellowLows, lastLow) + if array.size(yellowLows) > yellowRangeBars + array.shift(yellowLows) + +// Magenta trend (from yellow) +magentaExtractInterval = 13 +if array.size(yellowHighs) >= 3 and bar_index % magentaExtractInterval == 0 + float lastHigh = array.get(yellowHighs, array.size(yellowHighs) - 1) + if array.size(magentaHighs) == 0 or math.abs(lastHigh - array.get(magentaHighs, array.size(magentaHighs) - 1)) > ta.atr(14) * 2.0 + array.push(magentaHighs, lastHigh) + if array.size(magentaHighs) > magentaRangeBars + array.shift(magentaHighs) + +if array.size(yellowLows) >= 3 and bar_index % magentaExtractInterval == 0 + float lastLow = array.get(yellowLows, array.size(yellowLows) - 1) + if array.size(magentaLows) == 0 or math.abs(lastLow - array.get(magentaLows, array.size(magentaLows) - 1)) > ta.atr(14) * 2.0 + array.push(magentaLows, lastLow) + if array.size(magentaLows) > magentaRangeBars + array.shift(magentaLows) + +// Determine trend directions +blueTrendUp = array.size(blueLows) >= 2 and array.get(blueLows, array.size(blueLows) - 1) > array.get(blueLows, array.size(blueLows) - 2) +blueTrendDown = array.size(blueHighs) >= 2 and array.get(blueHighs, array.size(blueHighs) - 1) < array.get(blueHighs, array.size(blueHighs) - 2) + +purpleTrendUp = array.size(purpleLows) >= 2 and array.get(purpleLows, array.size(purpleLows) - 1) > array.get(purpleLows, array.size(purpleLows) - 2) +purpleTrendDown = array.size(purpleHighs) >= 2 and array.get(purpleHighs, array.size(purpleHighs) - 1) < array.get(purpleHighs, array.size(purpleHighs) - 2) + +orangeTrendUp = array.size(orangeLows) >= 2 and array.get(orangeLows, array.size(orangeLows) - 1) > array.get(orangeLows, array.size(orangeLows) - 2) +orangeTrendDown = array.size(orangeHighs) >= 2 and array.get(orangeHighs, array.size(orangeHighs) - 1) < array.get(orangeHighs, array.size(orangeHighs) - 2) + +yellowTrendUp = array.size(yellowLows) >= 2 and array.get(yellowLows, array.size(yellowLows) - 1) > array.get(yellowLows, array.size(yellowLows) - 2) +yellowTrendDown = array.size(yellowHighs) >= 2 and array.get(yellowHighs, array.size(yellowHighs) - 1) < array.get(yellowHighs, array.size(yellowHighs) - 2) + +magentaTrendUp = array.size(magentaLows) >= 2 and array.get(magentaLows, array.size(magentaLows) - 1) > array.get(magentaLows, array.size(magentaLows) - 2) +magentaTrendDown = array.size(magentaHighs) >= 2 and array.get(magentaHighs, array.size(magentaHighs) - 1) < array.get(magentaHighs, array.size(magentaHighs) - 2) + +// Imbalance detection (simplified) +highImbalance = high > high[1] and high[1] > high[2] and low < low[1] +lowImbalance = low < low[1] and low[1] < low[2] and high > high[1] + +// Calculate trend strengths (weighted by timeframe importance) +bullishStrength = (blueTrendUp ? 1 : 0) + (purpleTrendUp ? 2 : 0) + (orangeTrendUp ? 3 : 0) + (yellowTrendUp ? 5 : 0) + (magentaTrendUp ? 4 : 0) +bearishStrength = (blueTrendDown ? 1 : 0) + (purpleTrendDown ? 2 : 0) + (orangeTrendDown ? 3 : 0) + (yellowTrendDown ? 5 : 0) + (magentaTrendDown ? 4 : 0) + +// Entry conditions based on multi-trend alignment +longCondition = blueTrendUp and orangeTrendUp and not magentaTrendDown and bullishStrength > bearishStrength and lowImbalance +varip shortConditionBase = blueTrendDown and orangeTrendDown and not magentaTrendUp and bearishStrength > bullishStrength and highImbalance + +// Add preference for shorting when there's weakness as mentioned in the transcript +weaknessDetected = orangeTrendDown and magentaTrendDown and not yellowTrendUp +shortBias = input.bool(true, "Bearish Bias (Short Preference)", tooltip="Prefer short positions when market shows weakness") + +// Determine final short condition +shortCondition = shortBias and weaknessDetected or shortConditionBase + +// Market open condition +marketSession = "0930-1030" +marketTimezone = "America/New_York" +isMarketOpen = not na(time(timeframe.period, marketSession, marketTimezone)) + +// Entry points +if longCondition and (not shortBias or isMarketOpen) + strategy.entry("Long", strategy.long) + +if shortCondition + strategy.entry("Short", strategy.short) + +// Exit based on trend reversal +if strategy.position_size > 0 and (blueTrendDown or orangeTrendDown) + strategy.close("Long", comment="Exit Long") + +if strategy.position_size < 0 and (blueTrendUp or orangeTrendUp) + strategy.close("Short", comment="Exit Short") + +// Visualize base swing points +plotshape(baseSwingHigh, title="Swing High", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny) +plotshape(baseSwingLow, title="Swing Low", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny) + +// Visualize trend directions with shapes instead of characters +// Blue trend +plotshape(blueTrendUp and not blueTrendUp[1], title="Blue Trend Up Start", style=shape.arrowup, location=location.belowbar, color=color.blue, size=size.small) +plotshape(blueTrendDown and not blueTrendDown[1], title="Blue Trend Down Start", style=shape.arrowdown, location=location.abovebar, color=color.blue, size=size.small) + +// Purple trend +plotshape(purpleTrendUp and not purpleTrendUp[1], title="Purple Trend Up Start", style=shape.arrowup, location=location.belowbar, color=color.purple, size=size.small) +plotshape(purpleTrendDown and not purpleTrendDown[1], title="Purple Trend Down Start", style=shape.arrowdown, location=location.abovebar, color=color.purple, size=size.small) + +// Orange trend +plotshape(orangeTrendUp and not orangeTrendUp[1], title="Orange Trend Up Start", style=shape.arrowup, location=location.belowbar, color=color.orange, size=size.small) +plotshape(orangeTrendDown and not orangeTrendDown[1], title="Orange Trend Down Start", style=shape.arrowdown, location=location.abovebar, color=color.orange, size=size.small) + +// Yellow trend +plotshape(yellowTrendUp and not yellowTrendUp[1], title="Yellow Trend Up Start", style=shape.arrowup, location=location.belowbar, color=color.yellow, size=size.small) +plotshape(yellowTrendDown and not yellowTrendDown[1], title="Yellow Trend Down Start", style=shape.arrowdown, location=location.abovebar, color=color.yellow, size=size.small) + +// Magenta trend +plotshape(magentaTrendUp and not magentaTrendUp[1], title="Magenta Trend Up Start", style=shape.arrowup, location=location.belowbar, color=color.fuchsia, size=size.small) +plotshape(magentaTrendDown and not magentaTrendDown[1], title="Magenta Trend Down Start", style=shape.arrowdown, location=location.abovebar, color=color.fuchsia, size=size.small) + +// Display current trend status using table +var table trendTable = table.new(position.top_right, 5, 2, color.black, color.white, 2, color.gray, 2) +if barstate.islast + table.cell(trendTable, 0, 0, "Trend", text_color=color.white, bgcolor=color.gray) + table.cell(trendTable, 1, 0, "Direction", text_color=color.white, bgcolor=color.gray) + + table.cell(trendTable, 0, 1, "Blue", text_color=color.blue, bgcolor=color.black) + table.cell(trendTable, 1, 1, blueTrendUp ? "UP" : blueTrendDown ? "DOWN" : "FLAT", + text_color=blueTrendUp ? color.green : blueTrendDown ? color.red : color.gray, bgcolor=color.black) + +// Highlight imbalance areas +bgcolor(highImbalance ? color.new(color.red, 90) : lowImbalance ? color.new(color.green, 90) : na, title="Imbalance Background") \ No newline at end of file