Two Crows Pattern¶
The Two Crows is a rare three-candlestick bearish reversal pattern that appears at the top of an uptrend. It consists of a long bullish candle followed by two bearish candles that gap up but fail to hold their gains, suggesting the uptrend is losing momentum.
Pattern Type¶
- Type: Bearish Reversal
- Candles Required: 3
- Trend Context: Appears after uptrend
- Reliability: Medium to High (when confirmed)
- Frequency: Rare
Usage¶
require 'sqa/tai'
open = [100.0, 102.0, 104.0, 103.5, 103.0]
high = [102.5, 105.0, 105.5, 105.0, 104.5]
low = [99.5, 101.5, 102.5, 102.0, 101.5]
close = [102.0, 104.5, 103.0, 102.5, 101.0]
# Detect Two Crows pattern
pattern = SQA::TAI.cdl_2crows(open, high, low, close)
if pattern.last == -100
puts "Two Crows detected - Bearish reversal signal!"
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 Two Crows pattern detected - -100: Two Crows pattern detected (bearish reversal signal)
Note: This pattern only returns bearish signals. There is no bullish equivalent.
Pattern Recognition Rules¶
Three Candle Structure¶
- First Candle: Long bullish (white) candle in an established uptrend
- Second Candle: Bearish (black) candle that gaps up above first candle's close but closes lower
- Third Candle: Another bearish candle that opens within second candle's body and closes lower, ideally near first candle's close
Key Characteristics¶
- First candle shows strong bullish momentum
- Second candle gaps up (bullish gap) but closes bearish
- Third candle continues lower, confirming weakness
- Pattern looks like two crows (bearish candles) sitting on a branch (first bullish candle)
- The failure to hold the gap suggests exhaustion
Visual Pattern¶
After uptrend:
[==] Second candle (gaps up, closes lower)
[===] Third candle (continues down)
[=======] First candle (long bullish)
| |
Interpretation¶
The Two Crows pattern signals potential trend reversal through:
- Gap Failure: Bulls gap price higher but can't maintain gains
- Momentum Shift: Two consecutive bearish closes after gap
- Exhaustion Signal: Buyers losing control at trend top
- Crow Formation: Pattern name comes from visual of two crows (bearish candles) perched on a tree
Reliability Factors¶
| Factor | Low Reliability | Medium Reliability | High Reliability |
|---|---|---|---|
| Trend Strength | Weak uptrend | Clear uptrend | Strong uptrend |
| Volume | Decreasing | Normal | Increasing on black candles |
| Gap Size | Small gap | Moderate gap | Large gap that fails |
| Location | Mid-chart | Near resistance | At major resistance |
| Third Candle | Shallow close | Moderate close | Closes near first candle |
Note: Array elements should be ordered from oldest to newest (chronological order)
Example: Two Crows in Uptrend Context¶
open, high, low, close = load_ohlc_data('AAPL')
pattern = SQA::TAI.cdl_2crows(open, high, low, close)
sma_50 = SQA::TAI.sma(close, period: 50)
sma_200 = SQA::TAI.sma(close, period: 200)
if pattern.last == -100
# Verify uptrend context
in_uptrend = close[-4] > sma_50[-4] && sma_50[-4] > sma_200[-4]
if in_uptrend
puts "Two Crows pattern in strong uptrend!"
puts "High probability bearish reversal"
puts "Current price: #{close.last.round(2)}"
puts "SMA(50): #{sma_50.last.round(2)}"
# Calculate gap
gap_size = ((open[-2] - close[-3]) / close[-3] * 100).round(2)
puts "Gap up size: #{gap_size}%"
# Check how far third candle retraced
retrace = ((close[-3] - close.last) / close[-3] * 100).round(2)
puts "Retracement: #{retrace}%"
else
puts "Two Crows but not in clear uptrend"
puts "Lower reliability - verify context"
end
end
Example: Two Crows with Volume Analysis¶
open, high, low, close, volume = load_ohlc_volume_data('TSLA')
pattern = SQA::TAI.cdl_2crows(open, high, low, close)
if pattern.last == -100
# Volume analysis
vol_first = volume[-3] # Bullish candle
vol_second = volume[-2] # First crow
vol_third = volume[-1] # Second crow
avg_volume = volume[-20..-1].sum / 20.0
puts "Two Crows Volume Analysis:"
puts "First candle (bullish): #{vol_first.round(0)}"
puts "Second candle (crow 1): #{vol_second.round(0)}"
puts "Third candle (crow 2): #{vol_third.round(0)}"
puts "Average volume: #{avg_volume.round(0)}"
# Ideal: Increasing volume on bearish candles
if vol_second > vol_first && vol_third > vol_second
puts "\nSTRONG PATTERN: Increasing volume on decline"
puts "High conviction selling"
elsif vol_second > avg_volume || vol_third > avg_volume
puts "\nGOOD PATTERN: Above average volume on crows"
else
puts "\nWEAK PATTERN: Low volume"
puts "Less reliable - wait for confirmation"
end
end
Example: Two Crows at Resistance¶
open, high, low, close = load_ohlc_data('MSFT')
pattern = SQA::TAI.cdl_2crows(open, high, low, close)
# Find resistance
resistance = close[-120..-1].max
if pattern.last == -100
distance_from_resistance = ((high[-2] - resistance) / resistance * 100).abs
if distance_from_resistance < 2 # Within 2% of resistance
puts "Two Crows AT MAJOR RESISTANCE!"
puts "Resistance level: #{resistance.round(2)}"
puts "Pattern high: #{high[-2].round(2)}"
puts "Current close: #{close.last.round(2)}"
puts "\nFailed breakout - sellers defending resistance"
puts "HIGH PROBABILITY reversal setup"
end
end
Example: Two Crows with RSI Confirmation¶
open, high, low, close = load_ohlc_data('NVDA')
pattern = SQA::TAI.cdl_2crows(open, high, low, close)
rsi = SQA::TAI.rsi(close, period: 14)
if pattern.last == -100
rsi_at_pattern = rsi[-3] # RSI at first candle
rsi_current = rsi.last
puts "Two Crows Pattern with RSI:"
puts "RSI at pattern start: #{rsi_at_pattern.round(2)}"
puts "Current RSI: #{rsi_current.round(2)}"
if rsi_at_pattern > 70
puts "\nOVERBOUGHT RSI + Two Crows"
puts "Multiple bearish signals - Strong SELL setup"
elsif rsi_at_pattern > 60
puts "\nElevated RSI + Two Crows"
puts "Good reversal confirmation"
else
puts "\nTwo Crows without overbought RSI"
puts "Moderate signal strength"
end
end
Trading Strategies¶
Entry Rules¶
Conservative Entry (Recommended)¶
# Wait for confirmation candle after pattern
if pattern[-2] == -100 # Pattern two candles ago
if close[-1] < close[-2] # Confirmation: another bearish close
puts "Two Crows CONFIRMED - Enter SHORT"
entry = close.last
puts "Entry: #{entry.round(2)}"
end
end
Aggressive Entry¶
# Enter on pattern completion (third candle close)
if pattern.last == -100
entry = close.last
puts "Two Crows completed - Enter SHORT at #{entry.round(2)}"
puts "Higher risk - no confirmation"
end
Stop Loss Placement¶
if pattern.last == -100
# Stop above the gap high (second candle's high)
stop = high[-2]
stop_with_buffer = stop * 1.01 # 1% buffer
puts "Stop loss: #{stop_with_buffer.round(2)}"
puts "Rationale: Above gap high - pattern invalidated if exceeded"
# Alternative: Stop above first candle high
alt_stop = high[-3] * 1.01
puts "Alternative stop (wider): #{alt_stop.round(2)}"
end
Profit Targets¶
if pattern.last == -100
entry = close.last
stop = high[-2] * 1.01
risk = stop - entry
# Multiple targets
target_1 = entry - (risk * 1.5) # 1.5:1 R:R
target_2 = entry - (risk * 2.5) # 2.5:1 R:R
target_3 = entry - (risk * 4.0) # 4:1 R:R
puts "Profit Targets:"
puts "T1 (1.5:1): #{target_1.round(2)}"
puts "T2 (2.5:1): #{target_2.round(2)}"
puts "T3 (4:1): #{target_3.round(2)}"
# Or target previous support
support = close[-60..-1].min
puts "Support target: #{support.round(2)}"
end
Example: Complete Trading System¶
open, high, low, close, volume = load_ohlc_volume_data('GOOGL')
pattern = SQA::TAI.cdl_2crows(open, high, low, close)
rsi = SQA::TAI.rsi(close, period: 14)
sma_50 = SQA::TAI.sma(close, period: 50)
sma_200 = SQA::TAI.sma(close, period: 200)
if pattern.last == -100
puts "Two Crows Pattern Detected"
puts "=" * 50
# 1. Trend verification
in_uptrend = close[-4] > sma_50[-4] && sma_50[-4] > sma_200[-4]
# 2. RSI check
rsi_overbought = rsi[-3] > 60
# 3. Volume analysis
avg_vol = volume[-20..-1].sum / 20.0
vol_increasing = volume[-2] > volume[-3] && volume[-1] > avg_vol
# 4. Resistance check
resistance = close[-120..-1].max
near_resistance = (high[-2] - resistance).abs < resistance * 0.03
# 5. Gap analysis
gap_size = ((open[-2] - close[-3]) / close[-3] * 100)
significant_gap = gap_size > 1.0
# 6. Retracement check
retraced_well = close.last < (close[-3] + (high[-2] - close[-3]) * 0.5)
# Calculate score
score = 0
score += 1 if in_uptrend
score += 1 if rsi_overbought
score += 1 if vol_increasing
score += 1 if near_resistance
score += 1 if significant_gap
score += 1 if retraced_well
puts "Setup Analysis:"
puts "In uptrend: #{in_uptrend} (#{score >= 1 ? '✓' : '✗'})"
puts "RSI overbought: #{rsi_overbought} (RSI: #{rsi[-3].round(2)})"
puts "Volume increasing: #{vol_increasing}"
puts "Near resistance: #{near_resistance}"
puts "Significant gap: #{significant_gap} (#{gap_size.round(2)}%)"
puts "Good retracement: #{retraced_well}"
puts "\nSetup Score: #{score}/6"
if score >= 4
entry = close.last
stop = high[-2] * 1.01
risk = stop - entry
target = entry - (risk * 3)
puts "\n*** HIGH PROBABILITY SHORT SETUP ***"
puts "Entry: #{entry.round(2)}"
puts "Stop: #{stop.round(2)}"
puts "Target: #{target.round(2)}"
puts "Risk: $#{risk.round(2)}"
puts "Reward: $#{(entry - target).round(2)}"
puts "R:R Ratio: 1:3"
# Position sizing
account_size = 100000
risk_percent = 0.01 # 1% account risk
risk_amount = account_size * risk_percent
shares = (risk_amount / risk).floor
puts "\nPosition Size: #{shares} shares"
puts "Total risk: $#{risk_amount.round(2)} (1% of account)"
elsif score >= 3
puts "\nDECENT SETUP - Consider reduced position size"
else
puts "\nLOW PROBABILITY - Skip this trade"
end
end
Pattern Statistics¶
Frequency¶
- Occurrence: Rare (appears less than 1% of the time)
- Best Timeframes: Daily, Weekly (more reliable)
- Markets: Works on all markets (stocks, forex, crypto)
Success Rate¶
- With confirmation: 65-75% success rate
- Without confirmation: 45-55% success rate
- At resistance: 70-80% success rate
- With volume: 68-78% success rate
Average Move¶
- Typical decline: 5-15% from pattern high
- Major reversals: 20-40% decline possible
- Time to target: 2-10 candles (varies by timeframe)
Best Practices¶
Do's¶
- Wait for established uptrend before taking signal
- Verify gap is significant (at least 1-2%)
- Look for increasing volume on bearish candles
- Trade near resistance levels for best results
- Wait for confirmation candle in choppy markets
- Use with overbought RSI for stronger signal
- Calculate risk/reward before entry
Don'ts¶
- Don't trade pattern in downtrend or sideways market
- Don't ignore volume (low volume = low reliability)
- Don't enter without proper stop loss
- Don't chase if pattern is too far from resistance
- Don't trade if gap is tiny (< 0.5%)
- Don't ignore broader market context
- Don't risk more than 1-2% of account
Common Mistakes¶
- Trading without uptrend: Pattern requires uptrend context
- Ignoring the gap: Gap failure is crucial to pattern
- Poor stop placement: Must be above gap high
- No confirmation: Better results with fourth candle confirmation
- Confusing with Three Black Crows: Different patterns
Related Patterns¶
Similar Bearish Patterns¶
- Three Black Crows - Three consecutive bearish candles
- Evening Star - Three-candle reversal with star
- Dark Cloud Cover - Two-candle bearish reversal
- Advance Block - Three-candle topping pattern
Opposite Pattern¶
- Bullish Variant: No direct bullish equivalent
- Consider: Three White Soldiers for bullish reversal
Pattern Variations¶
Strong Two Crows¶
- Large gap (2%+)
- Third candle closes below first candle's midpoint
- High volume on both crows
- Appears at major resistance
Weak Two Crows¶
- Small gap (< 1%)
- Third candle doesn't retrace much
- Low or declining volume
- No clear resistance level
Key Takeaways¶
- Rare but reliable when all conditions align
- Gap failure is the critical element
- Uptrend context is mandatory for validity
- Confirmation helps reduce false signals
- Volume matters - increases reliability significantly
- Resistance confluence improves success rate
- Risk management is essential - use stops