AcceleratorOscillator — Accelerator Oscillator
The Awesome Oscillator minus its own simple average: momentum’s acceleration rather than its level. Bill Williams’ argument is that acceleration turns before momentum does, so this changes sign earlier than AO.
Signature
AcceleratorOscillator(fast, slow, smooth, on=<source>)| Argument | Type | Required | Notes |
|---|---|---|---|
fast |
int Param or literal | Yes | AO fast window. Convention 5. Bounds 1–100. |
slow |
int Param or literal | Yes | AO slow window. Convention 34. Bounds 2–200. |
smooth |
int Param or literal | Yes | SMA of the AO. Convention 5. Bounds 1–100. |
on= |
symbol | No | Source symbol. Defaults to the trade symbol. Reads high and low. |
Formula
$$ \text{AC} = \text{AO} - \text{SMA}(\text{AO}, s), \quad \text{AO} = \text{SMA}(\text{mid}, f) - \text{SMA}(\text{mid}, l) $$
Warmup
slow + smooth bars; 0 until then.
Reading the value
ac.valueac > 0ac.crossed_above(0)Example
class AccelEntry(Strategy): """Enter when acceleration turns positive with momentum already up.""" trade = Symbol() sizing = FixedCapital()
def execute(self): ac = AcceleratorOscillator(5, 34, 5, on=self.trade) ao = AwesomeOscillator(5, 34, on=self.trade) if ac.crossed_above(0) and ao.value > 0 and self.trade.is_flat: self.buy(self.trade, reason="Accelerating") if ac.crossed_below(0) and self.trade.is_long: self.sell(self.trade, self.trade.position, reason="Decelerating")Notes
- Bill Williams, New Trading Dimensions (1998).
- Proven by an assert-via-trade run on SPY daily (stayed within the bound implied by its own AO on every bar; zero alarm trades).
- Earlier than
AwesomeOscillatorand correspondingly noisier — most useful as a confirmation rather than a trigger.