Files
kingchenc 4f708d410d test: golden-pin the four de-duplicated indicators across all bindings (#305)
* test: golden-pin the four de-duplicated indicators across all C-ABI bindings

Extend gen_golden to emit reference fixtures for AdOscillator (ADOSC),
IntradayIntensity, AwesomeOscillatorHistogram and AverageDrawdown, and replay
them through the Go / C# / Java / R golden harnesses so their corrected
definitions stay bit-identical to the Rust core in every binding. Go suite
verified locally (gcc 13 + cgo): all 9 golden tests pass; C#/Java/R use the
same fixtures and harness pattern (CI-verified). First step of extending the
golden coverage beyond the seven archetype representatives.

* test: golden-pin the scalar-output tranche (308 indicators) against Rust

Extend gen_golden with a generated emit_scalar that writes reference fixtures
for every single-f64-output indicator (scalar / candle / pairwise input) using
valid constructor params, and add a manifest-driven generic Python golden
replay that reconstructs each by its native name and checks it bit-for-bit
against the Rust output. 308 indicators now value-tied to the Rust core in
Python (pytest: 308/308). Takes golden coverage from the 7 archetype
representatives to 308+ of the catalogue.

22 scalar indicators with non-default constructor constraints are skipped by
gen_golden for now (logged), as are non-f64-output ones; multi-output, exotic
inputs and the per-indicator arg arities of the C-ABI/Node replays follow.
Generated + verified locally with the full toolchain.

* test: golden-pin the multi-output tranche (70 indicators) in Python

Add a generated emit_multi to gen_golden (per-indicator Output-field access,
one CSV column per field) and a manifest-driven generic Python replay that
checks every field of each multi-output indicator against the Rust reference.
70 multi-output indicators now value-tied to Rust in Python; combined with the
scalar tranche, 378 indicators are golden-pinned. 8 multi with non-default
param constraints and 5 with non-f64 Output fields (Option/Vec/i64) are
deferred. pytest green.

* test(golden): add 30 constraint-tuned indicators to scalar/multi golden suite

Emit golden fixtures for 22 scalar-output and 8 multi-output indicators
whose constructors need non-default parameters (Alma, Jma, Psar, T3, Mama,
DoubleBollinger, ZigZag, ...). All 408 fixtures replay bit-for-bit through
the Python binding.

* test(golden): cover 36 missed scalar/multi indicators

Add 26 single-output (LinearRegression family, HT cycle, Candle
volatility estimators, DrawdownDuration) and 10 multi-output
(BollingerBands, MACD/MACDEXT/MACDFIX, Camarilla, VWAP bands, ...)
indicators to the golden suite. 444 fixtures replay bit-for-bit
through the Python binding.

* test(golden): cover 50 exotic-input indicators

Add deterministic synthetic feeders for the DerivativesTick (17),
CrossSection (15), Trade (8), TradeQuote (3) and OrderBook (7)
families, derived from the shared OHLCV input series in both
gen_golden and a new Python replay harness (test_golden_exotic).
All 494 fixtures replay bit-for-bit through the Python binding.

* test(golden): complete 514-indicator golden coverage

Add the final tranches: 3 mixed multi-output indicators (Ichimoku,
WilliamsFractals, LeadLagCrossCorrelation), 6 histogram profiles
(time/volume seasonality + TPO/volume price profiles), 10 alt-chart
bar builders and the footprint. Every one of the 514 distinct
indicators now has a Rust-generated g_<Canonical>.csv fixture and a
generic Python replay (scalar/multi/exotic/profile/bars), all passing
bit-for-bit.

* test(golden): add generic Node replay for all 514 indicators

A manifest-driven node:test harness reconstructs every indicator by its
native class, feeds the same synthetic stream derived from the shared
golden input, and checks output bit-for-bit against the Rust reference
fixtures (scalar/multi/exotic/profile/bars). node_manifest.json is
generated from index.d.ts plus the Python-side manifests. 514/514 pass.

* test(golden): add generated Go replay for all 514 indicators

golden_all_test.go (generated by gen_golden_test.py) reconstructs every
Go indicator, feeds the shared synthetic stream and checks output
bit-for-bit against the Rust reference fixtures. A reflection-based
comparator flattens multi-output structs, profiles and bar slices so one
path covers all archetypes. This is the first C-ABI binding verified
across the full catalogue. 514/514 pass.

* test(golden): add generated C# replay for all 514 indicators

GoldenAllTests.g.cs (generated by gen_golden_test.py) reconstructs every
C# indicator, feeds the shared synthetic stream and checks output
bit-for-bit against the Rust reference fixtures via a reflection-based
flatten covering scalar/multi/profile/bar archetypes. 514/514 pass.

Also add the '#nullable enable' directive the compiler requires to the
generated Indicators.g.cs, clearing the four CS8669 warnings on the
nullable double[] profile return types.

* fix(java): marshal C ABI bool params correctly; add 514 golden replay

The Java FFM binding marshalled the cross-section state flags (newHigh,
newLow, aboveMa, onBuySignal) as JAVA_DOUBLE arrays, but the C ABI takes
them as const bool* (one byte each), so the native side read the low byte
of each 8-byte double and saw every flag as false. Add WickraNative.
boolSegment and use it across the 15 cross-section indicators. Also pass
the MacdExt MaType arguments as byte to match the uint8_t downcall
descriptor (was int, throwing WrongMethodTypeException).

Add GoldenAllTest.java (generated by gen_golden_test.py): a reflection
runner replaying all 514 indicators against the Rust reference fixtures.
The bugs above were found by this test; 514/514 now pass.

* fix(r): marshal C ABI bool flags correctly; add 514 golden replay

The R wrapper passed the cross-section state flags as (bool *)REAL(x),
reinterpreting the 8-byte doubles as 1-byte bools so the native side read
every flag as false. Add wk_bool_vec to convert each flag vector into a
real C bool buffer and use it for all 15 cross-section update wrappers.

Add test-golden-all.R + generated golden_specs.R: a reflective runner
replaying all 514 indicators against the Rust reference fixtures. The bug
above was found by this test; verified 514/514 pass locally.

* test(golden): add WASM replay for all 514 indicators

A manifest-driven node:test harness loads the nodejs-target wasm-pack
build, reconstructs every indicator by its JS class, feeds the shared
synthetic stream and checks output bit-for-bit against the Rust
reference fixtures. wasm_manifest.json is generated from the wasm .d.ts
plus the shared manifests; a recursive flattener covers scalar, multi
(Reflect objects), profile and bar shapes. 514/514 pass locally
(wasm-pack build --target nodejs, then node --test).

* test(golden): add C and C++ replay for all 514 indicators

golden_test.c (generated by gen_golden_test.py) drives every indicator
through the C ABI (wickra.h) and checks output bit-for-bit against the
Rust reference fixtures. golden_test.cpp #includes the same source so the
identical runner is compiled and run under both gcc (C) and g++ (C++) via
the CMake targets golden_test / golden_test_cpp — proving the extern "C"
header is consumable from each language. Both 514/514 (verified via ctest).

* test(golden): gofmt the generated Go golden replay

* test(golden): make the Node fixture reader CRLF-safe and pin fixtures to LF
2026-06-15 04:48:51 +02:00

3.8 KiB

1uppermiddlelower
2nannannan
3nannannan
4nannannan
5nannannan
6nannannan
7nannannan
8nannannan
9nannannan
10nannannan
11nannannan
12nannannan
13nannannan
14nannannan
15142.43897548923832107.08286530857571.72675512791169
16144.59462365481113106.9603111854224169.32599871603371
17145.0030716573113106.5509895251892568.0989073930672
18144.3882094557178105.9361273235957667.4840451914737
19143.66739403289267105.2153119007706266.76322976864856
20142.9496771946618104.4975950625397466.04551293041769
21142.34383395951772103.8917518273956765.43966969527361
22140.73968594718195103.4965638780548766.25344180892779
23136.96338192750358103.3919956879373469.8206094483711
24142.28956590886727103.6320515329103764.97453715695346
25149.3143869040551104.2399514501634959.165515996271864
26156.09055012094973105.2060570614415454.32156400193334
27161.34792683057526106.4887325406686851.629538250762096
28164.71733229713175108.0180638182897251.318795339447675
29166.40137227572393109.702103796881953.00283531803986
30168.13435419036813111.435085711526154.735817232684056
31168.58504059568355113.1068709599170357.6287013241505
32167.32291794437685114.6127874556867661.90265696699667
33163.92759220237946115.8629796741401867.7983671459009
34160.04941552271148116.7904351786637673.53145483461603
35154.51158769168006117.3569706421082880.2023535925365
36149.10163457719665117.5566426496835586.01165072217044
37151.61613099212053117.4162786065006883.21642622088085
38152.5753461456141116.9930803253722281.41081450513035
39152.40948030896186116.3695143592349480.32954840950804
40151.68591145930912115.6459455095822279.60597955985531
41150.971637487385114.9316715376580978.89170558793118
42150.2476450454987114.3351599209616378.42267479642457
43149.19256677818754113.954358776525378.71615077486304
44148.00268774024445113.8679474473344779.73320715442449
45155.87334290074438114.1283083109455772.38327372114675
46162.6402208289146114.7568476177066166.87347440649863
47168.11262182090675115.74208333416763.37154484742726
48173.15068590548697117.0406707989292160.930655692371474
49176.15178108369062118.5812745721600861.010768060629545
50177.8661286233169120.270940617976462.67575261263589
51179.59858761697018122.0033996116296764.40821160628917
52181.2637476671299123.6685596617893966.07337165644888
53180.6518868003708125.1623404913141169.67279418225742
54177.18552192254725126.3959706184313375.60641931431542
55171.25336710627585127.3039170488205183.35446699136519
56164.6582243048905127.8497391428219291.04125398075332
57160.1139469749142128.029343749248195.94474052358203
58162.75117071043894127.8713508343890892.9915309583392
59163.05473223647277127.4345369456609791.81434165484916
60162.4227801684886126.8025848776767891.18238958686497
61161.69680382824373126.0766085374319190.4564132466201
62160.98631603094674125.3661207401349289.74592544932311
63160.3994460463934124.779250755581689.15905546476979
64158.0719779035228124.4130854425202490.75419298151769
65155.96015529297182124.3449967687087392.72983824444562
66163.7108792225584124.6257304034678485.5405815843773
67170.8735345302779125.2748727581742779.67621098607063
68176.8663552570761126.2791013904654675.69184752385482
69182.2692330966496127.5933750583383772.91751702002715
70186.7855546323677129.1449571201534671.50435960793922
71189.4720506308403130.8399128822043572.20777513356839
72191.20363825378143132.5715005051454873.93936275650952
73191.4641446590945134.229705934596876.99526721009912
74190.5489000989824135.7110701289722480.87324015896209
75188.31556437399772136.9279307475372685.5402971210768
76184.58207271426198137.8162527662264891.05043281819098
77178.80311469886897138.3413485356309497.87958237239292
78174.22948135812942138.50097632541122102.77247129269301
79176.23749538789545138.3255405713923100.41358575488917
80176.2192892668097137.8753759378633499.53146260891697
81175.5792711306549137.2353578017085298.89144447276215