OPEN-SOURCE SCRIPT
Hammer, Engulfing & Star Candles aksh

//version=5
indicator("Hammer, Engulfing & Star Candles [v5]", overlay=true, max_bars_back=500)
// ===== Inputs =====
showHammer = input.bool(true, "Show Hammer")
showShootingStar = input.bool(true, "Show Shooting Star")
showEngulfing = input.bool(true, "Show Bull/Bear Engulfing")
showMorningStar = input.bool(true, "Show Morning Star (3-candle)")
showEveningStar = input.bool(true, "Show Evening Star (3-candle)")
// Sensitivity / thresholds
wickToBodyMin = input.float(2.5, "Min Wick:Body (Hammer/Star)", minval=0.5, step=0.1)
maxOppWickToBody = input.float(0.7, "Max Opp Wick:Body (Hammer/Star)", minval=0.0, step=0.1)
closeInTopPct = input.float(0.35, "Hammer: close in top % of range", minval=0.0, maxval=1.0, step=0.05)
closeInBotPct = input.float(0.35, "Star: close in bottom % of range", minval=0.0, maxval=1.0, step=0.05)
minBodyFracRange = input.float(0.15, "Min body as % of range (avoid doji)", minval=0.0, maxval=1.0, step=0.01)
engulfRequireBodyPct = input.float(1.00, "Engulfing: body >= prev body x", minval=0.5, maxval=3.0, step=0.05)
engulfAllowWicks = input.bool(false, "Engulfing: allow wick engulf if bodies equal")
starMiddleBodyMaxPct = input.float(0.40, "Morning/Evening Star: middle body <= % of avg body", minval=0.05, maxval=1.0, step=0.05)
starCloseRetracePct = input.float(0.50, "Morning/Evening Star: final close retraces >= % of first body", minval=0.25, maxval=1.0, step=0.05)
// ===== Helpers =====
body(c,o) => math.abs(c - o)
upperWick(h,o,c) => h - math.max(o, c)
lowerWick(l,o,c) => math.min(o, c) - l
rng(h,l) => h - l
isBull(o,c) => c > o
isBear(o,c) => o > c
midpoint(h,l) => (h + l) * 0.5
b = body(close, open)
uw = upperWick(high, open, close)
lw = lowerWick(low, open, close)
rg = rng(high, low)
prev_o = open[1], prev_c = close[1], prev_h = high[1], prev_l = low[1]
prev_b = body(prev_c, prev_o)
// avoid divide-by-zero
safe(val) => nz(val, 0.0000001)
// ===== Single-candle patterns =====
// Hammer: long lower wick, small/limited upper wick, decent body, close toward top of range
hammer = showHammer and rg > 0 and b/rg >= minBodyFracRange and
(lw / safe(b) >= wickToBodyMin) and (uw / safe(b) <= maxOppWickToBody) and
(close >= (low + (1.0 - closeInTopPct) * rg))
// Shooting Star: long upper wick, small/limited lower wick, close toward bottom
shootingStar = showShootingStar and rg > 0 and b/rg >= minBodyFracRange and
(uw / safe(b) >= wickToBodyMin) and (lw / safe(b) <= maxOppWickToBody) and
(close <= (low + closeInBotPct * rg))
// ===== Two-candle patterns: Engulfing =====
// Bullish engulfing: previous bearish, current bullish, current body engulfs previous body
bullEngulf = showEngulfing and isBear(prev_o, prev_c) and isBull(open, close) and
(open <= prev_c and close >= prev_o) and (b >= engulfRequireBodyPct * prev_b or (engulfAllowWicks and high >= prev_h and low <= prev_l))
// Bearish engulfing: previous bullish, current bearish, current body engulfs previous body
bearEngulf = showEngulfing and isBull(prev_o, prev_c) and isBear(open, close) and
(open >= prev_c and close <= prev_o) and (b >= engulfRequireBodyPct * prev_b or (engulfAllowWicks and high >= prev_h and low <= prev_l))
// ===== Three-candle patterns: Morning/Evening Star =====
// Morning Star: strong bearish candle, small middle candle (gap or small body), strong bullish close retracing into first body
o2 = open[2], c2 = close[2]
b2 = body(c2, o2)
avgBody = ta.sma(body(close, open), 20)
smallMiddle = body(close[1], open[1]) <= starMiddleBodyMaxPct * nz(avgBody, prev_b)
firstBear = isBear(o2, c2)
lastBull = isBull(open, close)
retrBull = lastBull and (close >= (c2 + starCloseRetracePct * (o2 - c2)))
morningStar = showMorningStar and firstBear and smallMiddle and retrBull
// Evening Star: mirror
firstBull = isBull(o2, c2)
lastBear = isBear(open, close)
retrBear = lastBear and (close <= (c2 - starCloseRetracePct * (c2 - o2)))
eveningStar = showEveningStar and firstBull and smallMiddle and retrBear
// ===== Plotting =====
plotshape(hammer, title="Hammer", style=shape.labelup, location=location.belowbar, text="🔨\nHammer", size=size.tiny, color=color.new(color.lime, 0), textcolor=color.black)
plotshape(shootingStar, title="Shooting Star", style=shape.labeldown, location=location.abovebar, text="⭐\nStar", size=size.tiny, color=color.new(color.orange, 0), textcolor=color.black)
plotshape(bullEngulf, title="Bull Engulfing", style=shape.labelup, location=location.belowbar, text="🟢\nEngulf", size=size.tiny, color=color.new(color.teal, 0), textcolor=color.black)
plotshape(bearEngulf, title="Bear Engulfing", style=shape.labeldown, location=location.abovebar, text="🔴\nEngulf", size=size.tiny, color=color.new(color.red, 0), textcolor=color.white)
plotshape(morningStar, title="Morning Star", style=shape.labelup, location=location.belowbar, text="🌅\nMorning", size=size.tiny, color=color.new(color.aqua, 0), textcolor=color.black)
plotshape(eveningStar, title="Evening Star", style=shape.labeldown, location=location.abovebar, text="🌆\nEvening", size=size.tiny, color=color.new(color.purple, 0), textcolor=color.white)
// Optional: color bars when patterns occur
barcolor(hammer ? color.new(color.lime, 60) : na)
barcolor(shootingStar ? color.new(color.orange, 60) : na)
barcolor(bullEngulf ? color.new(color.teal, 70) : na)
barcolor(bearEngulf ? color.new(color.red, 70) : na)
barcolor(morningStar ? color.new(color.aqua, 70) : na)
barcolor(eveningStar ? color.new(color.purple, 70) : na)
// ===== Alerts =====
alertcondition(hammer, "Hammer", "Hammer detected")
alertcondition(shootingStar, "Shooting Star", "Shooting Star detected")
alertcondition(bullEngulf, "Bullish Engulfing","Bullish Engulfing detected")
alertcondition(bearEngulf, "Bearish Engulfing","Bearish Engulfing detected")
alertcondition(morningStar, "Morning Star", "Morning Star detected (3-candle)")
alertcondition(eveningStar, "Evening Star", "Evening Star detected (3-candle)")
// ===== Hints (toggle in the Style tab if labels feel too crowded) =====
// You can adjust thresholds to match your market/timeframe.
// Common tweaks: increase wickToBodyMin for stricter hammers/stars; increase minBodyFracRange to avoid doji;
// require stronger retrace in star patterns by raising starCloseRetracePct.
indicator("Hammer, Engulfing & Star Candles [v5]", overlay=true, max_bars_back=500)
// ===== Inputs =====
showHammer = input.bool(true, "Show Hammer")
showShootingStar = input.bool(true, "Show Shooting Star")
showEngulfing = input.bool(true, "Show Bull/Bear Engulfing")
showMorningStar = input.bool(true, "Show Morning Star (3-candle)")
showEveningStar = input.bool(true, "Show Evening Star (3-candle)")
// Sensitivity / thresholds
wickToBodyMin = input.float(2.5, "Min Wick:Body (Hammer/Star)", minval=0.5, step=0.1)
maxOppWickToBody = input.float(0.7, "Max Opp Wick:Body (Hammer/Star)", minval=0.0, step=0.1)
closeInTopPct = input.float(0.35, "Hammer: close in top % of range", minval=0.0, maxval=1.0, step=0.05)
closeInBotPct = input.float(0.35, "Star: close in bottom % of range", minval=0.0, maxval=1.0, step=0.05)
minBodyFracRange = input.float(0.15, "Min body as % of range (avoid doji)", minval=0.0, maxval=1.0, step=0.01)
engulfRequireBodyPct = input.float(1.00, "Engulfing: body >= prev body x", minval=0.5, maxval=3.0, step=0.05)
engulfAllowWicks = input.bool(false, "Engulfing: allow wick engulf if bodies equal")
starMiddleBodyMaxPct = input.float(0.40, "Morning/Evening Star: middle body <= % of avg body", minval=0.05, maxval=1.0, step=0.05)
starCloseRetracePct = input.float(0.50, "Morning/Evening Star: final close retraces >= % of first body", minval=0.25, maxval=1.0, step=0.05)
// ===== Helpers =====
body(c,o) => math.abs(c - o)
upperWick(h,o,c) => h - math.max(o, c)
lowerWick(l,o,c) => math.min(o, c) - l
rng(h,l) => h - l
isBull(o,c) => c > o
isBear(o,c) => o > c
midpoint(h,l) => (h + l) * 0.5
b = body(close, open)
uw = upperWick(high, open, close)
lw = lowerWick(low, open, close)
rg = rng(high, low)
prev_o = open[1], prev_c = close[1], prev_h = high[1], prev_l = low[1]
prev_b = body(prev_c, prev_o)
// avoid divide-by-zero
safe(val) => nz(val, 0.0000001)
// ===== Single-candle patterns =====
// Hammer: long lower wick, small/limited upper wick, decent body, close toward top of range
hammer = showHammer and rg > 0 and b/rg >= minBodyFracRange and
(lw / safe(b) >= wickToBodyMin) and (uw / safe(b) <= maxOppWickToBody) and
(close >= (low + (1.0 - closeInTopPct) * rg))
// Shooting Star: long upper wick, small/limited lower wick, close toward bottom
shootingStar = showShootingStar and rg > 0 and b/rg >= minBodyFracRange and
(uw / safe(b) >= wickToBodyMin) and (lw / safe(b) <= maxOppWickToBody) and
(close <= (low + closeInBotPct * rg))
// ===== Two-candle patterns: Engulfing =====
// Bullish engulfing: previous bearish, current bullish, current body engulfs previous body
bullEngulf = showEngulfing and isBear(prev_o, prev_c) and isBull(open, close) and
(open <= prev_c and close >= prev_o) and (b >= engulfRequireBodyPct * prev_b or (engulfAllowWicks and high >= prev_h and low <= prev_l))
// Bearish engulfing: previous bullish, current bearish, current body engulfs previous body
bearEngulf = showEngulfing and isBull(prev_o, prev_c) and isBear(open, close) and
(open >= prev_c and close <= prev_o) and (b >= engulfRequireBodyPct * prev_b or (engulfAllowWicks and high >= prev_h and low <= prev_l))
// ===== Three-candle patterns: Morning/Evening Star =====
// Morning Star: strong bearish candle, small middle candle (gap or small body), strong bullish close retracing into first body
o2 = open[2], c2 = close[2]
b2 = body(c2, o2)
avgBody = ta.sma(body(close, open), 20)
smallMiddle = body(close[1], open[1]) <= starMiddleBodyMaxPct * nz(avgBody, prev_b)
firstBear = isBear(o2, c2)
lastBull = isBull(open, close)
retrBull = lastBull and (close >= (c2 + starCloseRetracePct * (o2 - c2)))
morningStar = showMorningStar and firstBear and smallMiddle and retrBull
// Evening Star: mirror
firstBull = isBull(o2, c2)
lastBear = isBear(open, close)
retrBear = lastBear and (close <= (c2 - starCloseRetracePct * (c2 - o2)))
eveningStar = showEveningStar and firstBull and smallMiddle and retrBear
// ===== Plotting =====
plotshape(hammer, title="Hammer", style=shape.labelup, location=location.belowbar, text="🔨\nHammer", size=size.tiny, color=color.new(color.lime, 0), textcolor=color.black)
plotshape(shootingStar, title="Shooting Star", style=shape.labeldown, location=location.abovebar, text="⭐\nStar", size=size.tiny, color=color.new(color.orange, 0), textcolor=color.black)
plotshape(bullEngulf, title="Bull Engulfing", style=shape.labelup, location=location.belowbar, text="🟢\nEngulf", size=size.tiny, color=color.new(color.teal, 0), textcolor=color.black)
plotshape(bearEngulf, title="Bear Engulfing", style=shape.labeldown, location=location.abovebar, text="🔴\nEngulf", size=size.tiny, color=color.new(color.red, 0), textcolor=color.white)
plotshape(morningStar, title="Morning Star", style=shape.labelup, location=location.belowbar, text="🌅\nMorning", size=size.tiny, color=color.new(color.aqua, 0), textcolor=color.black)
plotshape(eveningStar, title="Evening Star", style=shape.labeldown, location=location.abovebar, text="🌆\nEvening", size=size.tiny, color=color.new(color.purple, 0), textcolor=color.white)
// Optional: color bars when patterns occur
barcolor(hammer ? color.new(color.lime, 60) : na)
barcolor(shootingStar ? color.new(color.orange, 60) : na)
barcolor(bullEngulf ? color.new(color.teal, 70) : na)
barcolor(bearEngulf ? color.new(color.red, 70) : na)
barcolor(morningStar ? color.new(color.aqua, 70) : na)
barcolor(eveningStar ? color.new(color.purple, 70) : na)
// ===== Alerts =====
alertcondition(hammer, "Hammer", "Hammer detected")
alertcondition(shootingStar, "Shooting Star", "Shooting Star detected")
alertcondition(bullEngulf, "Bullish Engulfing","Bullish Engulfing detected")
alertcondition(bearEngulf, "Bearish Engulfing","Bearish Engulfing detected")
alertcondition(morningStar, "Morning Star", "Morning Star detected (3-candle)")
alertcondition(eveningStar, "Evening Star", "Evening Star detected (3-candle)")
// ===== Hints (toggle in the Style tab if labels feel too crowded) =====
// You can adjust thresholds to match your market/timeframe.
// Common tweaks: increase wickToBodyMin for stricter hammers/stars; increase minBodyFracRange to avoid doji;
// require stronger retrace in star patterns by raising starCloseRetracePct.
نص برمجي مفتوح المصدر
بروح TradingView الحقيقية، قام مبتكر هذا النص البرمجي بجعله مفتوح المصدر، بحيث يمكن للمتداولين مراجعة وظائفه والتحقق منها. شكرا للمؤلف! بينما يمكنك استخدامه مجانًا، تذكر أن إعادة نشر الكود يخضع لقواعد الموقع الخاصة بنا.
إخلاء المسؤولية
لا يُقصد بالمعلومات والمنشورات أن تكون، أو تشكل، أي نصيحة مالية أو استثمارية أو تجارية أو أنواع أخرى من النصائح أو التوصيات المقدمة أو المعتمدة من TradingView. اقرأ المزيد في شروط الاستخدام.
نص برمجي مفتوح المصدر
بروح TradingView الحقيقية، قام مبتكر هذا النص البرمجي بجعله مفتوح المصدر، بحيث يمكن للمتداولين مراجعة وظائفه والتحقق منها. شكرا للمؤلف! بينما يمكنك استخدامه مجانًا، تذكر أن إعادة نشر الكود يخضع لقواعد الموقع الخاصة بنا.
إخلاء المسؤولية
لا يُقصد بالمعلومات والمنشورات أن تكون، أو تشكل، أي نصيحة مالية أو استثمارية أو تجارية أو أنواع أخرى من النصائح أو التوصيات المقدمة أو المعتمدة من TradingView. اقرأ المزيد في شروط الاستخدام.