Skip to content

Aroon Indicator (AROON)

The Aroon Indicator is a technical analysis tool that identifies trend changes, measures trend strength, and detects consolidation periods by calculating the time elapsed since the highest high and lowest low within a given period. Developed by Tushar Chande in 1995, the name "Aroon" is derived from the Sanskrit word meaning "dawn's early light," reflecting its purpose of signaling the beginning of new trends.

The indicator consists of two lines: - Aroon Up: Measures time since the period's highest high (indicates uptrend strength) - Aroon Down: Measures time since the period's lowest low (indicates downtrend strength)

Both values oscillate between 0 and 100, providing clear signals about trend direction and strength.

Usage

require 'sqa/tai'

highs = [82.15, 81.89, 83.03, 83.30, 83.85,
         83.90, 83.33, 84.30, 84.84, 85.00,
         85.90, 86.58, 86.98, 88.00, 87.87]

lows = [81.29, 80.64, 81.31, 82.65, 83.07,
        83.11, 82.49, 82.30, 84.15, 84.50,
        85.39, 85.76, 85.87, 87.17, 87.01]

# Calculate 14-period Aroon (default)
aroon_down, aroon_up = SQA::TAI.aroon(highs, lows, period: 14)

puts "Aroon Up: #{aroon_up.last.round(2)}"
puts "Aroon Down: #{aroon_down.last.round(2)}"

Parameters

Parameter Type Required Default Description
high Array Yes - Array of high price values
low Array Yes - Array of low price values
period Integer No 25 Lookback period for calculation

Returns

Returns a two-element array: [aroon_down, aroon_up]

Each element is an array of values ranging from 0 to 100: - Aroon Up: 100 means new high just occurred, 0 means no high in entire period - Aroon Down: 100 means new low just occurred, 0 means no low in entire period

The first period - 1 values will be nil.

Calculation

Aroon Up = ((Period - Periods Since Period High) / Period) × 100
Aroon Down = ((Period - Periods Since Period Low) / Period) × 100

For a 25-period Aroon: - If highest high occurred 3 periods ago: Aroon Up = ((25 - 3) / 25) × 100 = 88% - If lowest low occurred 20 periods ago: Aroon Down = ((25 - 20) / 25) × 100 = 20%

Interpretation

Condition Aroon Up Aroon Down Interpretation
Strong Uptrend 70-100 0-30 Recent highs, strong buying pressure
Strong Downtrend 0-30 70-100 Recent lows, strong selling pressure
Consolidation 0-50 0-50 No clear direction, sideways movement
Bullish Crossover Crosses above Crosses below Aroon Up crosses above Aroon Down - uptrend emerging
Bearish Crossover Crosses below Crosses above Aroon Down crosses above Aroon Up - downtrend emerging
Parallel Movement Both high - Strong trending market (direction depends on which is higher)
Parallel Low Both low - Consolidation, potential breakout coming

Note: Array elements should be ordered from oldest to newest (chronological order)

Trend Strength Indicators

  • Aroon Up near 100: Stock is making new highs regularly - strong uptrend
  • Aroon Down near 100: Stock is making new lows regularly - strong downtrend
  • Both Aroon lines above 70: High volatility, strong trend (whichever is higher)
  • Both Aroon lines below 30: Weak trend, consolidation phase
  • Aroon Up = 100, Aroon Down = 0: Perfect uptrend condition
  • Aroon Down = 100, Aroon Up = 0: Perfect downtrend condition

Example: Basic Aroon Trend Identification

highs = load_historical_highs('AAPL')
lows = load_historical_lows('AAPL')

aroon_down, aroon_up = SQA::TAI.aroon(highs, lows, period: 25)

current_up = aroon_up.last
current_down = aroon_down.last

puts <<~ANALYSIS
  Aroon Indicator Analysis
  ========================
  Aroon Up: #{current_up.round(2)}
  Aroon Down: #{current_down.round(2)}

  Trend Assessment:
ANALYSIS

if current_up > 70 && current_down < 30
  puts "Strong UPTREND - Aroon Up dominant"
elsif current_down > 70 && current_up < 30
  puts "Strong DOWNTREND - Aroon Down dominant"
elsif current_up < 50 && current_down < 50
  puts "CONSOLIDATION - Both indicators weak"
elsif (current_up - current_down).abs < 20
  puts "TRANSITIONAL - No clear trend established"
else
  puts "MODERATE TREND - Monitor for strengthening/weakening"
