Files
wickra/testdata/golden/data_ticks.csv
T
kingchenc 8a103ef920 feat(data-layer): TickAggregator (tick-to-candle) in all 10 languages (#309)
* feat(data-layer): TickAggregator in Node, WASM, Python + C ABI hub

First data-layer feature (F2): roll trade ticks up into fixed-timeframe OHLCV
candles, exposed natively and over the C ABI.

- wickra-data wired as a binding dependency (workspace dep; its wickra-core dep
  is default-features=false so it never forces rayon into the rayon-free WASM
  build — native bindings re-enable parallel through their own dependency).
- Node `TickAggregator(bucket, gapFill?)` -> `push(price, size, ts): Candle[]`;
  WASM the same (array of objects); Python `push(...) -> list[tuple]`.
- C ABI: `WickraCandle` struct + `wickra_tick_aggregator_new/push/free` (push
  writes candles into a caller buffer and returns the count), generated via the
  capi generator's new DATA_LAYER section; cbindgen now parses wickra-data so
  `TickAggregator` is a forward-declared opaque; header vendored to bindings/go.

Verified bit-identical across Node/WASM/Python/C/C++ (o=100 h=101 l=100 c=101
v=3 ts=0 for the shared 3-tick probe). WIP: Go/C#/Java/R generated bindings and
the cross-language golden are still pending.

* feat(data-layer): TickAggregator in Go, C#, Java, R (lossless push/drain)

Complete F2 across all 10 languages: the C-ABI tick aggregator now uses a
two-step push/drain so gap-fill candles are never lost, and the four generated
bindings expose it idiomatically.

- C ABI redesigned: opaque TickAggregator handle (inner aggregator + pending
  buffer); push consumes a tick and returns the closed-candle count, drain copies
  them into a count-sized caller buffer.
- Go: NewTickAggregator + Push(price,size,ts) []Candle; C#: TickAggregator +
  Candle[] Push(...); Java: TickAggregator + Candle[] push(...); R: TickAggregator
  constructor + push() S3 generic returning an (n x 6) numeric matrix.
- Candle output record generated per language from WickraCandle.

Verified bit-identical to the native bindings (o=100 h=101 l=100 c=101 v=3 ts=0)
in Go, C#, Java, and R at runtime; R passes R CMD check (pre-existing doc
warnings only). WIP: cross-language data-layer golden + CHANGELOG still pending.

* test(data-layer): cross-language golden for the tick aggregator + CHANGELOG

gen_golden emits a deterministic tick stream (testdata/golden/data_ticks.csv) and
the reference candle streams with and without gap filling (data_candles.csv,
data_candles_gap.csv). Every binding replays the shared ticks through its
TickAggregator and checks the candles bit-for-bit (fp tolerance) against the Rust
reference:

- Node / WASM / Python / Go / C# / Java / R: a dedicated parity test each.
- C / C++: data_layer_test.c (compiled as both, run as ctest).

The gap-fill fixture closes several candles from a single push, exercising the
lossless push/drain path. Records the feature under CHANGELOG [Unreleased].

* fix(examples): rename the CSV-loader candle to WickraBar

The example CSV helper (wickra_csv.h) defined its own struct WickraCandle, which
now collides with the public C ABI WickraCandle (the tick aggregator output) in
any example that includes both headers (backtest, multi_timeframe, the strategy
examples). The public type owns the name; rename the example loader's bar to
WickraBar. The generated golden_test.c is untouched (its only match was the
unrelated WickraCandleVolumeOutput).
2026-06-15 21:24:33 +02:00

1.5 KiB

1pricesizetimestamp
210010
3103.45520206661342350
4106.646424733950353700
5109.3332690962748341050
6111.3203908596722651400
7112.4749498660405511750
8112.7384763087819622100
9112.1320936664887432450
10110.7546318055115142800
11108.773798802338353150
12106.4112000805986813500
13103.9225430585675123850
14101.5747955670514834200
1599.6223384081602644550
1698.2842422758641254900
1797.7246988233490315250
1898.038353911641625600
1999.2418531767226735950
20101.2723551244401246300
21103.9931445740236356650
22107.2058450180107317000
23110.668139004843527350
24114.1154136351337837700
25117.2843976438819948050
26119.9366786384915358400
27121.8799997677473918750
28122.9854334537460529100
29123.1988981084508639450
30122.545989080882849800
31121.12969230082183510150
32119.12118485241757110500
33116.74454423507063210850
34114.2567321877702311200
35111.92464106224679411550
36110.00125312406458511900
37108.7030424002833112250
38108.19063769933508217600
39108.55447411796011317950
40109.80671474335324418300
41111.88016416080967518650
42114.63427081999565119000
43117.86768208634197219350
44121.33623047221137319700
45124.77474439137693420050
46127.92073514707224520400
47130.5378442655162120750
48132.43695669444105221100
49133.49309388747918321450
50133.65657776549278421800
51132.95746831142935522150
52131.50287840157117122500
53129.46740573130614222850
54127.07753652299444323200
55124.59141418625812423550
56122.27578013601534523900
57120.38214657630877124250
58119.12432966418496224600
59118.65934994918358324950
60119.07340619529367425300
61120.37417550208815525650