Compare commits

...
2 Commits
Author SHA1 Message Date
kingchencandGitHub d5f5e14dda release: bump 0.9.5 -> 0.9.6 (#331)
Documentation release for the R binding. The library API and every indicator are
unchanged from `0.9.5`; only the R package's help pages change.

### What's in 0.9.6
- **R package documentation** (landed in #330): the twelve undocumented data-layer
  exports now have full man pages, the stale `AwesomeOscillatorHistogram` codoc is
  fixed, and a broken `push()` example is corrected — clearing the two `R CMD check`
  warnings r-universe reported for `0.9.5`. CI now runs `R CMD check` so doc drift
  fails the PR instead of reaching r-universe.

Pure version-string bump on top — `bump_version.py` touched 19 files. `cargo fmt`
clean.

Tag/publish waits for explicit GO (irreversible publish to crates.io / PyPI / npm
/ NuGet / Maven / Go / r-universe).
2026-06-18 02:10:03 +02:00
kingchencandGitHub 7e5d394f2a fix(r): document the data-layer exports + add an R CMD check gate (#330)
Clears the R CMD check **WARNING**s r-universe surfaced when it finally built
0.9.5 (it was stuck on 0.9.2, before the data layer existed): 11/13 platform
builds reported the same two warnings.

### Warnings fixed
1. **Undocumented code objects** — the data layer added in 0.9.3 (`BinanceFeed`,
   `CandleReader`, `Resampler`, `TickAggregator`, `fetch_binance_klines` and the
   generics `name` / `is_ready` / `warmup_period` / `push` / `read`). The roxygen
   blocks existed in `methods.R`, but the `man/*.Rd` were never regenerated, and
   the constructors had only a title.
2. **Codoc mismatch** — `AwesomeOscillatorHistogram.Rd` still documented
   `sma_period` after the argument was renamed to `lookback`.

### Changes
- Full `@param`/`@return` roxygen on the seven data-layer constructors.
- Regenerated `man/*.Rd` + `NAMESPACE` with roxygen2: 13 new pages, the stale
  AwesomeOscillator usage refreshed, and `flush` registered on `base::flush`.
- Fixed the `push()` example (`TickAggregator(1000)` was missing the required
  `gap_fill`) — it only ran once `push()` got a generated `.Rd`.
- **New CI gate:** a ubuntu-only `R CMD check` in the `r` job that fails on doc
  WARNING/ERROR, so stale docs fail the PR instead of reaching r-universe.

Verified locally with `R CMD check` (R 4.6.0 + Rtools45): *missing documentation
entries* and *Rd \usage sections* now **OK**, examples **OK**, tests **OK**. This
PR's own CI exercises the new gate.

Follow-up: a separate `0.9.6` release ships these doc fixes to r-universe.
2026-06-18 01:38:44 +02:00
39 changed files with 495 additions and 76 deletions
+25
View File
@@ -969,6 +969,31 @@ jobs:
R CMD INSTALL bindings/r R CMD INSTALL bindings/r
Rscript -e 'library(testthat); library(wickra); test_dir("bindings/r/tests/testthat", stop_on_failure = TRUE)' Rscript -e 'library(testthat); library(wickra); test_dir("bindings/r/tests/testthat", stop_on_failure = TRUE)'
# Full R CMD check, gated on the documentation problems r-universe surfaces
# (undocumented exported objects, codoc mismatches) that R CMD INSTALL above
# does not catch — exactly what shipped stale to r-universe with the 0.9.3
# data layer. Ubuntu-only; these checks are platform-independent. Vignettes
# are skipped here (building them needs pandoc and the vignette is exercised
# in the next step), so the two --no-build-vignettes warnings are ignored.
- name: R CMD check (documentation & consistency, like r-universe)
if: matrix.os == 'ubuntu-latest'
shell: bash
run: |
export WICKRA_INCLUDE_DIR="${WICKRA_INCLUDE_DIR//\\//}"
export WICKRA_LIB_DIR="${WICKRA_LIB_DIR//\\//}"
R CMD build bindings/r --no-build-vignettes --no-manual
R CMD check wickra_*.tar.gz --no-manual --no-vignettes --no-tests || true
log=$(find . -maxdepth 2 -name 00check.log | head -1)
echo "::group::00check.log"; cat "$log"; echo "::endgroup::"
problems=$(grep -E '\.\.\. (WARNING|ERROR)' "$log" \
| grep -vE "checking (files in .vignettes.|package vignettes)" || true)
if [ -n "$problems" ]; then
echo "::error::R CMD check found problems (run roxygen2::roxygenise() in bindings/r if the docs are stale):"
echo "$problems"
exit 1
fi
echo "R CMD check: documentation and consistency clean."
- name: Build the vignette code - name: Build the vignette code
shell: bash shell: bash
# The getting-started vignette runs at R CMD check time on r-universe / # The getting-started vignette runs at R CMD check time on r-universe /
+21 -1
View File
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [0.9.6] - 2026-06-18
Documentation release for the R binding. The library API and every indicator
are unchanged from `0.9.5`; only the R package's help pages change.
### Fixed
- **R package: document the data-layer exports and refresh the man pages.**
r-universe's `R CMD check` reported two warnings against the `0.9.3` data layer
it built for the first time in `0.9.5`: twelve undocumented exported objects
(`BinanceFeed`, `CandleReader`, `Resampler`, `TickAggregator`,
`fetch_binance_klines` and the `name` / `is_ready` / `warmup_period` / `push` /
`read` generics) and a codoc mismatch on `AwesomeOscillatorHistogram` (its help
page still listed `sma_period` after the argument was renamed to `lookback`).
The roxygen sources existed but the `man/*.Rd` had never been regenerated; they
are now complete, and a `push()` example that constructed a `TickAggregator`
without its required `gap_fill` argument is fixed. CI now runs `R CMD check` so
documentation drift fails the pull request instead of surfacing on r-universe.
## [0.9.5] - 2026-06-17 ## [0.9.5] - 2026-06-17
Maintenance release. The library API and every indicator are unchanged from Maintenance release. The library API and every indicator are unchanged from
@@ -1853,7 +1872,8 @@ public API changes.
optional Binance live feed. optional Binance live feed.
- Bindings for Python, Node.js, and WebAssembly. - Bindings for Python, Node.js, and WebAssembly.
[Unreleased]: https://github.com/wickra-lib/wickra/compare/v0.9.5...HEAD [Unreleased]: https://github.com/wickra-lib/wickra/compare/v0.9.6...HEAD
[0.9.6]: https://github.com/wickra-lib/wickra/compare/v0.9.5...v0.9.6
[0.9.5]: https://github.com/wickra-lib/wickra/compare/v0.9.4...v0.9.5 [0.9.5]: https://github.com/wickra-lib/wickra/compare/v0.9.4...v0.9.5
[0.9.4]: https://github.com/wickra-lib/wickra/compare/v0.9.3...v0.9.4 [0.9.4]: https://github.com/wickra-lib/wickra/compare/v0.9.3...v0.9.4
[0.9.3]: https://github.com/wickra-lib/wickra/compare/v0.9.2...v0.9.3 [0.9.3]: https://github.com/wickra-lib/wickra/compare/v0.9.2...v0.9.3
Generated
+9 -9
View File
@@ -1785,7 +1785,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra" name = "wickra"
version = "0.9.5" version = "0.9.6"
dependencies = [ dependencies = [
"approx", "approx",
"criterion", "criterion",
@@ -1796,7 +1796,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-bench" name = "wickra-bench"
version = "0.9.5" version = "0.9.6"
dependencies = [ dependencies = [
"criterion", "criterion",
"kand", "kand",
@@ -1808,7 +1808,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-c" name = "wickra-c"
version = "0.9.5" version = "0.9.6"
dependencies = [ dependencies = [
"tokio", "tokio",
"wickra-core", "wickra-core",
@@ -1817,7 +1817,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-core" name = "wickra-core"
version = "0.9.5" version = "0.9.6"
dependencies = [ dependencies = [
"approx", "approx",
"proptest", "proptest",
@@ -1827,7 +1827,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-data" name = "wickra-data"
version = "0.9.5" version = "0.9.6"
dependencies = [ dependencies = [
"approx", "approx",
"csv", "csv",
@@ -1846,7 +1846,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-examples" name = "wickra-examples"
version = "0.9.5" version = "0.9.6"
dependencies = [ dependencies = [
"serde_json", "serde_json",
"tokio", "tokio",
@@ -1856,7 +1856,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-node" name = "wickra-node"
version = "0.9.5" version = "0.9.6"
dependencies = [ dependencies = [
"napi", "napi",
"napi-build", "napi-build",
@@ -1868,7 +1868,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-python" name = "wickra-python"
version = "0.9.5" version = "0.9.6"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"pyo3", "pyo3",
@@ -1879,7 +1879,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-wasm" name = "wickra-wasm"
version = "0.9.5" version = "0.9.6"
dependencies = [ dependencies = [
"console_error_panic_hook", "console_error_panic_hook",
"js-sys", "js-sys",
+3 -3
View File
@@ -14,7 +14,7 @@ members = [
exclude = ["fuzz"] exclude = ["fuzz"]
[workspace.package] [workspace.package]
version = "0.9.5" version = "0.9.6"
authors = ["kingchenc <support@wickra.org>"] authors = ["kingchenc <support@wickra.org>"]
edition = "2021" edition = "2021"
rust-version = "1.86" rust-version = "1.86"
@@ -26,8 +26,8 @@ keywords = ["finance", "trading", "indicators", "technical-analysis", "ta"]
categories = ["finance", "mathematics", "science"] categories = ["finance", "mathematics", "science"]
[workspace.dependencies] [workspace.dependencies]
wickra-core = { path = "crates/wickra-core", version = "0.9.5" } wickra-core = { path = "crates/wickra-core", version = "0.9.6" }
wickra-data = { path = "crates/wickra-data", version = "0.9.5" } wickra-data = { path = "crates/wickra-data", version = "0.9.6" }
thiserror = "2" thiserror = "2"
rayon = "1.10" rayon = "1.10"
+3 -3
View File
@@ -2,13 +2,13 @@
## Supported versions ## Supported versions
Wickra is pre-1.0. Security fixes are applied to the latest released `0.9.5` Wickra is pre-1.0. Security fixes are applied to the latest released `0.9.6`
version only; please upgrade to the newest release before reporting an issue. version only; please upgrade to the newest release before reporting an issue.
| Version | Supported | | Version | Supported |
| --- | --- | | --- | --- |
| 0.9.5 (latest) | :white_check_mark: | | 0.9.6 (latest) | :white_check_mark: |
| < 0.9.5 | :x: | | < 0.9.6 | :x: |
## Reporting a vulnerability ## Reporting a vulnerability
+1 -1
View File
@@ -11,7 +11,7 @@
<!-- NuGet package metadata --> <!-- NuGet package metadata -->
<PackageId>Wickra</PackageId> <PackageId>Wickra</PackageId>
<Version>0.9.5</Version> <Version>0.9.6</Version>
<Authors>kingchenc</Authors> <Authors>kingchenc</Authors>
<Description>High-performance streaming technical-analysis indicators (514 indicators) for .NET, backed by the native Rust core via the Wickra C ABI.</Description> <Description>High-performance streaming technical-analysis indicators (514 indicators) for .NET, backed by the native Rust core via the Wickra C ABI.</Description>
<PackageLicenseExpression>MIT OR Apache-2.0</PackageLicenseExpression> <PackageLicenseExpression>MIT OR Apache-2.0</PackageLicenseExpression>
+2 -2
View File
@@ -30,14 +30,14 @@ Maven:
<dependency> <dependency>
<groupId>org.wickra</groupId> <groupId>org.wickra</groupId>
<artifactId>wickra</artifactId> <artifactId>wickra</artifactId>
<version>0.9.5</version> <version>0.9.6</version>
</dependency> </dependency>
``` ```
Gradle: Gradle:
```kotlin ```kotlin
implementation("org.wickra:wickra:0.9.5") implementation("org.wickra:wickra:0.9.6")
``` ```
The native library ships prebuilt per platform (Linux, macOS, Windows — x64 and The native library ships prebuilt per platform (Linux, macOS, Windows — x64 and
+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>org.wickra</groupId> <groupId>org.wickra</groupId>
<artifactId>wickra</artifactId> <artifactId>wickra</artifactId>
<version>0.9.5</version> <version>0.9.6</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Wickra</name> <name>Wickra</name>
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "wickra-darwin-arm64", "name": "wickra-darwin-arm64",
"version": "0.9.5", "version": "0.9.6",
"description": "Native binding for wickra (macOS Apple Silicon). Installed automatically as an optional dependency of wickra on matching platforms.", "description": "Native binding for wickra (macOS Apple Silicon). Installed automatically as an optional dependency of wickra on matching platforms.",
"main": "wickra.darwin-arm64.node", "main": "wickra.darwin-arm64.node",
"files": [ "files": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "wickra-darwin-x64", "name": "wickra-darwin-x64",
"version": "0.9.5", "version": "0.9.6",
"description": "Native binding for wickra (macOS Intel). Installed automatically as an optional dependency of wickra on matching platforms.", "description": "Native binding for wickra (macOS Intel). Installed automatically as an optional dependency of wickra on matching platforms.",
"main": "wickra.darwin-x64.node", "main": "wickra.darwin-x64.node",
"files": [ "files": [
@@ -1,6 +1,6 @@
{ {
"name": "wickra-linux-arm64-gnu", "name": "wickra-linux-arm64-gnu",
"version": "0.9.5", "version": "0.9.6",
"description": "Native binding for wickra (linux arm64 GNU). Installed automatically as an optional dependency of wickra on matching platforms.", "description": "Native binding for wickra (linux arm64 GNU). Installed automatically as an optional dependency of wickra on matching platforms.",
"main": "wickra.linux-arm64-gnu.node", "main": "wickra.linux-arm64-gnu.node",
"files": [ "files": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "wickra-linux-x64-gnu", "name": "wickra-linux-x64-gnu",
"version": "0.9.5", "version": "0.9.6",
"description": "Native binding for wickra (linux x64 GNU). Installed automatically as an optional dependency of wickra on matching platforms.", "description": "Native binding for wickra (linux x64 GNU). Installed automatically as an optional dependency of wickra on matching platforms.",
"main": "wickra.linux-x64-gnu.node", "main": "wickra.linux-x64-gnu.node",
"files": [ "files": [
@@ -1,6 +1,6 @@
{ {
"name": "wickra-win32-arm64-msvc", "name": "wickra-win32-arm64-msvc",
"version": "0.9.5", "version": "0.9.6",
"description": "Native binding for wickra (Windows arm64 MSVC). Installed automatically as an optional dependency of wickra on matching platforms.", "description": "Native binding for wickra (Windows arm64 MSVC). Installed automatically as an optional dependency of wickra on matching platforms.",
"main": "wickra.win32-arm64-msvc.node", "main": "wickra.win32-arm64-msvc.node",
"files": [ "files": [
@@ -1,6 +1,6 @@
{ {
"name": "wickra-win32-x64-msvc", "name": "wickra-win32-x64-msvc",
"version": "0.9.5", "version": "0.9.6",
"description": "Native binding for wickra (Windows x64 MSVC). Installed automatically as an optional dependency of wickra on matching platforms.", "description": "Native binding for wickra (Windows x64 MSVC). Installed automatically as an optional dependency of wickra on matching platforms.",
"main": "wickra.win32-x64-msvc.node", "main": "wickra.win32-x64-msvc.node",
"files": [ "files": [
+20 -20
View File
@@ -1,12 +1,12 @@
{ {
"name": "wickra", "name": "wickra",
"version": "0.9.5", "version": "0.9.6",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "wickra", "name": "wickra",
"version": "0.9.5", "version": "0.9.6",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"devDependencies": { "devDependencies": {
"@napi-rs/cli": "^2.18.0" "@napi-rs/cli": "^2.18.0"
@@ -15,12 +15,12 @@
"node": ">= 20" "node": ">= 20"
}, },
"optionalDependencies": { "optionalDependencies": {
"wickra-darwin-arm64": "0.9.5", "wickra-darwin-arm64": "0.9.6",
"wickra-darwin-x64": "0.9.5", "wickra-darwin-x64": "0.9.6",
"wickra-linux-arm64-gnu": "0.9.5", "wickra-linux-arm64-gnu": "0.9.6",
"wickra-linux-x64-gnu": "0.9.5", "wickra-linux-x64-gnu": "0.9.6",
"wickra-win32-arm64-msvc": "0.9.5", "wickra-win32-arm64-msvc": "0.9.6",
"wickra-win32-x64-msvc": "0.9.5" "wickra-win32-x64-msvc": "0.9.6"
} }
}, },
"node_modules/@napi-rs/cli": { "node_modules/@napi-rs/cli": {
@@ -41,8 +41,8 @@
} }
}, },
"node_modules/wickra-darwin-arm64": { "node_modules/wickra-darwin-arm64": {
"version": "0.9.5", "version": "0.9.6",
"resolved": "https://registry.npmjs.org/wickra-darwin-arm64/-/wickra-darwin-arm64-0.9.5.tgz", "resolved": "https://registry.npmjs.org/wickra-darwin-arm64/-/wickra-darwin-arm64-0.9.6.tgz",
"integrity": "sha512-4eZiBR/yGUdr4nzhEUFy2i69XgNx64iI2ax/LPamsThgylC0KpHOZKK19QzJ2d9KbK4C8nMjME5FLuR+4GNEwQ==", "integrity": "sha512-4eZiBR/yGUdr4nzhEUFy2i69XgNx64iI2ax/LPamsThgylC0KpHOZKK19QzJ2d9KbK4C8nMjME5FLuR+4GNEwQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
@@ -57,8 +57,8 @@
} }
}, },
"node_modules/wickra-darwin-x64": { "node_modules/wickra-darwin-x64": {
"version": "0.9.5", "version": "0.9.6",
"resolved": "https://registry.npmjs.org/wickra-darwin-x64/-/wickra-darwin-x64-0.9.5.tgz", "resolved": "https://registry.npmjs.org/wickra-darwin-x64/-/wickra-darwin-x64-0.9.6.tgz",
"integrity": "sha512-6hf8zI3QPjTFp4zCpmgUwDvNtu6jHqNUHKD5e55POo0CgA52HkpyxSPtVm8TGTIZDI7kPjlbOdBM8CJ76mmXwA==", "integrity": "sha512-6hf8zI3QPjTFp4zCpmgUwDvNtu6jHqNUHKD5e55POo0CgA52HkpyxSPtVm8TGTIZDI7kPjlbOdBM8CJ76mmXwA==",
"cpu": [ "cpu": [
"x64" "x64"
@@ -73,8 +73,8 @@
} }
}, },
"node_modules/wickra-linux-arm64-gnu": { "node_modules/wickra-linux-arm64-gnu": {
"version": "0.9.5", "version": "0.9.6",
"resolved": "https://registry.npmjs.org/wickra-linux-arm64-gnu/-/wickra-linux-arm64-gnu-0.9.5.tgz", "resolved": "https://registry.npmjs.org/wickra-linux-arm64-gnu/-/wickra-linux-arm64-gnu-0.9.6.tgz",
"integrity": "sha512-kSe6y0xBMSiqdPLXNjwop5WZdHtvdBNKSEBCwZ4hFq33p4apW25/wrlzv9/oDuyD4kuPabJEhCCnFOplh58CUg==", "integrity": "sha512-kSe6y0xBMSiqdPLXNjwop5WZdHtvdBNKSEBCwZ4hFq33p4apW25/wrlzv9/oDuyD4kuPabJEhCCnFOplh58CUg==",
"cpu": [ "cpu": [
"arm64" "arm64"
@@ -89,8 +89,8 @@
} }
}, },
"node_modules/wickra-linux-x64-gnu": { "node_modules/wickra-linux-x64-gnu": {
"version": "0.9.5", "version": "0.9.6",
"resolved": "https://registry.npmjs.org/wickra-linux-x64-gnu/-/wickra-linux-x64-gnu-0.9.5.tgz", "resolved": "https://registry.npmjs.org/wickra-linux-x64-gnu/-/wickra-linux-x64-gnu-0.9.6.tgz",
"integrity": "sha512-tWBWS4qz7hxM4xnpFb59bhf6TaLwXq0Z3jEa/2l7r8PiHA94g8r8S53NRMiT+4yiL5hSWe/nUiC/YXdRrhEZ4g==", "integrity": "sha512-tWBWS4qz7hxM4xnpFb59bhf6TaLwXq0Z3jEa/2l7r8PiHA94g8r8S53NRMiT+4yiL5hSWe/nUiC/YXdRrhEZ4g==",
"cpu": [ "cpu": [
"x64" "x64"
@@ -105,8 +105,8 @@
} }
}, },
"node_modules/wickra-win32-arm64-msvc": { "node_modules/wickra-win32-arm64-msvc": {
"version": "0.9.5", "version": "0.9.6",
"resolved": "https://registry.npmjs.org/wickra-win32-arm64-msvc/-/wickra-win32-arm64-msvc-0.9.5.tgz", "resolved": "https://registry.npmjs.org/wickra-win32-arm64-msvc/-/wickra-win32-arm64-msvc-0.9.6.tgz",
"integrity": "sha512-EXIckHxAtF75PUGDKRzXyqMe9ldP0JjSdu68WFN6iJfp+McYrGu6h40TEJlQ/oUEIoPqiZB/xhVyo/el5Lg7zw==", "integrity": "sha512-EXIckHxAtF75PUGDKRzXyqMe9ldP0JjSdu68WFN6iJfp+McYrGu6h40TEJlQ/oUEIoPqiZB/xhVyo/el5Lg7zw==",
"cpu": [ "cpu": [
"arm64" "arm64"
@@ -121,8 +121,8 @@
} }
}, },
"node_modules/wickra-win32-x64-msvc": { "node_modules/wickra-win32-x64-msvc": {
"version": "0.9.5", "version": "0.9.6",
"resolved": "https://registry.npmjs.org/wickra-win32-x64-msvc/-/wickra-win32-x64-msvc-0.9.5.tgz", "resolved": "https://registry.npmjs.org/wickra-win32-x64-msvc/-/wickra-win32-x64-msvc-0.9.6.tgz",
"integrity": "sha512-Yfsqq1Xwp6hdxMyLze411vNdo7BDwI6+lPSe7A9XdqyPecNDbtKwYLpsal2r8EHbNzqM+R8XnuRtUaEQS5VlUQ==", "integrity": "sha512-Yfsqq1Xwp6hdxMyLze411vNdo7BDwI6+lPSe7A9XdqyPecNDbtKwYLpsal2r8EHbNzqM+R8XnuRtUaEQS5VlUQ==",
"cpu": [ "cpu": [
"x64" "x64"
+7 -7
View File
@@ -1,6 +1,6 @@
{ {
"name": "wickra", "name": "wickra",
"version": "0.9.5", "version": "0.9.6",
"description": "Streaming-first technical indicators: incremental, fast, install-free. Node bindings powered by Rust.", "description": "Streaming-first technical indicators: incremental, fast, install-free. Node bindings powered by Rust.",
"author": "kingchenc <support@wickra.org>", "author": "kingchenc <support@wickra.org>",
"main": "index.js", "main": "index.js",
@@ -47,12 +47,12 @@
"node": ">= 20" "node": ">= 20"
}, },
"optionalDependencies": { "optionalDependencies": {
"wickra-linux-x64-gnu": "0.9.5", "wickra-linux-x64-gnu": "0.9.6",
"wickra-linux-arm64-gnu": "0.9.5", "wickra-linux-arm64-gnu": "0.9.6",
"wickra-darwin-x64": "0.9.5", "wickra-darwin-x64": "0.9.6",
"wickra-darwin-arm64": "0.9.5", "wickra-darwin-arm64": "0.9.6",
"wickra-win32-x64-msvc": "0.9.5", "wickra-win32-x64-msvc": "0.9.6",
"wickra-win32-arm64-msvc": "0.9.5" "wickra-win32-arm64-msvc": "0.9.6"
}, },
"scripts": { "scripts": {
"build": "napi build --platform --release", "build": "napi build --platform --release",
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "maturin"
[project] [project]
name = "wickra" name = "wickra"
version = "0.9.5" version = "0.9.6"
description = "Streaming-first technical indicators: incremental, fast, install-free." description = "Streaming-first technical indicators: incremental, fast, install-free."
readme = "README.md" readme = "README.md"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
+1 -1
View File
@@ -1,7 +1,7 @@
Package: wickra Package: wickra
Type: Package Type: Package
Title: Streaming-First Technical Indicators Title: Streaming-First Technical Indicators
Version: 0.9.5 Version: 0.9.6
Authors@R: person("Wickra contributors", role = c("aut", "cre"), email = "support@wickra.org") Authors@R: person("Wickra contributors", role = c("aut", "cre"), email = "support@wickra.org")
Description: R bindings for the Wickra technical-analysis library over its C ABI Description: R bindings for the Wickra technical-analysis library over its C ABI
hub. Exposes 514 indicators, each an O(1) streaming state machine shared with hub. Exposes 514 indicators, each an O(1) streaming state machine shared with
+1 -1
View File
@@ -1,7 +1,7 @@
# Generated by roxygen2: do not edit by hand # Generated by roxygen2: do not edit by hand
S3method(base::flush,wickra_indicator)
S3method(batch,wickra_indicator) S3method(batch,wickra_indicator)
S3method(flush,wickra_indicator)
S3method(is_ready,wickra_indicator) S3method(is_ready,wickra_indicator)
S3method(name,wickra_indicator) S3method(name,wickra_indicator)
S3method(push,wickra_indicator) S3method(push,wickra_indicator)
+46 -3
View File
@@ -479,7 +479,14 @@ Camarilla <- function() {
.wk_obj("camarilla", ptr, "Camarilla") .wk_obj("camarilla", ptr, "Camarilla")
} }
#' CandleReader: parse OHLCV candles from a CSV string #' Parse OHLCV candles from a CSV string
#'
#' Builds a reader over an in-memory CSV string with a header row and OHLCV
#' columns. Pass the result to [read()] to get every parsed candle.
#'
#' @param csv A length-one character string of CSV text (a header row followed
#' by OHLCV data rows).
#' @return A `wickra_indicator` candle reader; read its candles with [read()].
#' @keywords internal #' @keywords internal
#' @export #' @export
CandleReader <- function(csv) { CandleReader <- function(csv) {
@@ -2687,7 +2694,14 @@ RenkoTrailingStop <- function(block_size) {
.wk_obj("renko_trailing_stop", ptr, "RenkoTrailingStop") .wk_obj("renko_trailing_stop", ptr, "RenkoTrailingStop")
} }
#' Resampler indicator #' Resample candles to a higher timeframe
#'
#' Aggregates a stream of candles into higher-timeframe bars. Feed candles with
#' [update()] (it returns a completed higher-timeframe bar, or `NULL` while the
#' current bar is still open) and emit the final, still-open bar with [flush()].
#'
#' @param timeframe Integer number of input candles per higher-timeframe bar.
#' @return A `wickra_indicator` resampler.
#' @keywords internal #' @keywords internal
#' @export #' @export
Resampler <- function(timeframe) { Resampler <- function(timeframe) {
@@ -3487,7 +3501,15 @@ Thrusting <- function() {
.wk_obj("thrusting", ptr, "Thrusting") .wk_obj("thrusting", ptr, "Thrusting")
} }
#' TickAggregator indicator #' Aggregate trade ticks into time-bucketed candles
#'
#' Builds OHLCV candles from a stream of trade ticks. Feed ticks with [push()],
#' which returns the candles closed by that tick.
#'
#' @param bucket Time-bucket width, in the same unit as the tick timestamps.
#' @param gap_fill Logical; if `TRUE`, empty buckets with no trades are still
#' emitted (carried forward) instead of skipped.
#' @return A `wickra_indicator` tick aggregator; feed it ticks with [push()].
#' @keywords internal #' @keywords internal
#' @export #' @export
TickAggregator <- function(bucket, gap_fill) { TickAggregator <- function(bucket, gap_fill) {
@@ -4151,6 +4173,13 @@ Zlema <- function(period) {
#' 15 = 1M). `base_url` overrides the endpoint (`NULL` = production). Not #' 15 = 1M). `base_url` overrides the endpoint (`NULL` = production). Not
#' available in the wasm (r-universe/webR) build, which has no raw sockets. #' available in the wasm (r-universe/webR) build, which has no raw sockets.
#' #'
#' @param symbols Comma-separated trading symbols (case-insensitive), e.g.
#' `"btcusdt,ethusdt"`.
#' @param interval Integer interval code `0:15` (`0` = 1s, `1` = 1m, ...,
#' `12` = 1d, `13` = 3d, `14` = 1w, `15` = 1M).
#' @param base_url Optional endpoint override; `NULL` uses production.
#' @return A `wickra_binance_feed`; poll it with [binance_next()] and close it
#' with [binance_close()].
#' @keywords internal #' @keywords internal
#' @export #' @export
BinanceFeed <- function(symbols, interval, base_url = NULL) { BinanceFeed <- function(symbols, interval, base_url = NULL) {
@@ -4165,6 +4194,10 @@ BinanceFeed <- function(symbols, interval, base_url = NULL) {
#' `high`, `low`, `close`, `volume`, `open_time`, `is_closed`) when an event #' `high`, `low`, `close`, `volume`, `open_time`, `is_closed`) when an event
#' arrives, or `NULL` on timeout. Errors once the stream is closed. #' arrives, or `NULL` on timeout. Errors once the stream is closed.
#' #'
#' @param feed A `wickra_binance_feed` created by [BinanceFeed()].
#' @param timeout_ms Poll timeout in milliseconds.
#' @return A named list (`symbol`, `open`, `high`, `low`, `close`, `volume`,
#' `open_time`, `is_closed`) for an event, or `NULL` on timeout.
#' @keywords internal #' @keywords internal
#' @export #' @export
binance_next <- function(feed, timeout_ms = 1000) { binance_next <- function(feed, timeout_ms = 1000) {
@@ -4173,6 +4206,8 @@ binance_next <- function(feed, timeout_ms = 1000) {
#' Close a Binance feed #' Close a Binance feed
#' #'
#' @param feed A `wickra_binance_feed` created by [BinanceFeed()].
#' @return `NULL`, invisibly.
#' @keywords internal #' @keywords internal
#' @export #' @export
binance_close <- function(feed) { binance_close <- function(feed) {
@@ -4190,6 +4225,14 @@ binance_close <- function(feed) {
#' `volume`, `timestamp`. Blocks until the response arrives. Not available in the #' `volume`, `timestamp`. Blocks until the response arrives. Not available in the
#' wasm (r-universe/webR) build, which has no raw sockets. #' wasm (r-universe/webR) build, which has no raw sockets.
#' #'
#' @param symbol Trading symbol (case-insensitive), e.g. `"btcusdt"`.
#' @param interval Integer interval code `0:15` (see [BinanceFeed()]).
#' @param limit Number of klines to fetch (`1:1000`).
#' @param start_ms,end_ms Optional inclusive Unix-millisecond bounds; a negative
#' value means unset.
#' @param base_url Optional host override; `NULL` uses production.
#' @return An `n x 6` numeric matrix with columns `open`, `high`, `low`,
#' `close`, `volume`, `timestamp`.
#' @keywords internal #' @keywords internal
#' @export #' @export
fetch_binance_klines <- function(symbol, interval, limit, start_ms = -1, fetch_binance_klines <- function(symbol, interval, limit, start_ms = -1,
+1 -1
View File
@@ -151,7 +151,7 @@ name.wickra_indicator <- function(object) {
#' @param timestamp Trade timestamp, in the same unit as the aggregator bucket. #' @param timestamp Trade timestamp, in the same unit as the aggregator bucket.
#' @return A numeric matrix with six named columns (possibly zero rows). #' @return A numeric matrix with six named columns (possibly zero rows).
#' @examples #' @examples
#' agg <- TickAggregator(1000) #' agg <- TickAggregator(1000, FALSE)
#' push(agg, 100, 1, 0) #' push(agg, 100, 1, 0)
#' push(agg, 102, 1, 1000) # closes the first bucket #' push(agg, 102, 1, 1000) # closes the first bucket
#' @export #' @export
+1 -1
View File
@@ -4,7 +4,7 @@
\alias{AwesomeOscillatorHistogram} \alias{AwesomeOscillatorHistogram}
\title{AwesomeOscillatorHistogram indicator} \title{AwesomeOscillatorHistogram indicator}
\usage{ \usage{
AwesomeOscillatorHistogram(fast, slow, sma_period) AwesomeOscillatorHistogram(fast, slow, lookback)
} }
\description{ \description{
AwesomeOscillatorHistogram indicator AwesomeOscillatorHistogram indicator
+29
View File
@@ -0,0 +1,29 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/indicators.R
\name{BinanceFeed}
\alias{BinanceFeed}
\title{Connect to a live Binance kline feed}
\usage{
BinanceFeed(symbols, interval, base_url = NULL)
}
\arguments{
\item{symbols}{Comma-separated trading symbols (case-insensitive), e.g.
\code{"btcusdt,ethusdt"}.}
\item{interval}{Integer interval code \code{0:15} (\code{0} = 1s, \code{1} = 1m, ...,
\code{12} = 1d, \code{13} = 3d, \code{14} = 1w, \code{15} = 1M).}
\item{base_url}{Optional endpoint override; \code{NULL} uses production.}
}
\value{
A \code{wickra_binance_feed}; poll it with \code{\link[=binance_next]{binance_next()}} and close it
with \code{\link[=binance_close]{binance_close()}}.
}
\description{
Opens a live Binance kline stream for one or more comma-separated \code{symbols}
(case-insensitive) at the given \code{interval} code (an integer \code{0:15}, the same
order as the other bindings: 0 = 1s, 1 = 1m, ... 12 = 1d, 13 = 3d, 14 = 1w,
15 = 1M). \code{base_url} overrides the endpoint (\code{NULL} = production). Not
available in the wasm (r-universe/webR) build, which has no raw sockets.
}
\keyword{internal}
+20
View File
@@ -0,0 +1,20 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/indicators.R
\name{CandleReader}
\alias{CandleReader}
\title{Parse OHLCV candles from a CSV string}
\usage{
CandleReader(csv)
}
\arguments{
\item{csv}{A length-one character string of CSV text (a header row followed
by OHLCV data rows).}
}
\value{
A \code{wickra_indicator} candle reader; read its candles with \code{\link[=read]{read()}}.
}
\description{
Builds a reader over an in-memory CSV string with a header row and OHLCV
columns. Pass the result to \code{\link[=read]{read()}} to get every parsed candle.
}
\keyword{internal}
+20
View File
@@ -0,0 +1,20 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/indicators.R
\name{Resampler}
\alias{Resampler}
\title{Resample candles to a higher timeframe}
\usage{
Resampler(timeframe)
}
\arguments{
\item{timeframe}{Integer number of input candles per higher-timeframe bar.}
}
\value{
A \code{wickra_indicator} resampler.
}
\description{
Aggregates a stream of candles into higher-timeframe bars. Feed candles with
\code{\link[=update]{update()}} (it returns a completed higher-timeframe bar, or \code{NULL} while the
current bar is still open) and emit the final, still-open bar with \code{\link[=flush]{flush()}}.
}
\keyword{internal}
+22
View File
@@ -0,0 +1,22 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/indicators.R
\name{TickAggregator}
\alias{TickAggregator}
\title{Aggregate trade ticks into time-bucketed candles}
\usage{
TickAggregator(bucket, gap_fill)
}
\arguments{
\item{bucket}{Time-bucket width, in the same unit as the tick timestamps.}
\item{gap_fill}{Logical; if \code{TRUE}, empty buckets with no trades are still
emitted (carried forward) instead of skipped.}
}
\value{
A \code{wickra_indicator} tick aggregator; feed it ticks with \code{\link[=push]{push()}}.
}
\description{
Builds OHLCV candles from a stream of trade ticks. Feed ticks with \code{\link[=push]{push()}},
which returns the candles closed by that tick.
}
\keyword{internal}
+18
View File
@@ -0,0 +1,18 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/indicators.R
\name{binance_close}
\alias{binance_close}
\title{Close a Binance feed}
\usage{
binance_close(feed)
}
\arguments{
\item{feed}{A \code{wickra_binance_feed} created by \code{\link[=BinanceFeed]{BinanceFeed()}}.}
}
\value{
\code{NULL}, invisibly.
}
\description{
Close a Binance feed
}
\keyword{internal}
+23
View File
@@ -0,0 +1,23 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/indicators.R
\name{binance_next}
\alias{binance_next}
\title{Poll a Binance feed for the next kline event}
\usage{
binance_next(feed, timeout_ms = 1000)
}
\arguments{
\item{feed}{A \code{wickra_binance_feed} created by \code{\link[=BinanceFeed]{BinanceFeed()}}.}
\item{timeout_ms}{Poll timeout in milliseconds.}
}
\value{
A named list (\code{symbol}, \code{open}, \code{high}, \code{low}, \code{close}, \code{volume},
\code{open_time}, \code{is_closed}) for an event, or \code{NULL} on timeout.
}
\description{
Waits up to \code{timeout_ms} milliseconds. Returns a named list (\code{symbol}, \code{open},
\code{high}, \code{low}, \code{close}, \code{volume}, \code{open_time}, \code{is_closed}) when an event
arrives, or \code{NULL} on timeout. Errors once the stream is closed.
}
\keyword{internal}
+41
View File
@@ -0,0 +1,41 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/indicators.R
\name{fetch_binance_klines}
\alias{fetch_binance_klines}
\title{Fetch historical Binance klines over REST}
\usage{
fetch_binance_klines(
symbol,
interval,
limit,
start_ms = -1,
end_ms = -1,
base_url = NULL
)
}
\arguments{
\item{symbol}{Trading symbol (case-insensitive), e.g. \code{"btcusdt"}.}
\item{interval}{Integer interval code \code{0:15} (see \code{\link[=BinanceFeed]{BinanceFeed()}}).}
\item{limit}{Number of klines to fetch (\code{1:1000}).}
\item{start_ms, end_ms}{Optional inclusive Unix-millisecond bounds; a negative
value means unset.}
\item{base_url}{Optional host override; \code{NULL} uses production.}
}
\value{
An \verb{n x 6} numeric matrix with columns \code{open}, \code{high}, \code{low},
\code{close}, \code{volume}, \code{timestamp}.
}
\description{
Downloads up to \code{limit} (\code{1:1000}) historical klines for \code{symbol} at the given
\code{interval} code (an integer \code{0:15}, the same order as the other bindings).
\code{start_ms}/\code{end_ms} are optional inclusive Unix-millisecond bounds (a negative
value means unset); \code{base_url} overrides the host (\code{NULL} = production). Returns
an \verb{n x 6} numeric matrix with columns \code{open}, \code{high}, \code{low}, \code{close},
\code{volume}, \code{timestamp}. Blocks until the response arrives. Not available in the
wasm (r-universe/webR) build, which has no raw sockets.
}
\keyword{internal}
+25
View File
@@ -0,0 +1,25 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/methods.R
\name{flush.wickra_indicator}
\alias{flush.wickra_indicator}
\title{Flush a resampler's final candle}
\usage{
\method{flush}{wickra_indicator}(con)
}
\arguments{
\item{con}{A \code{wickra_indicator} created by \code{\link[=Resampler]{Resampler()}}.}
}
\value{
A named numeric vector (\code{open}, \code{high}, \code{low}, \code{close}, \code{volume},
\code{timestamp}), or \code{NULL} if nothing is pending.
}
\description{
Emit the final, still-open candle a \code{\link[=Resampler]{Resampler()}} is aggregating (the partial
higher-timeframe bar that no later input has closed yet). Extends the base
generic \code{\link[base:flush]{base::flush()}}.
}
\examples{
r <- Resampler(5)
for (t in 0:6) update(r, 100 + t, 101 + t, 99 + t, 100 + t, 10, t)
flush(r)
}
+26
View File
@@ -0,0 +1,26 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/methods.R
\name{is_ready}
\alias{is_ready}
\alias{is_ready.wickra_indicator}
\title{Whether an indicator has consumed enough input to emit a value}
\usage{
is_ready(object)
\method{is_ready}{wickra_indicator}(object)
}
\arguments{
\item{object}{A \code{wickra_indicator}.}
}
\value{
A single logical.
}
\description{
Not available for the alt-chart bar builders, which have no warmup.
}
\examples{
sma <- Sma(3)
is_ready(sma) # FALSE
for (x in c(1, 2, 3)) update(sma, x)
is_ready(sma) # TRUE
}
+24
View File
@@ -0,0 +1,24 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/methods.R
\name{name}
\alias{name}
\alias{name.wickra_indicator}
\title{Canonical name of an indicator}
\usage{
name(object)
\method{name}{wickra_indicator}(object)
}
\arguments{
\item{object}{A \code{wickra_indicator}.}
}
\value{
A single character string.
}
\description{
Returns the stable, human-readable name of the indicator (the same name
reported by every other Wickra binding), e.g. \code{"SMA"} for \code{\link[=Sma]{Sma()}}.
}
\examples{
name(Sma(14)) # "SMA"
}
+33
View File
@@ -0,0 +1,33 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/methods.R
\name{push}
\alias{push}
\alias{push.wickra_indicator}
\title{Push a trade tick into a tick aggregator}
\usage{
push(object, price, size, timestamp)
\method{push}{wickra_indicator}(object, price, size, timestamp)
}
\arguments{
\item{object}{A \code{wickra_indicator} created by \code{\link[=TickAggregator]{TickAggregator()}}.}
\item{price}{Trade price.}
\item{size}{Trade size (volume).}
\item{timestamp}{Trade timestamp, in the same unit as the aggregator bucket.}
}
\value{
A numeric matrix with six named columns (possibly zero rows).
}
\description{
Feeds one trade tick to a \code{\link[=TickAggregator]{TickAggregator()}} and returns the candles it
closed as a numeric matrix with columns \code{open}, \code{high}, \code{low}, \code{close},
\code{volume}, \code{timestamp} (zero rows while the open bar merely grows).
}
\examples{
agg <- TickAggregator(1000, FALSE)
push(agg, 100, 1, 0)
push(agg, 102, 1, 1000) # closes the first bucket
}
+25
View File
@@ -0,0 +1,25 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/methods.R
\name{read}
\alias{read}
\alias{read.wickra_indicator}
\title{Read every candle parsed by a CSV candle reader}
\usage{
read(object)
\method{read}{wickra_indicator}(object)
}
\arguments{
\item{object}{A \code{wickra_indicator} created by \code{\link[=CandleReader]{CandleReader()}}.}
}
\value{
A numeric matrix with six named columns (zero rows for an empty CSV).
}
\description{
Returns all the candles a \code{\link[=CandleReader]{CandleReader()}} parsed from its CSV, as a numeric
matrix with columns \code{open}, \code{high}, \code{low}, \code{close}, \code{volume}, \code{timestamp}.
}
\examples{
r <- CandleReader("timestamp,open,high,low,close,volume\n0,100,101,99,100.5,10\n")
read(r)
}
+6 -6
View File
@@ -7,12 +7,12 @@
\format{ \format{
A data frame with 250 rows and 6 columns: A data frame with 250 rows and 6 columns:
\describe{ \describe{
\item{date}{Trading date (\code{Date}).} \item{date}{Trading date (\code{Date}).}
\item{open}{Opening price.} \item{open}{Opening price.}
\item{high}{Session high.} \item{high}{Session high.}
\item{low}{Session low.} \item{low}{Session low.}
\item{close}{Closing price.} \item{close}{Closing price.}
\item{volume}{Traded volume.} \item{volume}{Traded volume.}
} }
} }
\usage{ \usage{
+24
View File
@@ -0,0 +1,24 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/methods.R
\name{warmup_period}
\alias{warmup_period}
\alias{warmup_period.wickra_indicator}
\title{Number of updates an indicator needs before it produces a value}
\usage{
warmup_period(object)
\method{warmup_period}{wickra_indicator}(object)
}
\arguments{
\item{object}{A \code{wickra_indicator}.}
}
\value{
A single integer: the warmup period.
}
\description{
Not available for the alt-chart bar builders (\code{\link[=RenkoBars]{RenkoBars()}}, \code{\link[=KagiBars]{KagiBars()}},
\code{\link[=PointAndFigureBars]{PointAndFigureBars()}}, …), which have no warmup.
}
\examples{
warmup_period(Sma(14)) # 14
}
+1
View File
@@ -18,6 +18,7 @@ Useful links:
\itemize{ \itemize{
\item \url{https://github.com/wickra-lib/wickra} \item \url{https://github.com/wickra-lib/wickra}
\item \url{https://docs.wickra.org} \item \url{https://docs.wickra.org}
\item \url{https://wickra-lib.r-universe.dev}
\item Report bugs at \url{https://github.com/wickra-lib/wickra/issues} \item Report bugs at \url{https://github.com/wickra-lib/wickra/issues}
} }
+2 -2
View File
@@ -6,7 +6,7 @@
<groupId>org.wickra.examples</groupId> <groupId>org.wickra.examples</groupId>
<artifactId>wickra-examples</artifactId> <artifactId>wickra-examples</artifactId>
<version>0.9.5</version> <version>0.9.6</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Wickra Java examples</name> <name>Wickra Java examples</name>
@@ -21,7 +21,7 @@
<dependency> <dependency>
<groupId>org.wickra</groupId> <groupId>org.wickra</groupId>
<artifactId>wickra</artifactId> <artifactId>wickra</artifactId>
<version>0.9.5</version> <version>0.9.6</version>
</dependency> </dependency>
</dependencies> </dependencies>
+7 -7
View File
@@ -14,7 +14,7 @@
}, },
"../../bindings/node": { "../../bindings/node": {
"name": "wickra", "name": "wickra",
"version": "0.9.5", "version": "0.9.6",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"devDependencies": { "devDependencies": {
"@napi-rs/cli": "^2.18.0" "@napi-rs/cli": "^2.18.0"
@@ -23,12 +23,12 @@
"node": ">= 20" "node": ">= 20"
}, },
"optionalDependencies": { "optionalDependencies": {
"wickra-darwin-arm64": "0.9.5", "wickra-darwin-arm64": "0.9.6",
"wickra-darwin-x64": "0.9.5", "wickra-darwin-x64": "0.9.6",
"wickra-linux-arm64-gnu": "0.9.5", "wickra-linux-arm64-gnu": "0.9.6",
"wickra-linux-x64-gnu": "0.9.5", "wickra-linux-x64-gnu": "0.9.6",
"wickra-win32-arm64-msvc": "0.9.5", "wickra-win32-arm64-msvc": "0.9.6",
"wickra-win32-x64-msvc": "0.9.5" "wickra-win32-x64-msvc": "0.9.6"
} }
}, },
"node_modules/wickra": { "node_modules/wickra": {