end

Example: Aroon Crossover Strategy

highs = load_historical_highs('TSLA')
lows = load_historical_lows('TSLA')

aroon_down, aroon_up = SQA::TAI.aroon(highs, lows, period: 25)

# Detect crossovers
signals = []

aroon_up.each_with_index do |up, i|
  next if i < 1 || up.nil?

  prev_up = aroon_up[i - 1]
  down = aroon_down[i]
  prev_down = aroon_down[i - 1]

  next if prev_up.nil? || down.nil? || prev_down.nil?

  # Bullish crossover: Aroon Up crosses above Aroon Down
  if prev_up < prev_down && up > down
    signals << {
      index: i,
      type: 'BUY',
      aroon_up: up.round(2),
      aroon_down: down.round(2),
      strength: up - down
    }
  # Bearish crossover: Aroon Down crosses above Aroon Up
  elsif prev_down < prev_up && down > up
    signals << {
      index: i,
      type: 'SELL',
      aroon_up: up.round(2),
      aroon_down: down.round(2),
      strength: down - up
    }
  end
end

# Display recent signals
puts "Recent Aroon Crossover Signals:"
signals.last(5).each do |signal|
  puts "#{signal[:type]} signal at index #{signal[:index]}"
  puts "  Aroon Up: #{signal[:aroon_up]}, Aroon Down: #{signal[:aroon_down]}"
  puts "  Signal Strength: #{signal[:strength].round(2)}"
end

Example: Consolidation Breakout Detection

highs = load_historical_highs('NVDA')
lows = load_historical_lows('NVDA')

aroon_down, aroon_up = SQA::TAI.aroon(highs, lows, period: 25)

# Look for consolidation followed by breakout
consolidation_threshold = 30
breakout_threshold = 70

aroon_up.each_with_index do |up, i|
  next if i < 5 || up.nil?

  down = aroon_down[i]
  next if down.nil?

  # Check if we were in consolidation for the past 3-5 periods
  was_consolidating = (i-4..i-1).all? do |j|
    aroon_up[j] && aroon_down[j] &&
    aroon_up[j] < consolidation_threshold &&
    aroon_down[j] < consolidation_threshold
  end

  if was_consolidating
    # Check for breakout
    if up > breakout_threshold && down < consolidation_threshold
      puts "BULLISH BREAKOUT detected at index #{i}"
      puts "  Aroon moved from consolidation to strong uptrend"
      puts "  Current: Up=#{up.round(2)}, Down=#{down.round(2)}"
    elsif down > breakout_threshold && up < consolidation_threshold
      puts "BEARISH BREAKDOWN detected at index #{i}"
      puts "  Aroon moved from consolidation to strong downtrend"
      puts "  Current: Up=#{up.round(2)}, Down=#{down.round(2)}"
    end
  end
end

Example: Aroon Trend Strength Filter

highs = load_historical_highs('MSFT')
lows = load_historical_lows('MSFT')
closes = load_historical_closes('MSFT')

aroon_down, aroon_up = SQA::TAI.aroon(highs, lows, period: 25)

# Calculate trend strength score
current_up = aroon_up.last
current_down = aroon_down.last

# Trend strength scoring (0-100)
if current_up > current_down
  trend_strength = current_up - current_down
  trend_direction = "BULLISH"
else
  trend_strength = current_down - current_up
  trend_direction = "BEARISH"
end

puts <<~TREND_REPORT
  Trend Strength Analysis
  =======================
  Direction: #{trend_direction}
  Strength Score: #{trend_strength.round(2)}/100

  Aroon Up: #{current_up.round(2)}
  Aroon Down: #{current_down.round(2)}

  Assessment:
TREND_REPORT

case trend_strength
when 80..100
  puts "VERY STRONG trend - High conviction trades"
when 60..79
  puts "STRONG trend - Favorable conditions"
when 40..59
  puts "MODERATE trend - Proceed with caution"
when 20..39
  puts "WEAK trend - Consider waiting for clarity"
when 0..19
  puts "NO CLEAR TREND - Avoid trend-following strategies"
end

Example: Parallel Aroon Movement Analysis

highs = load_historical_highs('AMD')
lows = load_historical_lows('AMD')

aroon_down, aroon_up = SQA::TAI.aroon(highs, lows, period: 25)

