//@version=6 indicator("GM Signal Indicator with TP/SL", overlay=true) // === SETTINGS === emaLen = input.int(50, "EMA Trend") bodyRatio = input.float(0.6, "Body Strength") wickRatio = input.float(1.6, "Wick Strength") lookback = input.int(10, "Liquidity Lookback") // === EMA TREND === ema = ta.ema(close, emaLen) uptrend = close > ema downtrend = close < ema // === CANDLE DATA === body = math.abs(close - open) candleRange = high - low upperWick = high - math.max(close, open) lowerWick = math.min(close, open) - low // === LIQUIDITY LEVELS === prevHigh = ta.highest(high, lookback)[1] prevLow = ta.lowest(low, lookback)[1] // === LIQUIDITY SWEEP === sweepHigh = high > prevHigh and close < prevHigh sweepLow = low < prevLow and close > prevLow // === STRUCTURE SHIFT === bullShift = close > prevHigh bearShift = close < prevLow // === SMART ABSORPTION === sellerAbsorbed = (downtrend or sweepLow) and (lowerWick > body * wickRatio) and close > open and (bullShift or sweepLow) buyerAbsorbed = (uptrend or sweepHigh) and (upperWick > body * wickRatio) and close < open and (bearShift or sweepHigh) // === STRONG PRESSURE === strongBull = close > open and (candleRange > 0 ? body / candleRange : 0) > bodyRatio strongBear = close < open and (candleRange > 0 ? body / candleRange : 0) > bodyRatio // === COLORS === color candleColor = na isYellow = sellerAbsorbed or buyerAbsorbed isPurple = not isYellow and strongBull and close > close[1] isBlack = not isYellow and strongBear and close < close[1] if isYellow candleColor := color.yellow else if isPurple candleColor := color.purple else if isBlack candleColor := color.black else candleColor := close > open ? color.green : color.red barcolor(candleColor) plot(ema, color=color.white, linewidth=2) // === STREAKS (MODE 1) === var int purpleStreak = 0 var int blackStreak = 0 if isPurple purpleStreak += 1 blackStreak := 0 else if isBlack blackStreak += 1 purpleStreak := 0 else purpleStreak := 0 blackStreak := 0 // === TRACK LEVELS === var float lastBlackHigh = na var float lastBlackLow = na var float lastPurpleHigh = na var float lastPurpleLow = na checkBlackHigh = lastBlackHigh checkBlackLow = lastBlackLow checkPurpleHigh = lastPurpleHigh checkPurpleLow = lastPurpleLow // === MODE 1 SIGNALS === buySignal1 = purpleStreak == 2 and (close > checkBlackHigh or close > checkPurpleHigh) sellSignal1 = blackStreak == 2 and (close < checkPurpleLow or close < checkBlackLow) // === MODE 2 SIGNALS === buySignal2 = isPurple and not na(checkBlackHigh) and close > checkBlackHigh sellSignal2 = isBlack and not na(checkPurpleLow) and close < checkPurpleLow // === UPDATE LEVELS === if isBlack lastBlackHigh := high lastBlackLow := low if isPurple lastPurpleHigh := high lastPurpleLow := low // === RESET === if buySignal1 or buySignal2 lastBlackHigh := na lastPurpleHigh := na if sellSignal1 or sellSignal2 lastPurpleLow := na lastBlackLow := na // ======================= // TP/SL STORAGE // ======================= var float buySL = na var float buyTP = na var float sellSL = na var float sellTP = na buySignal = buySignal1 or buySignal2 sellSignal = sellSignal1 or sellSignal2 if buySignal buySL := low[1] buyTP := close + (close - buySL) sellSL := na sellTP := na if sellSignal sellSL := high[1] sellTP := close - (sellSL - close) buySL := na buyTP := na // === SIGNAL PLOTS === plotshape(buySignal1, title="Mode1 Buy", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small) plotshape(sellSignal1, title="Mode1 Sell", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small) plotshape(buySignal2, title="Mode2 Buy", style=shape.circle, location=location.belowbar, color=color.blue, size=size.small) plotshape(sellSignal2, title="Mode2 Sell", style=shape.circle, location=location.abovebar, color=color.orange, size=size.small) // === TP/SL PLOTS === plot(buySignal or not na(buySL) ? buySL : na, title="Buy SL", color=color.red, style=plot.style_linebr, linewidth=1) plot(buySignal or not na(buyTP) ? buyTP : na, title="Buy TP", color=color.green, style=plot.style_linebr, linewidth=1) plot(sellSignal or not na(sellSL) ? sellSL : na, title="Sell SL", color=color.red, style=plot.style_linebr, linewidth=1) plot(sellSignal or not na(sellTP) ? sellTP : na, title="Sell TP", color=color.green, style=plot.style_linebr, linewidth=1) // === ALERTS === alertcondition(buySignal1, title="Mode1 Buy Alert", message="Mode 1 Buy") alertcondition(sellSignal1, title="Mode1 Sell Alert", message="Mode 1 Sell") alertcondition(buySignal2, title="Mode2 Buy Alert", message="Mode 2 Buy") alertcondition(sellSignal2, title="Mode2 Sell Alert", message="Mode 2 Sell")