Skip to content
Open RaamTrade

ElderRayPower: Elder-Ray Power

Alexander Elder’s Elder-Ray: how far the bar’s high sits above a trend EMA (what buyers achieved) and how far the low sits below it (what sellers achieved), plus their sum. Elder’s classic reading is bull power positive and rising while bear power is negative but rising: buyers advancing, sellers losing ground.

Signature

ElderRayPower(period, on=<source>)
Argument Type Required Notes
period int Param or literal Yes EMA length. Default 13, bounds 1–400.
on= symbol No Source symbol. Defaults to the trade symbol. Reads high, low, close.

Formula

$$ \text{bull} = H - \text{EMA}(C, n), \quad \text{bear} = L - \text{EMA}(C, n), \quad \text{power} = \text{bull} + \text{bear} $$

Warmup

The EMA seeds from the first close and converges over roughly 3n bars.

Reading the value

er.bull
er.bear
er.power

Multi-value: cannot be chained onto or crossed.

Example

class ElderRay(Strategy):
"""Elder's setup: buy when bear power is negative but improving in an uptrend."""
trade = Symbol()
sizing = FixedCapital()
def execute(self):
er = ElderRayPower(13, on=self.trade)
sma = SMA(50, on=self.trade)
if self.trade.close > sma.value and er.bear < 0 and er.bull > 0 and self.trade.is_flat:
self.buy(self.trade, reason=f"Bull {er.bull:.2f} bear {er.bear:.2f}")
if er.bull < 0 and self.trade.is_long:
self.sell(self.trade, self.trade.position, reason="Buyers gone")

Notes

  • Alexander Elder, Trading for a Living (1993).
  • Proven by an assert-via-trade run on SPY daily (both components matched an independent EMA replication within 0.05 once warm; zero alarm trades).
  • In price units, so thresholds are instrument-specific; the sign and the direction of change are what Elder reads.