# Analyze parallel movement patterns
aroon_up.each_with_index do |up, i|
  next if i < 3 || up.nil?

  down = aroon_down[i]
  next if down.nil?

  # Check for parallel movement in last 3 periods
  parallel_high = (i-2..i).all? { |j| aroon_up[j] > 70 && aroon_down[j] > 70 }
  parallel_low = (i-2..i).all? { |j| aroon_up[j] < 30 && aroon_down[j] < 30 }

  if parallel_high
    if up > down
      puts "STRONG UPTREND with high volatility at index #{i}"
      puts "  Both Aroon lines elevated - trend is well established"
    else
      puts "STRONG DOWNTREND with high volatility at index #{i}"
      puts "  Both Aroon lines elevated - trend is well established"
    end
  elsif parallel_low
    puts "CONSOLIDATION ZONE detected at index #{i}"
    puts "  Both Aroon lines weak - prepare for potential breakout"
    puts "  Current: Up=#{up.round(2)}, Down=#{down.round(2)}"
  end
end

Advanced Techniques

1. Multi-Timeframe Aroon Analysis

Compare Aroon readings across different timeframes (daily, weekly) to confirm trend strength and direction.

2. Aroon with Volume Confirmation

Combine Aroon signals with volume analysis - strong trends should show increasing volume on breakouts.

3. Aroon Oscillator

Calculate Aroon Up - Aroon Down to create a single oscillator ranging from -100 to +100: - Positive values indicate uptrend - Negative values indicate downtrend - Zero line crossovers signal trend changes

4. Dynamic Period Adjustment

Use shorter periods (14) for volatile markets and longer periods (50) for smoother trend identification.

5. Aroon Extremes

Pay special attention when either line reaches 100 - indicates a very recent high/low and strong momentum.

Example: Comprehensive Aroon Trading System

highs = load_historical_highs('GOOGL')
lows = load_historical_lows('GOOGL')
closes = load_historical_closes('GOOGL')

aroon_down, aroon_up = SQA::TAI.aroon(highs, lows, period: 25)
sma = SQA::TAI.sma(closes, period: 50)

current_up = aroon_up.last
current_down = aroon_down.last
current_price = closes.last
current_sma = sma.last

puts <<~SYSTEM
  Comprehensive Aroon Trading System
  ==================================
  Price: #{current_price.round(2)}
  50-SMA: #{current_sma.round(2)}
  Aroon Up: #{current_up.round(2)}
  Aroon Down: #{current_down.round(2)}

  Trading Decision:
SYSTEM

# Long entry conditions
if current_price > current_sma && current_up > 70 && current_down < 30
  puts "STRONG BUY - All conditions aligned"
  puts "  - Price above 50-SMA (uptrend confirmed)"
  puts "  - Aroon Up > 70 (recent highs)"
  puts "  - Aroon Down < 30 (no recent lows)"

# Short entry conditions
elsif current_price < current_sma && current_down > 70 && current_up < 30
  puts "STRONG SELL - All conditions aligned"
  puts "  - Price below 50-SMA (downtrend confirmed)"
  puts "  - Aroon Down > 70 (recent lows)"
  puts "  - Aroon Up < 30 (no recent highs)"

# Consolidation exit
elsif current_up < 30 && current_down < 30
  puts "EXIT positions - Consolidation detected"
  puts "  - Both Aroon lines weak"
  puts "  - Trend momentum fading"

# Trend reversal warning
elsif current_up > 50 && current_down > 50
  puts "CAUTION - High volatility period"
  puts "  - Both Aroon lines elevated"
  puts "  - Wait for clear direction"
else
  puts "HOLD - No clear signal"
end

Common Settings

Period Use Case Characteristics
14 Short-term trading More sensitive, frequent signals
25 Standard setting Balanced sensitivity and reliability
50 Long-term trends Smoother, fewer false signals
70 Position trading Very stable, major trends only

Advantages and Limitations

Advantages

  • Simple to interpret (0-100 scale)
  • Identifies both trend direction and strength
  • Works well in trending markets
  • Clear crossover signals
  • Effective at detecting consolidation periods

Limitations

  • Can generate false signals in choppy markets
  • Lagging indicator - signals come after trend starts
  • Less effective in ranging markets
  • Requires confirmation from other indicators
  • May miss the very beginning of trends
  • Aroon Oscillator - Single-line version of Aroon
  • ADX - Trend strength measurement
  • MACD - Momentum and trend direction
  • RSI - Overbought/oversold conditions
  • DMI - Directional movement

See Also

  • Trend Trading Strategies