fix: de-duplicate four indicators by correcting their definitions (#300)
* fix(core): de-duplicate 3 indicators by correcting their definitions Behavioral audit found these computed identically to another indicator: - AverageDrawdown was the mean per-bar under-water fraction = PainIndex. Now the conventional average drawdown: mean of the maximum depths of the distinct drawdown episodes in the window. - IntradayIntensity was a cumulative line = the A/D Line (Adl); its normalized form is the Chaikin Money Flow (Cmf). Now the raw per-bar Bostian intensity volume*(2c-h-l)/(h-l), distinct from both. - AwesomeOscillatorHistogram was AO - SMA(AO, n) = AcceleratorOscillator. Now the AO momentum AO[t] - AO[t-lookback] (the histogram delta); the 3rd parameter is reinterpreted from sma_period to lookback (default 1). Constructor signatures are unchanged, so the bindings keep their API. Core unit tests rewritten with the new reference values; workspace tests + clippy green. Binding value-tests and deep-dive docs are updated separately. * fix(core): redefine AdOscillator as the A/D Oscillator (was a Wad duplicate) AdOscillator computed the cumulative volume-free Williams A/D line, identical to the Wad indicator. Redefine it as the Williams A/D *Oscillator*: the same line minus its 13-bar SMA, so it oscillates around zero (mean-reverting) while Wad stays the drifting cumulative line for divergence analysis. The canonical name AdOscillator is now accurate; the trait name() becomes "ADOSC". Constructor stays no-arg (internal 13-bar signal). Unit tests rewritten and cross-checked against Wad - SMA(Wad, 13). The native bindings' "WilliamsAD" alias is renamed to "ADOSC" separately. * fix(bindings): rename WilliamsAD alias to ADOSC and update value tests Follows the core de-duplication: the native bindings exposed the Williams A/D line as 'WilliamsAD', which is now the A/D Oscillator. Rename the Python / Node.js / WASM alias to 'ADOSC' (regenerated node index.js / index.d.ts) and update the binding value-tests for the four redefined indicators (AverageDrawdown episode mean, AwesomeOscillatorHistogram momentum warmup, the Wad-line reference test now uses ta.Wad()). Python suite and node suite both pass (pytest all green, node 584/584). * docs: record indicator de-duplication in README and CHANGELOG README volume family: 'Williams A/D' -> 'Williams A/D Oscillator', 'Intraday Intensity Index' -> 'Intraday Intensity'. CHANGELOG [Unreleased] documents the four redefinitions and the native WilliamsAD -> ADOSC rename as breaking. * test(core): cover Default impl and drop dead match arm Codecov flagged AdOscillator::default() (never exercised) and the unreachable _ => panic!() arm in the AwesomeOscillatorHistogram test. Exercise Default in the accessors test and rewrite the histogram check as an if-let, removing the dead arm.
This commit is contained in:
@@ -634,8 +634,8 @@ CANDLE_SCALAR = {
|
||||
lambda: ta.PVI(),
|
||||
lambda ind, h, l, c, v: ind.batch(c, v),
|
||||
),
|
||||
"WilliamsAD": (
|
||||
lambda: ta.WilliamsAD(),
|
||||
"ADOSC": (
|
||||
lambda: ta.ADOSC(),
|
||||
lambda ind, h, l, c, v: ind.batch(h, l, c),
|
||||
),
|
||||
"AnchoredVWAP": (
|
||||
@@ -1762,7 +1762,7 @@ def test_wad_reference():
|
||||
# TR_l = min(10, 8) = 8 -> delta = 12 - 8 = 4. AD = 4.
|
||||
# bar 2: prev=12, today high=11, low=7, close=7 (down day).
|
||||
# TR_h = max(12, 11) = 12 -> delta = 7 - 12 = -5. AD = 4 - 5 = -1.
|
||||
ad = ta.WilliamsAD()
|
||||
ad = ta.Wad()
|
||||
high = np.array([11.0, 13.0, 11.0])
|
||||
low = np.array([9.0, 8.0, 7.0])
|
||||
close = np.array([10.0, 12.0, 7.0])
|
||||
|
||||
Reference in New Issue
Block a user