//@version=6 indicator("Smart EMA Candle Sniper v1", overlay=true, max_lines_count=500, max_labels_count=500) //========================= // Inputs //========================= fastEMA = input.int(20, "EMA Fast") midEMA = input.int(50, "EMA Mid") slowEMA = input.int(200, "EMA Slow") rsiPeriod = input.int(14, "RSI Period") atrPeriod = input.int(14, "ATR Period") rsiBuyLvl = input.float(50.0, "RSI Buy Level") rsiSellLvl = input.float(50.0, "RSI Sell Level") atrSLmult = input.float(1.2, "SL = ATR x", step=0.1) tp1mult = input.float(1.0, "TP1 = ATR x", step=0.1) tp2mult = input.float(1.5, "TP2 = ATR x", step=0.1) tp3mult = input.float(2.0, "TP3 = ATR x", step=0.1) tp4mult = input.float(3.0, "TP4 = ATR x", step=0.1) useBullishEngulfing = input.bool(true, "Use Bullish Engulfing") useBearishEngulfing = input.bool(true, "Use Bearish Engulfing") useHammer = input.bool(true, "Use Hammer") useShootingStar = input.bool(true, "Use Shooting Star") useDojiBreak = input.bool(true, "Use Doji Break") showTargets = input.bool(true, "Show Targets") showOnlyLatest = input.bool(true, "Show Only Latest Signal Levels") extendBars = input.int(20, "Extend Lines Bars", minval=5, maxval=200) //========================= // Indicators //========================= ema20 = ta.ema(close, fastEMA) ema50 = ta.ema(close, midEMA) ema200 = ta.ema(close, slowEMA) rsiVal = ta.rsi(close, rsiPeriod) atrVal = ta.atr(atrPeriod) plot(ema20, color=color.aqua, title="EMA 20", linewidth=2) plot(ema50, color=color.red, title="EMA 50", linewidth=2) plot(ema200, color=color.green, title="EMA 200", linewidth=2) //========================= // Candle data //========================= body = math.abs(close - open) rangeVal = high - low upperWick = high - math.max(open, close) lowerWick = math.min(open, close) - low isDoji = rangeVal > 0 ? (body / rangeVal) <= 0.15 : false //========================= // Patterns //========================= bullishEngulfing = ( close[1] < open[1] and close > open and math.min(open, close) <= math.min(open[1], close[1]) and math.max(open, close) >= math.max(open[1], close[1]) ) bearishEngulfing = ( close[1] > open[1] and close < open and math.min(open, close) <= math.min(open[1], close[1]) and math.max(open, close) >= math.max(open[1], close[1]) ) hammer = ( rangeVal > 0 and body > 0 and (body / rangeVal) <= 0.35 and lowerWick >= body * 2.0 and upperWick <= body ) shootingStar = ( rangeVal > 0 and body > 0 and (body / rangeVal) <= 0.35 and upperWick >= body * 2.0 and lowerWick <= body ) bullishDojiBreak = (isDoji[1] and close > high[1] and close > open) bearishDojiBreak = (isDoji[1] and close < low[1] and close < open) bullPattern = ( (useBullishEngulfing and bullishEngulfing) or (useHammer and hammer) or (useDojiBreak and bullishDojiBreak) ) bearPattern = ( (useBearishEngulfing and bearishEngulfing) or (useShootingStar and shootingStar) or (useDojiBreak and bearishDojiBreak) ) //========================= // Trend filters //========================= bullTrend = (close > ema200 and ema20 > ema50 and rsiVal > rsiBuyLvl) bearTrend = (close < ema200 and ema20 < ema50 and rsiVal < rsiSellLvl) buySignal = bullTrend and bullPattern sellSignal = bearTrend and bearPattern plotshape(buySignal, title="BUY", style=shape.labelup, location=location.belowbar, color=color.lime, text="BUY", textcolor=color.black, size=size.small) plotshape(sellSignal, title="SELL", style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", textcolor=color.white, size=size.small) //========================= // Storage for latest objects //========================= var line buySL = na var line buyTP1 = na var line buyTP2 = na var line buyTP3 = na var line buyTP4 = na var line sellSL = na var line sellTP1 = na var line sellTP2 = na var line sellTP3 = na var line sellTP4 = na var label buyInfoLabel = na var label sellInfoLabel = na //========================= // Delete helpers //========================= f_delete_buy() => if not na(buySL) line.delete(buySL) buySL := na if not na(buyTP1) line.delete(buyTP1) buyTP1 := na if not na(buyTP2) line.delete(buyTP2) buyTP2 := na if not na(buyTP3) line.delete(buyTP3) buyTP3 := na if not na(buyTP4) line.delete(buyTP4) buyTP4 := na if not na(buyInfoLabel) label.delete(buyInfoLabel) buyInfoLabel := na f_delete_sell() => if not na(sellSL) line.delete(sellSL) sellSL := na if not na(sellTP1) line.delete(sellTP1) sellTP1 := na if not na(sellTP2) line.delete(sellTP2) sellTP2 := na if not na(sellTP3) line.delete(sellTP3) sellTP3 := na if not na(sellTP4) line.delete(sellTP4) sellTP4 := na if not na(sellInfoLabel) label.delete(sellInfoLabel) sellInfoLabel := na //========================= // Draw Buy levels //========================= if buySignal and showTargets if showOnlyLatest f_delete_buy() entryBuy = close slBuy = entryBuy - atrVal * atrSLmult tp1Buy = entryBuy + atrVal * tp1mult tp2Buy = entryBuy + atrVal * tp2mult tp3Buy = entryBuy + atrVal * tp3mult tp4Buy = entryBuy + atrVal * tp4mult buySL := line.new(bar_index, slBuy, bar_index + extendBars, slBuy, color=color.red, style=line.style_dashed, width=2) buyTP1 := line.new(bar_index, tp1Buy, bar_index + extendBars, tp1Buy, color=color.lime, style=line.style_dashed, width=1) buyTP2 := line.new(bar_index, tp2Buy, bar_index + extendBars, tp2Buy, color=color.lime, style=line.style_dashed, width=1) buyTP3 := line.new(bar_index, tp3Buy, bar_index + extendBars, tp3Buy, color=color.lime, style=line.style_dashed, width=1) buyTP4 := line.new(bar_index, tp4Buy, bar_index + extendBars, tp4Buy, color=color.lime, style=line.style_dashed, width=1) buyInfoLabel := label.new( bar_index, low, "BUY\n" + "Entry: " + str.tostring(entryBuy) + "\n" + "SL: " + str.tostring(slBuy) + "\n" + "TP1: " + str.tostring(tp1Buy) + "\n" + "TP2: " + str.tostring(tp2Buy) + "\n" + "TP3: " + str.tostring(tp3Buy) + "\n" + "TP4: " + str.tostring(tp4Buy), style=label.style_label_up, color=color.lime, textcolor=color.black, size=size.small ) //========================= // Draw Sell levels //========================= if sellSignal and showTargets if showOnlyLatest f_delete_sell() entrySell = close slSell = entrySell + atrVal * atrSLmult tp1Sell = entrySell - atrVal * tp1mult tp2Sell = entrySell - atrVal * tp2mult tp3Sell = entrySell - atrVal * tp3mult tp4Sell = entrySell - atrVal * tp4mult sellSL := line.new(bar_index, slSell, bar_index + extendBars, slSell, color=color.red, style=line.style_dashed, width=2) sellTP1 := line.new(bar_index, tp1Sell, bar_index + extendBars, tp1Sell, color=color.orange, style=line.style_dashed, width=1) sellTP2 := line.new(bar_index, tp2Sell, bar_index + extendBars, tp2Sell, color=color.orange, style=line.style_dashed, width=1) sellTP3 := line.new(bar_index, tp3Sell, bar_index + extendBars, tp3Sell, color=color.orange, style=line.style_dashed, width=1) sellTP4 := line.new(bar_index, tp4Sell, bar_index + extendBars, tp4Sell, color=color.orange, style=line.style_dashed, width=1) sellInfoLabel := label.new( bar_index, high, "SELL\n" + "Entry: " + str.tostring(entrySell) + "\n" + "SL: " + str.tostring(slSell) + "\n" + "TP1: " + str.tostring(tp1Sell) + "\n" + "TP2: " + str.tostring(tp2Sell) + "\n" + "TP3: " + str.tostring(tp3Sell) + "\n" + "TP4: " + str.tostring(tp4Sell), style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small ) //========================= // Alerts //========================= alertcondition(buySignal, title="Buy Alert", message="BUY signal on {{ticker}}") alertcondition(sellSignal, title="Sell Alert", message="SELL signal on {{ticker}}") ) ) ) ) ) ) ) )