Concealing Baby Swallow Pattern¶
The Concealing Baby Swallow is a rare and reliable four-candle bullish reversal pattern that appears in downtrends. It consists of a series of black (bearish) candles followed by a final black candle that completely engulfs the previous candle, signaling an exhaustion of selling pressure. The pattern is unique as it uses bearish candles to signal a bullish reversal, similar to how a baby bird conceals itself before emerging.
Pattern Type¶
- Type: Reversal (Bullish)
- Candles Required: 4
- Trend Context: Appears at the end of downtrends
- Reliability: High (when complete)
- Frequency: Rare (appears less than 1% of the time)
Usage¶
require 'sqa/tai'
# Concealing Baby Swallow example
open = [95.0, 92.0, 90.0, 88.5, 91.0]
high = [95.5, 93.0, 90.2, 88.7, 91.5]
low = [91.5, 88.0, 87.0, 86.5, 86.0]
close = [92.0, 89.0, 87.5, 87.0, 86.5]
# Detect Concealing Baby Swallow pattern
pattern = SQA::TAI.cdl_concealbabyswall(open, high, low, close)
if pattern.last == 100
puts "Concealing Baby Swallow detected - Rare bullish reversal!"
end
Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
open |
Array |
Yes | Array of opening prices |
high |
Array |
Yes | Array of high prices |
low |
Array |
Yes | Array of low prices |
close |
Array |
Yes | Array of closing prices |
Returns¶
Returns an array of integers: - 0: No Concealing Baby Swallow pattern detected - +100: Bullish Concealing Baby Swallow pattern (bullish reversal signal)
Pattern Recognition Rules¶
Four-Candle Formation¶
- First Candle: Black Marubozu or long black candle
- Continues the downtrend
- Preferably a strong bearish candle
-
Shows strong selling pressure
-
Second Candle: Black candle that gaps down
- Opens below first candle's close
- Continues downward momentum
-
Should also be bearish
-
Third Candle: Small black candle
- May have shadows (not marubozu)
- Shows potential slowing of downtrend
-
Body is smaller than second candle
-
Fourth Candle: Black Marubozu
- Completely engulfs third candle (body and shadows)
- Opens above third candle's open
- Closes below third candle's low
- Signals exhaustion despite bearish appearance
Key Characteristics¶
- All four candles are black (bearish)
- Gap down between first and second candles
- Fourth candle engulfs third candle completely
- Pattern shows selling exhaustion through engulfing
- Despite bearish appearance, signals bullish reversal
- Volume typically decreases through pattern
- Final engulfing shows last push by sellers
Ideal Pattern Features¶
- Clear downtrend: Strong trend before pattern
- Definite gap: Clear gap between first and second candles
- Complete engulfment: Fourth candle fully engulfs third
- Marubozu candles: First and fourth are marubozu-type
- Volume decline: Volume decreases through pattern
- Oversold conditions: RSI below 30 strengthens signal
Visual Pattern¶
Concealing Baby Swallow:
[====] First: Black Marubozu in downtrend
| |
[====] Second: Black candle gaps down
| |
[==] Third: Small black candle
||
[====] Fourth: Black Marubozu engulfs third
| |
Pattern complete when fourth engulfs third
All candles black, but reversal signal
Interpretation¶
The Concealing Baby Swallow is paradoxical - it uses all bearish candles to signal a bullish reversal. The fourth candle's engulfing action, despite being black, shows that sellers have exhausted their strength. The pattern suggests that bears made one final push down (the engulfing move) but this represents the last of the selling pressure. The complete engulfment of the third candle, despite making new lows, indicates that the downtrend is ending and a reversal is imminent.
Reliability Factors¶
| Factor | Low Reliability | Medium Reliability | High Reliability |
|---|---|---|---|
| Downtrend | Weak or choppy | Clear downtrend | Extended downtrend |
| Gap | Small or absent | Modest gap | Clear gap |
| Engulfment | Partial | Complete body | Complete with shadows |
| Candle Quality | Mixed types | Mostly strong | Marubozu types |
| Volume | Increasing | Stable | Decreasing |
| RSI | Above 40 | 30-40 | Below 30 |
Note: Array elements should be ordered from oldest to newest (chronological order)
Example: Pattern Detection and Analysis¶
open, high, low, close = load_ohlc_data('AAPL')
pattern = SQA::TAI.cdl_concealbabyswall(open, high, low, close)
rsi = SQA::TAI.rsi(close, period: 14)
sma_50 = SQA::TAI.sma(close, period: 50)
if pattern.last == 100
puts "RARE: Concealing Baby Swallow detected!"
# Verify downtrend context
extended_downtrend = close[-5] < sma_50[-5] &&
close[-10] > close[-5]
puts "\nTrend Analysis:"
puts "Extended downtrend: #{extended_downtrend}"
puts "Current RSI: #{rsi.last.round(2)}"
# Verify engulfment
fourth_open = open.last
fourth_close = close.last
third_high = high[-2]
third_low = low[-2]
complete_engulfment = fourth_open > third_high &&
fourth_close < third_low
puts "\nEngulfment Analysis:"
puts "Fourth opens above third high: #{fourth_open > third_high}"
puts "Fourth closes below third low: #{fourth_close < third_low}"
puts "Complete engulfment: #{complete_engulfment}"
if extended_downtrend && complete_engulfment && rsi.last < 30
puts "\n*** TEXTBOOK CONCEALING BABY SWALLOW ***"
puts "High-probability reversal signal"
end
end
Example: Volume Confirmation¶
open, high, low, close, volume = load_ohlc_volume_data('TSLA')
pattern = SQA::TAI.cdl_concealbabyswall(open, high, low, close)
if pattern.last == 100
puts "Concealing Baby Swallow Pattern"
puts "=" * 60
# Analyze volume through pattern
vol1, vol2, vol3, vol4 = volume[-4], volume[-3], volume[-2], volume[-1]
avg_vol = volume[-20..-5].sum / 16.0
puts "\nVolume Analysis:"
puts "Candle 1: #{vol1.round(0)} (#{(vol1/avg_vol).round(2)}x avg)"
puts "Candle 2: #{vol2.round(0)} (#{(vol2/avg_vol).round(2)}x avg)"
puts "Candle 3: #{vol3.round(0)} (#{(vol3/avg_vol).round(2)}x avg)"
puts "Candle 4: #{vol4.round(0)} (#{(vol4/avg_vol).round(2)}x avg)"
# Ideal: declining volume through pattern
declining = vol1 > vol2 && vol2 > vol3 && vol3 > vol4
if declining
puts "\nIDEAL: Declining volume through pattern"
puts "Shows diminishing selling pressure"
puts "VERY STRONG reversal signal"
elsif vol4 < avg_vol
puts "\nGOOD: Low volume on final candle"
puts "Suggests selling exhaustion"
else
puts "\nCAUTION: High volume on final candle"
puts "May indicate continued selling"
end
end
Trading Strategies¶
Entry Rules¶
Conservative Entry (Recommended)¶
# Wait for bullish confirmation candle
if pattern[-2] == 100 # Pattern 2 candles ago
# Look for bullish confirmation
if close[-1] > open[-1] && close.last > close[-1]
puts "Concealing Baby Swallow CONFIRMED"
entry = close.last
pattern_low = [low[-4], low[-3], low[-2], low[-1]].min
puts "Enter LONG at #{entry.round(2)}"
puts "Pattern validated by bullish follow-through"
end
end
Aggressive Entry¶
# Enter on pattern completion
if pattern.last == 100
entry = close.last
pattern_low = [low[-4], low[-3], low[-2], low[-1]].min
puts "Concealing Baby Swallow completed"
puts "Entry: #{entry.round(2)}"
puts "Note: Rare pattern with high reliability"
end
Stop Loss Placement¶
if pattern.last == 100
# Stop below pattern low
pattern_low = [low[-4], low[-3], low[-2], low[-1]].min
stop = pattern_low * 0.99 # 1% buffer
entry = close.last
risk = entry - stop
risk_pct = (risk / entry * 100).round(2)
puts "\nStop Loss Analysis:"
puts "Pattern low: #{pattern_low.round(2)}"
puts "Stop loss: #{stop.round(2)}"
puts "Risk: $#{risk.round(2)} (#{risk_pct}%)"
# Alternative: tighter stop below fourth candle only
tight_stop = low.last * 0.995
tight_risk = entry - tight_stop
puts "\nTighter Stop (below 4th candle):"
puts "Stop: #{tight_stop.round(2)}"
puts "Risk: $#{tight_risk.round(2)} (#{(tight_risk/entry*100).round(2)}%)"
end
Profit Targets¶
if pattern.last == 100
entry = close.last
pattern_low = [low[-4], low[-3], low[-2], low[-1]].min
stop = pattern_low * 0.99
risk = entry - stop
# Risk-based targets
target_1 = entry + (risk * 2)
target_2 = entry + (risk * 3)
target_3 = entry + (risk * 4)
puts "\nProfit Targets:"
puts "T1 (2R): #{target_1.round(2)}"
puts "T2 (3R): #{target_2.round(2)}"
puts "T3 (4R): #{target_3.round(2)}"
# Technical target: first candle high
resistance = high[-4]
puts "\nTechnical Target:"
puts "First candle high: #{resistance.round(2)}"
# Move stop to breakeven after T1
puts "\nTrailing Stop Strategy:"
puts "After T1: Move stop to breakeven"
puts "After T2: Move stop to T1"
puts "After T3: Trail with 2x ATR"
end
Example: Complete Trading System¶
open, high, low, close, volume = load_ohlc_volume_data('NVDA')
pattern = SQA::TAI.cdl_concealbabyswall(open, high, low, close)
rsi = SQA::TAI.rsi(close, period: 14)
sma_20 = SQA::TAI.sma(close, period: 20)
sma_50 = SQA::TAI.sma(close, period: 50)
if pattern.last == 100
puts "Concealing Baby Swallow Pattern Analysis"
puts "=" * 60
puts "(RARE PATTERN - High significance)"
# 1. Trend context
downtrend = close[-5] < sma_20[-5] && sma_20[-5] < sma_50[-5]
extended = close[-10] > close[-5]
context_score = downtrend && extended
# 2. Engulfment quality
fourth_open = open.last
fourth_close = close.last
third_high = high[-2]
third_low = low[-2]
complete_engulf = fourth_open > third_high && fourth_close < third_low
# 3. Gap present
first_close = close[-4]
second_open = open[-3]
gap_down = second_open < first_close
# 4. Volume declining
volumes = [volume[-4], volume[-3], volume[-2], volume[-1]]
declining_volume = volumes.each_cons(2).all? { |a, b| a > b }
# 5. Marubozu characteristics
first_body = (first_close - open[-4]).abs
first_range = high[-4] - low[-4]
first_marubozu = first_body / first_range > 0.8
fourth_body = (fourth_close - open.last).abs
fourth_range = high.last - low.last
fourth_marubozu = fourth_body / fourth_range > 0.8
strong_candles = first_marubozu && fourth_marubozu
# 6. RSI oversold
oversold = rsi[-5] < 30
# Calculate quality score
score = 0
score += 3 if context_score # Critical
score += 3 if complete_engulf # Critical
score += 2 if gap_down # Very important
score += 2 if declining_volume # Very important
score += 2 if strong_candles # Important
score += 2 if oversold # Important
puts "\nQuality Checks:"
puts "1. Downtrend context: #{context_score} #{context_score ? '✓✓✓' : '✗'}"
puts "2. Complete engulfment: #{complete_engulf} #{complete_engulf ? '✓✓✓' : '✗'}"
puts "3. Gap down present: #{gap_down} #{gap_down ? '✓✓' : '✗'}"
puts "4. Declining volume: #{declining_volume} #{declining_volume ? '✓✓' : '✗'}"
puts "5. Strong marubozu candles: #{strong_candles} #{strong_candles ? '✓✓' : '✗'}"
puts "6. RSI oversold: #{oversold} #{oversold ? '✓✓' : '✗'}"
puts "\nTotal Score: #{score}/14"
if score >= 10
# Calculate trade
entry = close.last
pattern_low = [low[-4], low[-3], low[-2], low[-1]].min
stop = pattern_low * 0.99
risk = entry - stop
target = entry + (risk * 3)
reward = target - entry
rr = (reward / risk).round(1)
puts "\n*** EXCEPTIONAL SETUP ***"
puts "-" * 60
puts "Entry: $#{entry.round(2)}"
puts "Stop: $#{stop.round(2)}"
puts "Target: $#{target.round(2)}"
puts "Risk: $#{risk.round(2)} (#{(risk/entry*100).round(2)}%)"
puts "Reward: $#{reward.round(2)} (#{(reward/entry*100).round(2)}%)"
puts "R:R: 1:#{rr}"
# Position sizing
account = 100000
risk_amount = account * 0.02 # 2% risk
shares = (risk_amount / risk).floor
puts "\nPosition Sizing (2% risk):"
puts "Shares: #{shares}"
puts "Position: $#{(shares * entry).round(2)}"
puts "Risk: $#{risk_amount.round(2)}"
puts "Potential profit: $#{(shares * reward).round(2)}"
elsif score >= 7
puts "\nGOOD SETUP - Decent quality"
puts "Rare pattern worth considering"
else
puts "\nWEAK SETUP - Missing critical elements"
puts "Pattern incomplete or context wrong"
end
end
Pattern Statistics¶
Frequency¶
- Occurrence: Rare (less than 1% of the time)
- Best Timeframes: Daily charts (most reliable)
- Markets: All markets, most effective in trending stocks
Success Rate¶
- Perfect pattern: 78-85% success rate
- Good pattern: 68-78% success rate
- With confirmation: 80-88% success rate
- At support: 82-90% success rate
Average Move¶
- Initial reversal: 8-15% from pattern
- Major reversals: 20-40% move
- Time to target: 10-25 candles
- Follow-through: 80% show bullish continuation
Best Practices¶
Do's¶
- Verify all four candles are black
- Confirm clear gap down between first and second
- Ensure fourth candle completely engulfs third
- Check for extended downtrend before pattern
- Look for declining volume through pattern
- Verify RSI oversold conditions
- Wait for bullish confirmation if uncertain
- Use proper stop below pattern low
- Take advantage of rarity - high reliability
- Document the pattern for learning
Don'ts¶
- Don't trade without clear downtrend
- Don't accept partial engulfment
- Don't ignore volume patterns
- Don't skip gap verification
- Don't use tight stops initially
- Don't confuse with other engulfing patterns
- Don't ignore the rarity signal
- Don't overtrade - wait for perfect setup
- Don't chase after confirmation candles
- Don't skip risk management
Common Mistakes¶
- Misidentifying pattern: All four candles must be black
- Accepting partial engulfment: Fourth must fully engulf third
- Ignoring gap: Gap between first and second is important
- Wrong trend context: Needs clear downtrend
- No volume analysis: Declining volume strengthens pattern
- Poor stop placement: Must protect pattern structure
- Rushing entry: Confirmation adds reliability
Related Patterns¶
Similar Patterns¶
- Three Black Crows - Bearish continuation
- Engulfing Pattern - Two-candle reversal
- Harami - Opposite of engulfing
Component Patterns¶
Pattern Variations¶
Perfect Concealing Baby Swallow¶
- Extended downtrend (10+ candles)
- Clear gap down between first and second
- First and fourth are perfect marubozu
- Complete engulfment with shadows
- Steadily declining volume
- RSI below 30
- Success Rate: 82-90%
Good Concealing Baby Swallow¶
- Clear downtrend present
- Gap visible
- Strong first and fourth candles
- Complete body engulfment
- Some volume decline
- Success Rate: 72-82%
Weak Concealing Baby Swallow¶
- Unclear trend
- Small or no gap
- Weak candle bodies
- Partial engulfment
- Rising volume
- Success Rate: 60-70%
Advanced Concepts¶
Pattern Quality Scorer¶
def score_concealing_baby_swallow(open, high, low, close, volume)
return 0 if pattern.last == 0
score = 0
# Engulfment quality (0-4 points)
fourth_open = open.last
fourth_close = close.last
third_high = high[-2]
third_low = low[-2]
body_engulf = fourth_open > open[-2] && fourth_close < close[-2]
shadow_engulf = fourth_open > third_high && fourth_close < third_low
score += 2 if body_engulf
score += 2 if shadow_engulf
# Gap quality (0-2 points)
gap_size = close[-4] - open[-3]
gap_pct = gap_size / close[-4] * 100
score += 2 if gap_pct > 1.0
score += 1 if gap_pct > 0.5
# Volume decline (0-2 points)
volumes = [volume[-4], volume[-3], volume[-2], volume[-1]]
declining = volumes.each_cons(2).all? { |a, b| a > b }
mostly_declining = volumes[-3..-1].each_cons(2).all? { |a, b| a > b }
score += 2 if declining
score += 1 if mostly_declining
# Marubozu quality (0-2 points)
first_body = (close[-4] - open[-4]).abs
first_range = high[-4] - low[-4]
fourth_body = (close.last - open.last).abs
fourth_range = high.last - low.last
first_strong = first_body / first_range > 0.8
fourth_strong = fourth_body / fourth_range > 0.8
score += 1 if first_strong
score += 1 if fourth_strong
score # 0-10
end
Key Takeaways¶
- Extremely rare - distinctive four-candle pattern
- All black candles - paradoxically bullish
- Engulfing action - fourth engulfs third completely
- Selling exhaustion - despite new lows, reversal imminent
- Gap important - gap down strengthens pattern
- Volume decline - shows diminishing selling pressure
- High reliability - when conditions are right
- Needs confirmation - wait for bullish follow-through
- Proper stops - below pattern low
- Rare opportunity - don't ignore when it appears
See Also¶
- Engulfing Pattern - Related engulfing concept
- Three Black Crows - Opposite bearish pattern
- Marubozu - Component candle type
- Abandoned Baby - Another rare reversal
- Pattern Recognition Overview
- Back to Indicators