Compare commits

...
10 Commits
Author SHA1 Message Date
kingchencandGitHub a3950bf31b release: bump 0.9.0 -> 0.9.1 (#299) 2026-06-14 02:42:45 +02:00
kingchencandGitHub a0a7bc4e62 docs(readme): add a Requirements section with per-language supported versions (#298)
There was no single place listing the minimum supported version per language.
Add a Requirements table after Languages (Rust 1.86, Python 3.9, Node 20, WASM,
C99, C++14, .NET 8, Go 1.23, Java 22, R >= 2.10) linking to the full
Requirements page in the docs.
2026-06-14 01:09:02 +02:00
kingchencandGitHub 0c925aa9d5 feat(c-abi): expose warmup_period / is_ready across the C ABI bindings (#297)
* feat(c-abi): expose warmup_period / is_ready across the C ABI bindings

The C ABI hub exposed new/update/batch/reset/free per indicator but not the
Indicator::warmup_period / is_ready queries that the native (Python/Node/WASM)
bindings already had, so C/C#/Go/Java/R callers could not ask an indicator
whether it was warmed up without feeding it and watching for NaN.

Regenerated from the ScriptHelpers capi + language generators:
- bindings/c: wickra_<ind>_warmup_period (size_t) and wickra_<ind>_is_ready
  (bool) for every indicator (504; the 10 alt-chart bar builders are excluded
  by design). wickra.h regenerated via cbindgen (additive only).
- bindings/csharp: int WarmupPeriod() / bool IsReady() on each wrapper.
- bindings/go: WarmupPeriod() int / IsReady() bool.
- bindings/java: int warmupPeriod() / boolean isReady().
- bindings/r: C glue + registration; hand-written warmup_period() / is_ready()
  S3 generics in methods.R, plus NAMESPACE exports.

Tests: C-ABI Rust unit tests, the C examples/archetypes.c suite, and the C#,
Go, Java and R archetype suites all gain a warmup/is_ready transition check.

* build(go): sync vendored wickra.h with the C ABI header

The Go binding vendors bindings/c/include/wickra.h; refresh it with the new
warmup_period / is_ready declarations so the CI sync check passes.
2026-06-14 01:04:06 +02:00
kingchencandGitHub d9e6807ca0 fix: correct RelativeStrengthAB binding wrapper casing (#296)
The WASM and Node binding wrappers were named with the lowercase-b acronym
(WasmRelativeStrengthAb, RelativeStrengthAbNode) while the core type and every
other surface use RelativeStrengthAB. The published JS/WASM class name was
already correct via js_name/js_class, so this only aligns the internal Rust
identifiers and the auto-generated TypeScript type alias
(RelativeStrengthAbNode -> RelativeStrengthABNode). Runtime API unchanged.
2026-06-14 00:50:03 +02:00
kingchencandGitHub eb50ae4e90 deps(python): upgrade pyo3 + rust-numpy to 0.29, clear 2 advisories (#295)
rust-numpy 0.29 lifted its pyo3 ^0.28 pin, so the resolver can now select
pyo3 0.29. Bump both (kept as a pair) and drop the temporary not-affected
exceptions for RUSTSEC-2026-0176 and RUSTSEC-2026-0177 from deny.toml and
osv-scanner.toml — pyo3 0.29 fixes both advisories.

No public API change; the Python test suite passes unchanged (957 tests).
2026-06-14 00:36:52 +02:00
kingchencandGitHub 4a12f60a88 ci: test the Node binding on the 22/24 LTS (18/20 are EOL) (#294)
* ci: test the Node binding on the 22/24 LTS (18/20 are EOL)

Node 18 is EOL and 20 reaches EOL; move the binding CI matrix from [18, 20]
to [22, 24] (both LTS), bump the fixed Node setups in ci.yml/release.yml to 22,
and raise package.json engines to >= 20.

The N-API 8 binary is ABI-stable across Node versions, so no per-version build
is needed. The `npm test` script (`node --test __tests__/`) breaks on Node 22
— it resolves `__tests__` as a module — so switch to `node --test` (auto-
discovery). Verified locally on Node 22: build + 584 tests green.

* build(node): sync package-lock engines.node to >= 20

* ci(node): drop the __tests__/ path arg so node --test auto-discovers

On Node 22+, `node --test __tests__/` resolves the directory as a single
module and fails with one unrunnable subtest. `node --test` (no path)
auto-discovers every *.test.js under the package, matching the package.json
test script. Verified locally: 584 tests pass.
2026-06-14 00:23:36 +02:00
kingchencandGitHub 8003572d92 docs(core): add runnable rustdoc examples to 23 indicators (#293)
The fib_* / auto_fib / golden_pocket Fibonacci indicators, the harami_cross /
tristar / tower_top_bottom candlestick patterns and the td_* DeMark family
lacked the `/// # Example` runnable doctest that ARCHITECTURE.md requires of
every indicator. Add a minimal construct-and-feed example to each. The
swing-tracker helper `pattern_swing` is not an `Indicator` and is left out.
All 23 pass `cargo test --doc` (487 doctests green).
2026-06-14 00:09:07 +02:00
kingchencandGitHub db5bd5e028 ci: build the Java binding on JDK 25 LTS (22 is EOL) (#292)
Java 22 is a non-LTS that has reached end of life; bump the build JDK in
ci.yml and release.yml to the 25 LTS. The pom pins `maven.compiler.release`
to 22, so the emitted bytecode and the Java 22+ runtime floor (FFM API, final
since 22) are unchanged. Not 21 — FFM was only preview there.
2026-06-13 23:55:49 +02:00
kingchencandGitHub 2ef60874b9 fix(examples): satisfy clippy -D warnings in gen_golden (#291)
Replace `i as i64` with `i64::try_from(i)` (cast_possible_wrap) and rename
the OHLCV destructure to descriptive names (many_single_char_names) so
`cargo clippy --all-targets --all-features -- -D warnings` passes on the 1.95
toolchain. Dev-tool only; no library change.
2026-06-13 23:35:29 +02:00
kingchencandGitHub d59cd44043 docs: standardise language naming + binding security sections (#290)
* docs: standardise language naming and add binding security sections

Canonical binding list everywhere: Rust, Python, Node.js, WASM, C, C++, C#,
Go, Java, R. Use C# (not .NET) as the language label, WASM (not WebAssembly)
in prose, and frame the C ABI as a hub rather than a list item.

- Bump stale indicator counts (200+ -> 514) and family count (sixteen ->
  twenty-four) in the Node/Python/WASM and docs READMEs.
- Add a short Security section to all eight binding READMEs.
- Relabel benchmark rows (C -> C / C++, C# / .NET -> C#).
- Fix the 'language stecker' wording in the C#/Go/R API intros.
- Documentation only; no code or public API changes.

* release.yml: extend install snippets and expose version output

Add the missing registry installs to the release body (dotnet, go, Gradle/
Maven Central, r-universe) alongside cargo/pip/npm, and expose a v-stripped
'version' output from the tag step for the Gradle coordinate. Also fix the
C-ABI language order in the assets note (C# before Go).

* release.yml: correct the release body (10 languages, all registries)

Reframe the tagline to '10 languages' (native Rust/Python/Node.js/WASM + a C
ABI hub for C, C++, C#, Go, Java, R) instead of '4 language registries', note
that C#/Java/Go/R publish to NuGet/Maven/Go/r-universe via their own jobs, and
tidy the Node.js label and the C-ABI hub list.
2026-06-13 23:34:24 +02:00
594 changed files with 55448 additions and 280 deletions
+2 -2
View File
@@ -30,9 +30,9 @@ assignees: ""
## Environment ## Environment
- Wickra version: - Wickra version:
- Language / binding: <!-- Rust crate / Python / Node / WASM / C ABI / C# (.NET) / Go / Java / R --> - Language / binding: <!-- Rust crate / Python / Node.js / WASM / C / C++ / C# / Go / Java / R -->
- OS and architecture: - OS and architecture:
- Rust / Python / Node / .NET version (If relevant): - Rust / Python / Node.js / .NET version (If relevant):
## Additional context ## Additional context
@@ -15,9 +15,9 @@ assignees: []
- [ ] Rust crate (`wickra`) - [ ] Rust crate (`wickra`)
- [ ] Python (`pip install wickra`) - [ ] Python (`pip install wickra`)
- [ ] Node.js (`npm install wickra`) - [ ] Node.js (`npm install wickra`)
- [ ] WebAssembly - [ ] WASM
- [ ] C ABI (`bindings/c`) - [ ] C ABI (`bindings/c`)
- [ ] C# / .NET (`Wickra` on NuGet) - [ ] C# (`Wickra` on NuGet)
- [ ] Go (`bindings/go`) - [ ] Go (`bindings/go`)
- [ ] Java (`org.wickra:wickra` on Maven Central) - [ ] Java (`org.wickra:wickra` on Maven Central)
- [ ] R (`bindings/r`) - [ ] R (`bindings/r`)
@@ -31,7 +31,7 @@ assignees: []
| Binding version | `e.g. python 0.4.2 / node 0.4.2` | | Binding version | `e.g. python 0.4.2 / node 0.4.2` |
| OS / arch | `e.g. Windows 11 x86_64, Linux glibc` | | OS / arch | `e.g. Windows 11 x86_64, Linux glibc` |
| Rust toolchain | `rustc --version` (If building from source) | | Rust toolchain | `rustc --version` (If building from source) |
| Python / Node / .NET version | `python --version` / `node --version` / `dotnet --version` | | Python / Node.js / .NET version | `python --version` / `node --version` / `dotnet --version` |
## Minimal reproducer ## Minimal reproducer
+1 -1
View File
@@ -26,7 +26,7 @@ assignees: ""
- [ ] Should be exposed in the Node binding - [ ] Should be exposed in the Node binding
- [ ] Should be exposed in the WASM binding - [ ] Should be exposed in the WASM binding
- [ ] Should be exposed in the C ABI - [ ] Should be exposed in the C ABI
- [ ] Should be exposed in the C# / .NET binding - [ ] Should be exposed in the C# binding
- [ ] Should be exposed in the Go binding - [ ] Should be exposed in the Go binding
- [ ] Should be exposed in the Java binding - [ ] Should be exposed in the Java binding
- [ ] Should be exposed in the R binding - [ ] Should be exposed in the R binding
@@ -13,7 +13,7 @@ assignees: []
## Affected code path ## Affected code path
- Indicator / API: `e.g. EMA.update` - Indicator / API: `e.g. EMA.update`
- Binding: `Rust / Python / Node / Wasm / C ABI / C# (.NET) / Go / Java / R` - Binding: `Rust / Python / Node.js / WASM / C / C++ / C# / Go / Java / R`
- Hot loop or one-shot call? - Hot loop or one-shot call?
## Versions compared ## Versions compared
+1 -1
View File
@@ -33,4 +33,4 @@ import wickra as ta
## Environment (Only if relevant) ## Environment (Only if relevant)
- Wickra version: `e.g. 0.4.2` - Wickra version: `e.g. 0.4.2`
- Binding: `Rust / Python / Node / Wasm / C ABI / C# (.NET) / Go / Java / R` - Binding: `Rust / Python / Node.js / WASM / C / C++ / C# / Go / Java / R`
+1 -1
View File
@@ -22,7 +22,7 @@
- [ ] `cargo clippy --workspace --all-targets -- -D warnings` is clean. - [ ] `cargo clippy --workspace --all-targets -- -D warnings` is clean.
- [ ] `cargo test --workspace` passes. - [ ] `cargo test --workspace` passes.
- [ ] New behaviour has tests; bug fixes have a regression test. - [ ] New behaviour has tests; bug fixes have a regression test.
- [ ] Public API changes are mirrored in the Python / Node / WASM bindings, and the C ABI + C# + Go + Java + R bindings are regenerated - [ ] Public API changes are mirrored in the Python / Node.js / WASM bindings, and the C ABI + C# + Go + Java + R bindings are regenerated
and their type stubs (If applicable). and their type stubs (If applicable).
- [ ] The relevant page on the [documentation site](https://docs.wickra.org) - [ ] The relevant page on the [documentation site](https://docs.wickra.org)
and the `README.md` are updated (If applicable). Docs edits go to a and the `README.md` are updated (If applicable). Docs edits go to a
+2 -2
View File
@@ -22,9 +22,9 @@ Please fill in the sections below. Delete any that don't apply.
- [ ] Rust crate (`crates/wickra`) - [ ] Rust crate (`crates/wickra`)
- [ ] Python binding (`bindings/python`) - [ ] Python binding (`bindings/python`)
- [ ] Node.js binding (`bindings/node`) - [ ] Node.js binding (`bindings/node`)
- [ ] WebAssembly binding (`bindings/wasm`) - [ ] WASM binding (`bindings/wasm`)
- [ ] C ABI (`bindings/c`) - [ ] C ABI (`bindings/c`)
- [ ] C# / .NET binding (`bindings/csharp`) - [ ] C# binding (`bindings/csharp`)
- [ ] Go binding (`bindings/go`) - [ ] Go binding (`bindings/go`)
- [ ] Java binding (`bindings/java`) - [ ] Java binding (`bindings/java`)
- [ ] R binding (`bindings/r`) - [ ] R binding (`bindings/r`)
+13 -12
View File
@@ -116,7 +116,7 @@ jobs:
continue-on-error: true continue-on-error: true
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
- name: Wait before Node retry - name: Wait before Node retry
if: steps.setup_node.outcome == 'failure' if: steps.setup_node.outcome == 'failure'
@@ -129,7 +129,7 @@ jobs:
if: steps.setup_node.outcome == 'failure' if: steps.setup_node.outcome == 'failure'
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
- name: Set up Python - name: Set up Python
id: setup_python id: setup_python
@@ -231,7 +231,7 @@ jobs:
continue-on-error: true continue-on-error: true
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
- name: Wait before Node retry - name: Wait before Node retry
if: steps.setup_node.outcome == 'failure' if: steps.setup_node.outcome == 'failure'
@@ -244,7 +244,7 @@ jobs:
if: steps.setup_node.outcome == 'failure' if: steps.setup_node.outcome == 'failure'
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
- name: Cache cargo - name: Cache cargo
uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
@@ -574,7 +574,7 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
node-version: ["18", "20"] node-version: ["22", "24"]
steps: steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with: with:
@@ -637,7 +637,7 @@ jobs:
with: with:
timeout_minutes: 6 timeout_minutes: 6
max_attempts: 2 max_attempts: 2
command: cd bindings/node && node --test __tests__/ command: cd bindings/node && node --test
shell: bash shell: bash
c-abi: c-abi:
@@ -975,18 +975,19 @@ jobs:
# The binding links the C ABI hub at runtime through the Java FFM API; build # The binding links the C ABI hub at runtime through the Java FFM API; build
# it first so WickraNative's development fallback finds # it first so WickraNative's development fallback finds
# target/release/wickra.{so,dylib,dll}. JDK 22+ is required for the final FFM # target/release/wickra.{so,dylib,dll}. The FFM API is final since JDK 22; we
# API, so it is installed explicitly (runners ship 17/21). # build on the 25 LTS (22 is EOL; the pom pins bytecode to release 22 so the
# runtime floor stays Java 22). Installed explicitly (runners ship 17/21).
- name: Build the C ABI library - name: Build the C ABI library
run: cargo build -p wickra-c --release run: cargo build -p wickra-c --release
- name: Set up JDK 22 - name: Set up JDK 25
id: setup-java id: setup-java
continue-on-error: true continue-on-error: true
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
with: with:
distribution: temurin distribution: temurin
java-version: "22" java-version: "25"
cache: maven cache: maven
- name: Retry JDK setup (CDN flake) - name: Retry JDK setup (CDN flake)
@@ -996,12 +997,12 @@ jobs:
echo "::warning::setup-java failed (likely CDN flake), waiting 30s before retry..." echo "::warning::setup-java failed (likely CDN flake), waiting 30s before retry..."
sleep 30 sleep 30
- name: Set up JDK 22 (retry) - name: Set up JDK 25 (retry)
if: steps.setup-java.outcome == 'failure' if: steps.setup-java.outcome == 'failure'
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
with: with:
distribution: temurin distribution: temurin
java-version: "22" java-version: "25"
cache: maven cache: maven
- name: Java info - name: Java info
+31 -13
View File
@@ -258,7 +258,7 @@ jobs:
continue-on-error: true continue-on-error: true
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
- name: Wait before Node retry - name: Wait before Node retry
if: steps.setup_node.outcome == 'failure' if: steps.setup_node.outcome == 'failure'
@@ -271,7 +271,7 @@ jobs:
if: steps.setup_node.outcome == 'failure' if: steps.setup_node.outcome == 'failure'
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable branch, 2026-03-27 - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable branch, 2026-03-27
with: with:
@@ -319,7 +319,7 @@ jobs:
continue-on-error: true continue-on-error: true
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
registry-url: "https://registry.npmjs.org" registry-url: "https://registry.npmjs.org"
- name: Wait before Node retry - name: Wait before Node retry
@@ -333,7 +333,7 @@ jobs:
if: steps.setup_node.outcome == 'failure' if: steps.setup_node.outcome == 'failure'
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
registry-url: "https://registry.npmjs.org" registry-url: "https://registry.npmjs.org"
- name: Install Node deps - name: Install Node deps
@@ -488,7 +488,7 @@ jobs:
continue-on-error: true continue-on-error: true
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
registry-url: "https://registry.npmjs.org" registry-url: "https://registry.npmjs.org"
- name: Wait before Node retry - name: Wait before Node retry
@@ -502,7 +502,7 @@ jobs:
if: steps.setup_node.outcome == 'failure' if: steps.setup_node.outcome == 'failure'
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: "20" node-version: "22"
registry-url: "https://registry.npmjs.org" registry-url: "https://registry.npmjs.org"
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable branch, 2026-03-27 - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable branch, 2026-03-27
@@ -757,11 +757,11 @@ jobs:
# setup-java writes a settings.xml with the 'central' server credentials # setup-java writes a settings.xml with the 'central' server credentials
# (mapped from the env vars below) and imports the GPG signing key. # (mapped from the env vars below) and imports the GPG signing key.
- name: Set up JDK 22 + Maven Central credentials + GPG - name: Set up JDK 25 + Maven Central credentials + GPG
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
with: with:
distribution: temurin distribution: temurin
java-version: "22" java-version: "25"
server-id: central server-id: central
server-username: CENTRAL_USERNAME server-username: CENTRAL_USERNAME
server-password: CENTRAL_PASSWORD server-password: CENTRAL_PASSWORD
@@ -876,6 +876,7 @@ jobs:
# bundle to this same release without re-resolving it. # bundle to this same release without re-resolving it.
outputs: outputs:
tag: ${{ steps.tag.outputs.tag }} tag: ${{ steps.tag.outputs.tag }}
version: ${{ steps.tag.outputs.version }}
steps: steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with: with:
@@ -904,6 +905,7 @@ jobs:
exit 1 exit 1
fi fi
echo "tag=$tag" >> "$GITHUB_OUTPUT" echo "tag=$tag" >> "$GITHUB_OUTPUT"
echo "version=${tag#v}" >> "$GITHUB_OUTPUT"
echo "::notice::attaching assets to release $tag" echo "::notice::attaching assets to release $tag"
- name: Download all build artifacts - name: Download all build artifacts
@@ -941,7 +943,7 @@ jobs:
# the provenance bundle is attached (P24, immutability-ready). # the provenance bundle is attached (P24, immutability-ready).
draft: true draft: true
body: | body: |
Wickra ${{ github.ref_name }} — streaming-first technical indicators across 4 language registries plus a C ABI. Wickra ${{ github.ref_name }} — streaming-first technical indicators for 10 languages: native Rust, Python, Node.js, WASM plus a C ABI hub for C, C++, C#, Go, Java, R.
### Install ### Install
@@ -950,21 +952,37 @@ jobs:
pip install wickra pip install wickra
npm install wickra npm install wickra
npm install wickra-wasm npm install wickra-wasm
dotnet add package Wickra
go get github.com/wickra-lib/wickra-go
```
Java (Gradle, Maven Central):
```gradle
implementation("org.wickra:wickra:${{ steps.tag.outputs.version }}")
```
R (r-universe):
```r
install.packages("wickra", repos = "https://wickra-lib.r-universe.dev")
``` ```
### Attached assets ### Attached assets
Pre-built artefacts for every supported platform — the same files that Pre-built artefacts for every supported platform — the same files this
were uploaded to crates.io, PyPI, and npm by this workflow run. workflow run published to crates.io, PyPI, and npm. C# ships to NuGet,
Java to Maven Central, Go to the wickra-go module, and R to r-universe
via their own release jobs.
- `*.whl` / `wickra-*.tar.gz` — Python wheels + sdist (5 platforms, ABI3 ≥ 3.9) - `*.whl` / `wickra-*.tar.gz` — Python wheels + sdist (5 platforms, ABI3 ≥ 3.9)
- `wickra.*.node` — native Node bindings (linux-x64-gnu, darwin-x64, - `wickra.*.node` — native Node.js bindings (linux-x64-gnu, darwin-x64,
darwin-arm64, win32-x64-msvc) darwin-arm64, win32-x64-msvc)
- `wickra-*.tgz` — npm-pack tarballs (main package + per-platform subpackages + WASM) - `wickra-*.tgz` — npm-pack tarballs (main package + per-platform subpackages + WASM)
- `*.crate` — cargo source crates (wickra-core, wickra-data, wickra) - `*.crate` — cargo source crates (wickra-core, wickra-data, wickra)
- `wickra-c-<target>.tar.gz` — C ABI: `include/wickra.h` + `wickra.hpp` - `wickra-c-<target>.tar.gz` — C ABI: `include/wickra.h` + `wickra.hpp`
and the cdylib/staticlib per target (linux/macos/windows × x64/arm64), and the cdylib/staticlib per target (linux/macos/windows × x64/arm64),
the hub for C / C++ / Go / C# / Java / R the hub for C, C++, C#, Go, Java and R
### Auto-generated changelog ### Auto-generated changelog
+4 -4
View File
@@ -31,7 +31,7 @@ or replace lives behind a separate crate boundary.
┌────────────┼────────────┬────────────────┐ ┌────────────┼────────────┬────────────────┐
│ │ │ │ │ │ │ │
┌──▼───────┐ ┌──▼───────┐ ┌──▼───────────┐ ┌──▼──────────────────┐ ┌──▼───────┐ ┌──▼───────┐ ┌──▼───────────┐ ┌──▼──────────────────┐
│ Python │ │ Node │ │ WASM │ │ C ABI (cbindgen) │ │ Python │ │ Node.js │ │ WASM │ │ C ABI (cbindgen) │
│ (PyO3) │ │ (napi-rs)│ │(wasm-bindgen)│ │ cdylib + header │ │ (PyO3) │ │ (napi-rs)│ │(wasm-bindgen)│ │ cdylib + header │
└──────────┘ └──────────┘ └──────────────┘ └─────────┬───────────┘ └──────────┘ └──────────┘ └──────────────┘ └─────────┬───────────┘
│ linked by │ linked by
@@ -41,11 +41,11 @@ or replace lives behind a separate crate boundary.
└─────────────────────┘ └─────────────────────┘
``` ```
Python, Node and WASM are *native* Rust bindings (PyO3 / napi-rs / Python, Node.js and WASM are *native* Rust bindings (PyO3 / napi-rs /
wasm-bindgen). The C ABI is the *hub* every other C-capable language links wasm-bindgen). The C ABI is the *hub* every other C-capable language links
against: it builds to a `cdylib`/`staticlib` plus a generated `wickra.h`, and against: it builds to a `cdylib`/`staticlib` plus a generated `wickra.h`, and
downstream languages link that one artifact rather than each re-wrapping the downstream languages link that one artifact rather than each re-wrapping the
core. C and C++ link it directly; the **C# / .NET** binding (`bindings/csharp`, core. C and C++ link it directly; the **C#** binding (`bindings/csharp`,
on NuGet), the **Go** binding (`bindings/go`, cgo), the **R** binding on NuGet), the **Go** binding (`bindings/go`, cgo), the **R** binding
(`bindings/r`, `.Call`) and the **Java** binding (`bindings/java`, the Java FFM (`bindings/r`, `.Call`) and the **Java** binding (`bindings/java`, the Java FFM
API / Panama, on Maven Central) are all generated from `wickra.h`. API / Panama, on Maven Central) are all generated from `wickra.h`.
@@ -57,7 +57,7 @@ API / Panama, on Maven Central) are all generated from `wickra.h`.
| `wickra-data` | `crates/wickra-data` | CSV reader, tick aggregator, resampler, live exchange feeds (feature-gated) | `tokio`, `tokio-tungstenite` (live), `serde_json` | | `wickra-data` | `crates/wickra-data` | CSV reader, tick aggregator, resampler, live exchange feeds (feature-gated) | `tokio`, `tokio-tungstenite` (live), `serde_json` |
| `wickra-python` | `bindings/python` | `_wickra` PyO3 module + Python package | `pyo3`, `numpy`, depends on `wickra-core` | | `wickra-python` | `bindings/python` | `_wickra` PyO3 module + Python package | `pyo3`, `numpy`, depends on `wickra-core` |
| `wickra-node` | `bindings/node` | NAPI-RS native binding | `napi`, depends on `wickra-core` | | `wickra-node` | `bindings/node` | NAPI-RS native binding | `napi`, depends on `wickra-core` |
| `wickra-wasm` | `bindings/wasm` | WebAssembly binding | `wasm-bindgen`, depends on `wickra-core` | | `wickra-wasm` | `bindings/wasm` | WASM binding | `wasm-bindgen`, depends on `wickra-core` |
| `wickra-c` | `bindings/c` | C ABI hub — `cdylib`/`staticlib` + generated `wickra.h` (cbindgen) | depends on `wickra-core` | | `wickra-c` | `bindings/c` | C ABI hub — `cdylib`/`staticlib` + generated `wickra.h` (cbindgen) | depends on `wickra-core` |
| `wickra-examples` | `examples/rust` | runnable binary examples | depends on `wickra`, `wickra-data` | | `wickra-examples` | `examples/rust` | runnable binary examples | depends on `wickra`, `wickra-data` |
+6 -6
View File
@@ -98,8 +98,8 @@ python -m benchmarks.compare_libraries
## 3. Per-binding throughput — the cost of the boundary ## 3. Per-binding throughput — the cost of the boundary
The sections above compare Wickra against other libraries, which only exists for The sections above compare Wickra against other libraries, which only exists for
Python and Rust (there is no comparable streaming TA library for C, C#, Go, Java, Python and Rust (there is no comparable streaming TA library for C, C++, C#, Go, Java,
R or WebAssembly to benchmark against). Every binding calls the **same** Rust R or WASM to benchmark against). Every binding calls the **same** Rust
core, so these per-binding benchmarks are **not** a speed claim and **not** a core, so these per-binding benchmarks are **not** a speed claim and **not** a
cross-library ratio — they document the raw cost of crossing each language's FFI cross-library ratio — they document the raw cost of crossing each language's FFI
boundary, in million updates per second (Mupd/s). boundary, in million updates per second (Mupd/s).
@@ -127,12 +127,12 @@ AMD Ryzen 9 9950X):
| Target | streaming (Mupd/s) | batch (Mupd/s) | | Target | streaming (Mupd/s) | batch (Mupd/s) |
|----------------------|-------------------:|---------------:| |----------------------|-------------------:|---------------:|
| Rust core (no FFI) | 391 | 500 | | Rust core (no FFI) | 391 | 500 |
| C | 383 | 330 | | C / C++ | 383 | 330 |
| C# / .NET | 337 | 244 | | C# | 337 | 244 |
| Python | 33 | 488 | | Python | 33 | 488 |
| Java | 28 | 175 | | Java | 28 | 175 |
| Go | 24 | 400 | | Go | 24 | 400 |
| WebAssembly | 19 | 167 | | WASM | 19 | 167 |
| Node.js | 17 | 10 | | Node.js | 17 | 10 |
| R | 0.1 | 193 | | R | 0.1 | 193 |
@@ -160,7 +160,7 @@ node bindings/node/benchmarks/throughput.js # native napi-
cargo build -p wickra-c --release # the C ABI hub cargo build -p wickra-c --release # the C ABI hub
cmake -S bindings/c/benchmarks -B build/cbench && cmake --build build/cbench \ cmake -S bindings/c/benchmarks -B build/cbench && cmake --build build/cbench \
&& ./build/cbench/throughput # raw C ABI && ./build/cbench/throughput # raw C ABI
dotnet run -c Release --project bindings/csharp/benchmarks # C# / .NET (P/Invoke) dotnet run -c Release --project bindings/csharp/benchmarks # C# (P/Invoke)
( cd bindings/go/benchmarks && go run . ) # Go (cgo) ( cd bindings/go/benchmarks && go run . ) # Go (cgo)
mvn -q -f bindings/java install -DskipTests \ mvn -q -f bindings/java install -DskipTests \
&& mvn -q -f bindings/java/benchmarks exec:exec -Dexec.mainClass=org.wickra.benchmarks.Throughput && mvn -q -f bindings/java/benchmarks exec:exec -Dexec.mainClass=org.wickra.benchmarks.Throughput
+50 -1
View File
@@ -7,6 +7,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [0.9.1] - 2026-06-14
### Added
- C ABI hub: every indicator now exposes `wickra_<ind>_warmup_period` and
`wickra_<ind>_is_ready`, closing the gap with the native bindings (which
already had them). The C-ABI languages surface them idiomatically: C# `int
WarmupPeriod()` / `bool IsReady()`, Go `WarmupPeriod()` / `IsReady()`, Java
`int warmupPeriod()` / `boolean isReady()`, and R `warmup_period()` /
`is_ready()` generics. The alt-chart bar builders are excluded by design (a
candle can complete 0..n bars, so they have no warmup).
- Runnable rustdoc examples for 23 indicators that previously lacked one.
- A Requirements reference documenting the minimum supported version per
language — a new page in the documentation site plus README, marketing-site
and organization-profile sections.
### Changed
- Raised the minimum Node.js version to 20 — Node 18 reached end-of-life. The
prebuilt N-API addon is now tested on the active LTS lines (22 and 24).
- The Java binding now builds on the JDK 25 LTS in CI (JDK 22 reached
end-of-life); the published bytecode still targets Java 22, so the runtime
requirement is unchanged.
- Standardised programming-language naming and ordering across all docs, READMEs,
the documentation site, marketing site, organization profile and GitHub
repository descriptions. Canonical list:
`Rust, Python, Node.js, WASM, C, C++, C#, Go, Java, R`. Uses C# (not .NET) as
the language label, lists C and C++ separately, prefers `Node.js` and `WASM` in
prose, and frames the C ABI as a hub (`C ABI hub → …`) rather than a
language-list entry. Documentation only — no code or public API changes.
- Python binding: upgraded `pyo3` and `rust-numpy` from 0.28 to 0.29. No public
API changes; the full test suite passes unchanged.
### Fixed
- Corrected the internal casing of the `RelativeStrengthAB` binding wrappers,
which used `...Ab` (`WasmRelativeStrengthAb` in the WASM crate,
`RelativeStrengthAbNode` in the Node crate) while every other surface uses the
acronym `AB`. The published JS/WASM class name was already `RelativeStrengthAB`
(set via `js_name`/`js_class`), so the runtime API is unchanged; the only
visible change is the auto-generated TypeScript type alias, renamed
`RelativeStrengthAbNode``RelativeStrengthABNode` in `index.d.ts`.
### Security
- Resolved the pyo3 advisories RUSTSEC-2026-0176 (out-of-bounds read in
`PyList`/`PyTuple` `nth`/`nth_back`) and RUSTSEC-2026-0177 (missing `Sync`
bound on `PyCFunction::new_closure`) by upgrading to pyo3 0.29, which fixes
both. The upgrade was previously blocked upstream by rust-numpy 0.28 pinning
pyo3 `^0.28`; rust-numpy 0.29 lifts that pin. The not-affected exceptions are
removed from `deny.toml` and `osv-scanner.toml`.
## [0.9.0] - 2026-06-13 ## [0.9.0] - 2026-06-13
Maintenance release: Java build-dependency updates and CI/Dependabot Maintenance release: Java build-dependency updates and CI/Dependabot
@@ -1615,7 +1663,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.0...HEAD [Unreleased]: https://github.com/wickra-lib/wickra/compare/v0.9.1...HEAD
[0.9.1]: https://github.com/wickra-lib/wickra/compare/v0.9.0...v0.9.1
[0.9.0]: https://github.com/wickra-lib/wickra/compare/v0.8.9...v0.9.0 [0.9.0]: https://github.com/wickra-lib/wickra/compare/v0.8.9...v0.9.0
[0.8.9]: https://github.com/wickra-lib/wickra/compare/v0.8.8...v0.8.9 [0.8.9]: https://github.com/wickra-lib/wickra/compare/v0.8.8...v0.8.9
[0.8.8]: https://github.com/wickra-lib/wickra/compare/v0.8.7...v0.8.8 [0.8.8]: https://github.com/wickra-lib/wickra/compare/v0.8.7...v0.8.8
+2 -2
View File
@@ -22,7 +22,7 @@ licensed as above, without any additional terms or conditions.
| `bindings/node` | napi-rs bindings (`wickra` on npm). | | `bindings/node` | napi-rs bindings (`wickra` on npm). |
| `bindings/wasm` | wasm-bindgen bindings (`wickra-wasm` on npm). | | `bindings/wasm` | wasm-bindgen bindings (`wickra-wasm` on npm). |
| `bindings/c` | C ABI — `cdylib` + `staticlib` + generated `include/wickra.h`. The hub for C / C++ and any C-capable language. | | `bindings/c` | C ABI — `cdylib` + `staticlib` + generated `include/wickra.h`. The hub for C / C++ and any C-capable language. |
| `bindings/csharp` | .NET binding over the C ABI (`Wickra` on NuGet) — `[LibraryImport]` P/Invoke generated from `wickra.h`. | | `bindings/csharp` | C# binding over the C ABI (`Wickra` on NuGet) — `[LibraryImport]` P/Invoke generated from `wickra.h`. |
| `bindings/go` | Go binding over the C ABI via cgo (module tag `bindings/go/vX.Y.Z`) — wrappers generated from `wickra.h`. | | `bindings/go` | Go binding over the C ABI via cgo (module tag `bindings/go/vX.Y.Z`) — wrappers generated from `wickra.h`. |
| `bindings/r` | R binding over the C ABI via `.Call` (R package) — C glue + R wrappers generated from `wickra.h`. | | `bindings/r` | R binding over the C ABI via `.Call` (R package) — C glue + R wrappers generated from `wickra.h`. |
| `bindings/java` | Java binding over the C ABI via the FFM API (Panama, Maven Central) — wrappers generated from `wickra.h`. | | `bindings/java` | Java binding over the C ABI via the FFM API (Panama, Maven Central) — wrappers generated from `wickra.h`. |
@@ -107,7 +107,7 @@ installed. Dependabot also keeps the `.github/requirements` pins current.
- **Streaming parity.** An indicator's `batch` output must equal the sequence - **Streaming parity.** An indicator's `batch` output must equal the sequence
of `update` calls. of `update` calls.
- **Bindings.** A change to a public indicator API must be mirrored across the - **Bindings.** A change to a public indicator API must be mirrored across the
Python, Node, and WASM bindings, including their type stubs / `.d.ts`. The C ABI Python, Node.js, and WASM bindings, including their type stubs / `.d.ts`. The C ABI
(`bindings/c`) is generated from the core, so regenerate it from the core and (`bindings/c`) is generated from the core, so regenerate it from the core and
commit `src/lib.rs` + `include/wickra.h`. The C# binding (`bindings/csharp`) is commit `src/lib.rs` + `include/wickra.h`. The C# binding (`bindings/csharp`) is
generated from `wickra.h`, so regenerate and commit its `Generated/*.g.cs` too. generated from `wickra.h`, so regenerate and commit its `Generated/*.g.cs` too.
Generated
+21 -22
View File
@@ -945,9 +945,9 @@ dependencies = [
[[package]] [[package]]
name = "numpy" name = "numpy"
version = "0.28.0" version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "778da78c64ddc928ebf5ad9df5edf0789410ff3bdbf3619aed51cd789a6af1e2" checksum = "6a5b15d63a5ff39e378daed0e1340d3a5964703ea9712eb09a0dc66fade996f4"
dependencies = [ dependencies = [
"libc", "libc",
"ndarray", "ndarray",
@@ -1152,9 +1152,9 @@ dependencies = [
[[package]] [[package]]
name = "pyo3" name = "pyo3"
version = "0.28.3" version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
dependencies = [ dependencies = [
"libc", "libc",
"once_cell", "once_cell",
@@ -1166,18 +1166,18 @@ dependencies = [
[[package]] [[package]]
name = "pyo3-build-config" name = "pyo3-build-config"
version = "0.28.3" version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
dependencies = [ dependencies = [
"target-lexicon", "target-lexicon",
] ]
[[package]] [[package]]
name = "pyo3-ffi" name = "pyo3-ffi"
version = "0.28.3" version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
dependencies = [ dependencies = [
"libc", "libc",
"pyo3-build-config", "pyo3-build-config",
@@ -1185,9 +1185,9 @@ dependencies = [
[[package]] [[package]]
name = "pyo3-macros" name = "pyo3-macros"
version = "0.28.3" version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"pyo3-macros-backend", "pyo3-macros-backend",
@@ -1197,13 +1197,12 @@ dependencies = [
[[package]] [[package]]
name = "pyo3-macros-backend" name = "pyo3-macros-backend"
version = "0.28.3" version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
dependencies = [ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"pyo3-build-config",
"quote", "quote",
"syn", "syn",
] ]
@@ -1944,7 +1943,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra" name = "wickra"
version = "0.9.0" version = "0.9.1"
dependencies = [ dependencies = [
"approx", "approx",
"criterion", "criterion",
@@ -1955,7 +1954,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-bench" name = "wickra-bench"
version = "0.9.0" version = "0.9.1"
dependencies = [ dependencies = [
"criterion", "criterion",
"kand", "kand",
@@ -1967,14 +1966,14 @@ dependencies = [
[[package]] [[package]]
name = "wickra-c" name = "wickra-c"
version = "0.9.0" version = "0.9.1"
dependencies = [ dependencies = [
"wickra-core", "wickra-core",
] ]
[[package]] [[package]]
name = "wickra-core" name = "wickra-core"
version = "0.9.0" version = "0.9.1"
dependencies = [ dependencies = [
"approx", "approx",
"proptest", "proptest",
@@ -1984,7 +1983,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-data" name = "wickra-data"
version = "0.9.0" version = "0.9.1"
dependencies = [ dependencies = [
"approx", "approx",
"csv", "csv",
@@ -2001,7 +2000,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-examples" name = "wickra-examples"
version = "0.9.0" version = "0.9.1"
dependencies = [ dependencies = [
"serde_json", "serde_json",
"tokio", "tokio",
@@ -2011,7 +2010,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-node" name = "wickra-node"
version = "0.9.0" version = "0.9.1"
dependencies = [ dependencies = [
"napi", "napi",
"napi-build", "napi-build",
@@ -2021,7 +2020,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-python" name = "wickra-python"
version = "0.9.0" version = "0.9.1"
dependencies = [ dependencies = [
"numpy", "numpy",
"pyo3", "pyo3",
@@ -2030,7 +2029,7 @@ dependencies = [
[[package]] [[package]]
name = "wickra-wasm" name = "wickra-wasm"
version = "0.9.0" version = "0.9.1"
dependencies = [ dependencies = [
"console_error_panic_hook", "console_error_panic_hook",
"js-sys", "js-sys",
+4 -4
View File
@@ -14,7 +14,7 @@ members = [
exclude = ["fuzz"] exclude = ["fuzz"]
[workspace.package] [workspace.package]
version = "0.9.0" version = "0.9.1"
authors = ["kingchenc <support@wickra.org>"] authors = ["kingchenc <support@wickra.org>"]
edition = "2021" edition = "2021"
rust-version = "1.86" rust-version = "1.86"
@@ -26,7 +26,7 @@ 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.0" } wickra-core = { path = "crates/wickra-core", version = "0.9.1" }
thiserror = "2" thiserror = "2"
rayon = "1.10" rayon = "1.10"
@@ -37,8 +37,8 @@ approx = "0.5"
criterion = { version = "0.8", features = ["html_reports"] } criterion = { version = "0.8", features = ["html_reports"] }
# Python binding # Python binding
pyo3 = { version = "0.28", features = ["extension-module", "abi3-py39"] } pyo3 = { version = "0.29", features = ["extension-module", "abi3-py39"] }
numpy = "0.28" numpy = "0.29"
[workspace.lints.rust] [workspace.lints.rust]
unsafe_code = "forbid" unsafe_code = "forbid"
+31 -8
View File
@@ -22,8 +22,8 @@
**Streaming-first technical indicators. Install with `pip install wickra` — no system dependencies.** **Streaming-first technical indicators. Install with `pip install wickra` — no system dependencies.**
Wickra is a multi-language technical-analysis library with a Rust core and Wickra is a multi-language technical-analysis library with a Rust core and
native bindings for Python, Node.js and WebAssembly, plus a C ABI that C, C++, native bindings for Python, Node.js and WASM, plus a C ABI that C, C++,
C# / .NET, Go, Java, R and any other C-capable language links against. Every indicator is a C#, Go, Java, R and any other C-capable language links against. Every indicator is a
state machine that updates in O(1) per new data point, so live trading bots and state machine that updates in O(1) per new data point, so live trading bots and
historical backtests share the exact same implementation. historical backtests share the exact same implementation.
@@ -81,8 +81,8 @@ times to get there.
breadth, Renko/Kagi/Point&Figure bars, Ehlers DSP cycles, risk/performance breadth, Renko/Kagi/Point&Figure bars, Ehlers DSP cycles, risk/performance
metrics — every single one updating in **O(1) per tick**. TA-Lib ships ~150 and metrics — every single one updating in **O(1) per tick**. TA-Lib ships ~150 and
none of them stream. none of them stream.
- **One Rust core, five first-class targets.** Native **Python · Node.js · - **One Rust core, five first-class targets.** Native **Rust · Python · Node.js ·
WebAssembly · Rust** plus a **C ABI** for C / C++, C# / .NET, Go, Java, R and any other C-capable language — WASM** plus a **C ABI** for C, C++, C#, Go, Java, R and any other C-capable language —
identical math, identical results, zero per-language reimplementation and zero identical math, identical results, zero per-language reimplementation and zero
GIL bottleneck. GIL bottleneck.
- **Correct by construction, not by hope.** Every `update` validates its input, - **Correct by construction, not by hope.** Every `update` validates its input,
@@ -106,7 +106,7 @@ Every other library forces one of those compromises. Wickra doesn't:
| Library | Install | Streaming | Languages | Indicators | Active | | Library | Install | Streaming | Languages | Indicators | Active |
|------------------|-------------|-------------|-----------------------------|-----------:|--------| |------------------|-------------|-------------|-----------------------------|-----------:|--------|
| **★&nbsp;Wickra**| **clean** | **yes, O(1)** | **Rust · Python · Node · WASM · C · C# · Go · Java · R** | **514** | **yes** | | **★&nbsp;Wickra**| **clean** | **yes, O(1)** | **Rust · Python · Node.js · WASM · C · C++ · C# · Go · Java · R** | **514** | **yes** |
| kand | clean | yes | Python · WASM · Rust | ~60 | yes | | kand | clean | yes | Python · WASM · Rust | ~60 | yes |
| ta-rs | clean | yes | Rust only | ~30 | stale | | ta-rs | clean | yes | Rust only | ~30 | stale |
| yata | clean | partial | Rust only | ~35 | yes | | yata | clean | partial | Rust only | ~35 | yes |
@@ -190,7 +190,7 @@ it — regenerate from the core).
| Browser / WASM | `npm install wickra-wasm` | `examples/wasm/index.html` | | Browser / WASM | `npm install wickra-wasm` | `examples/wasm/index.html` |
| Rust | `cargo add wickra` | `examples/rust/src/bin/backtest.rs` | | Rust | `cargo add wickra` | `examples/rust/src/bin/backtest.rs` |
| C / C++ (C ABI) | header + library, see [`bindings/c`](bindings/c) | `examples/c/streaming.c` | | C / C++ (C ABI) | header + library, see [`bindings/c`](bindings/c) | `examples/c/streaming.c` |
| C# / .NET (C ABI) | `dotnet add package Wickra`, see [`bindings/csharp`](bindings/csharp) | `examples/csharp/streaming` | | C# (C ABI) | `dotnet add package Wickra`, see [`bindings/csharp`](bindings/csharp) | `examples/csharp/streaming` |
| Go (cgo, C ABI) | `go get github.com/wickra-lib/wickra/bindings/go`, see [`bindings/go`](bindings/go) | `examples/go/streaming` | | Go (cgo, C ABI) | `go get github.com/wickra-lib/wickra/bindings/go`, see [`bindings/go`](bindings/go) | `examples/go/streaming` |
| Java (FFM, C ABI) | Maven Central `org.wickra:wickra`, see [`bindings/java`](bindings/java) | `examples/java` (`Streaming`) | | Java (FFM, C ABI) | Maven Central `org.wickra:wickra`, see [`bindings/java`](bindings/java) | `examples/java` (`Streaming`) |
| R (`.Call`, C ABI) | `R CMD INSTALL bindings/r`, see [`bindings/r`](bindings/r) | `examples/r/streaming.R` | | R (`.Call`, C ABI) | `R CMD INSTALL bindings/r`, see [`bindings/r`](bindings/r) | `examples/r/streaming.R` |
@@ -202,6 +202,29 @@ The wickra-core crate is `unsafe`-forbidden, so the native bindings are
memory-safe end to end. The C ABI runs the same safe core; only its thin FFI memory-safe end to end. The C ABI runs the same safe core; only its thin FFI
boundary uses `unsafe`, and the caller owns handle lifetimes (`_new` / `_free`). boundary uses `unsafe`, and the caller owns handle lifetimes (`_new` / `_free`).
## Requirements
The minimum supported version per language. Prebuilt packages (Rust, Python,
Node.js, WASM, C#) need only the runtime; the C-ABI bindings that compile on
install — Go (cgo) and R (`.Call`) — also need a C compiler, and Java runs with
`--enable-native-access=ALL-UNNAMED`.
| Language | Package | Minimum supported |
|-------------|--------------------------------------|----------------------------|
| Rust | crates.io · `wickra` | 1.86 (MSRV) |
| Python | PyPI · `wickra` (abi3 wheel) | 3.9 (tested through 3.13) |
| Node.js | npm · `wickra` (N-API 8) | 20 (tested on 22 · 24 LTS) |
| WASM | npm · `wickra-wasm` | any modern JS engine |
| C | `wickra.h` + library (releases) | C99 compiler |
| C++ | `wickra.hpp` over the C ABI | C++14 compiler |
| C# | NuGet · `Wickra` | .NET 8 (`net8.0`) |
| Go | module · `wickra-lib/wickra-go` | Go 1.23 (cgo) |
| Java | Maven Central · `org.wickra:wickra` | Java 22 (FFM / Panama) |
| R | source package | R ≥ 2.10 (Rtools on Win.) |
Full per-language detail (runtime vs. build-from-source) is on the
[Requirements page](https://docs.wickra.org/Requirements) in the docs.
## Rust API ## Rust API
```rust ```rust
@@ -264,7 +287,7 @@ wickra/
│ ├── node/ napi-rs (publishes on npm) │ ├── node/ napi-rs (publishes on npm)
│ ├── wasm/ wasm-bindgen (browsers, bundlers, Node) │ ├── wasm/ wasm-bindgen (browsers, bundlers, Node)
│ ├── c/ C ABI (cdylib + staticlib) + generated include/wickra.h │ ├── c/ C ABI (cdylib + staticlib) + generated include/wickra.h
│ ├── csharp/ .NET binding over the C ABI (publishes on NuGet) │ ├── csharp/ C# binding over the C ABI (publishes on NuGet)
│ ├── go/ Go binding over the C ABI via cgo (module tag) │ ├── go/ Go binding over the C ABI via cgo (module tag)
│ ├── r/ R binding over the C ABI via .Call (R package) │ ├── r/ R binding over the C ABI via .Call (R package)
│ └── java/ Java binding over the C ABI via the FFM API (Maven Central) │ └── java/ Java binding over the C ABI via the FFM API (Maven Central)
@@ -312,7 +335,7 @@ cargo build -p wickra-c --release
cmake -S examples/c -B examples/c/build -DWICKRA_LIB_DIR="$PWD/target/release" cmake -S examples/c -B examples/c/build -DWICKRA_LIB_DIR="$PWD/target/release"
cmake --build examples/c/build && ctest --test-dir examples/c/build --output-on-failure cmake --build examples/c/build && ctest --test-dir examples/c/build --output-on-failure
# C# / .NET binding (requires the .NET 8 SDK; links the C ABI above) # C# binding (requires the .NET 8 SDK; links the C ABI above)
dotnet test bindings/csharp/Wickra.Tests/Wickra.Tests.csproj dotnet test bindings/csharp/Wickra.Tests/Wickra.Tests.csproj
# Go binding (requires a C compiler for cgo; links the C ABI above) # Go binding (requires a C compiler for cgo; links the C ABI above)
+2 -2
View File
@@ -21,8 +21,8 @@ minor releases; breaking changes are called out in the changelog.
versioning stability for a 1.0 release. versioning stability for a 1.0 release.
- **Performance.** Keep per-tick updates O(1) and maintain the benchmark suite; - **Performance.** Keep per-tick updates O(1) and maintain the benchmark suite;
investigate further allocation and cache improvements. investigate further allocation and cache improvements.
- **Bindings parity.** Keep the Python, Node.js and WebAssembly bindings — plus - **Bindings parity.** Keep the Python, Node.js and WASM bindings — plus
the C ABI and the C# / .NET, Go, Java and R bindings generated from it — in lockstep with the the C ABI and the C#, Go, Java and R bindings generated from it — in lockstep with the
Rust core, including type stubs and platform coverage. Rust core, including type stubs and platform coverage.
- **Documentation.** Maintain a deep-dive page per indicator on - **Documentation.** Maintain a deep-dive page per indicator on
<https://docs.wickra.org>, plus quickstarts and cookbook material. <https://docs.wickra.org>, plus quickstarts and cookbook material.
+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.0` Wickra is pre-1.0. Security fixes are applied to the latest released `0.9.1`
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.0 (latest) | :white_check_mark: | | 0.9.1 (latest) | :white_check_mark: |
| < 0.9.0 | :x: | | < 0.9.1 | :x: |
## Reporting a vulnerability ## Reporting a vulnerability
+1 -1
View File
@@ -7,7 +7,7 @@ Thanks for using Wickra! Here is where to get help, depending on what you need.
Most questions are answered in the documentation: Most questions are answered in the documentation:
- **Docs site:** <https://docs.wickra.org> — quickstarts for Rust, Python, - **Docs site:** <https://docs.wickra.org> — quickstarts for Rust, Python,
Node.js, WebAssembly, C, C#, Go, Java and R, a per-indicator reference, warmup periods, the Node.js, WASM, C, C++, C#, Go, Java and R, a per-indicator reference, warmup periods, the
data layer, and an FAQ. data layer, and an FAQ.
- **README:** <https://github.com/wickra-lib/wickra#readme> — installation and a - **README:** <https://github.com/wickra-lib/wickra#readme> — installation and a
quick overview. quick overview.
+2 -2
View File
@@ -3,8 +3,8 @@
This document describes Wickra's attack surface and the threats considered, This document describes Wickra's attack surface and the threats considered,
together with their mitigations. It complements the security assurance case in together with their mitigations. It complements the security assurance case in
[`SECURITY.md`](SECURITY.md). Wickra is a computational technical-analysis [`SECURITY.md`](SECURITY.md). Wickra is a computational technical-analysis
library (a Rust core with Python, Node.js and WebAssembly bindings plus a C ABI library (a Rust core with Python, Node.js and WASM bindings plus a C ABI
and the .NET, Go, Java and R bindings built on it), and the C#, Go, Java and R bindings built on it),
not a network service or trading system; the attack surface is correspondingly not a network service or trading system; the attack surface is correspondingly
small. small.
+11 -4
View File
@@ -9,12 +9,12 @@
library plus a generated `wickra.h` — no system dependencies.** library plus a generated `wickra.h` — no system dependencies.**
Wickra is a multi-language technical-analysis library with a Rust core and Wickra is a multi-language technical-analysis library with a Rust core and
bindings for Python, Node.js and WebAssembly, plus a C ABI for C/C++, C#, Go, Java, R and any bindings for Python, Node.js and WASM, plus a C ABI for C, C++, C#, Go, Java, R and any
other C-capable language. Every indicator is an O(1) other C-capable language. Every indicator is an O(1)
streaming state machine, so live trading bots and historical backtests share streaming state machine, so live trading bots and historical backtests share
the exact same implementation. This package is the **C ABI hub**: it compiles the the exact same implementation. This package is the **C ABI hub**: it compiles the
core to a C-compatible shared/static library plus a generated header, so any core to a C-compatible shared/static library plus a generated header, so any
C-capable language (C, C++, Go, C#, Java, R) links against one artifact instead C-capable language (C, C++, C#, Go, Java, R) links against one artifact instead
of re-wrapping every indicator natively. of re-wrapping every indicator natively.
## Install ## Install
@@ -77,10 +77,17 @@ the main repository and documentation site:
- **Docs** (C quickstart, cookbook, TA-Lib migration): <https://docs.wickra.org/Quickstart-C> - **Docs** (C quickstart, cookbook, TA-Lib migration): <https://docs.wickra.org/Quickstart-C>
- **Runnable examples:** [`examples/c/`](https://github.com/wickra-lib/wickra/tree/main/examples/c) - **Runnable examples:** [`examples/c/`](https://github.com/wickra-lib/wickra/tree/main/examples/c)
Wickra ships native bindings for Python, Node.js, WebAssembly and Rust, plus this Wickra ships native bindings for Python, Node.js, WASM and Rust, plus this
C ABI hub that any C-capable language (C, C++, Go, C#, Java, R) links against — C ABI hub that any C-capable language (C, C++, C#, Go, Java, R) links against —
all exposing the same indicators from the shared Rust core. all exposing the same indicators from the shared Rust core.
## Security
Found a security issue? **Please don't open a public issue.** Report it privately
via the affected repository's *Security* tab (*"Report a vulnerability"*) or email
**support@wickra.org** with a subject line starting `[wickra security]`. Full
policy: <https://github.com/wickra-lib/wickra/blob/main/SECURITY.md>.
## Disclaimer ## Disclaimer
Wickra is an indicator toolkit, not a trading system. The values it computes Wickra is an indicator toolkit, not a trading system. The values it computes
File diff suppressed because it is too large Load Diff
+13710
View File
File diff suppressed because it is too large Load Diff
+13 -6
View File
@@ -1,18 +1,18 @@
# Wickra — .NET # Wickra — C#
[![CI](https://github.com/wickra-lib/wickra/actions/workflows/ci.yml/badge.svg)](https://github.com/wickra-lib/wickra/actions/workflows/ci.yml) [![CI](https://github.com/wickra-lib/wickra/actions/workflows/ci.yml/badge.svg)](https://github.com/wickra-lib/wickra/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/wickra-lib/wickra/branch/main/graph/badge.svg)](https://codecov.io/gh/wickra-lib/wickra) [![codecov](https://codecov.io/gh/wickra-lib/wickra/branch/main/graph/badge.svg)](https://codecov.io/gh/wickra-lib/wickra)
[![NuGet](https://img.shields.io/nuget/v/Wickra.svg?logo=nuget&color=blue)](https://www.nuget.org/packages/Wickra) [![NuGet](https://img.shields.io/nuget/v/Wickra.svg?logo=nuget&color=blue)](https://www.nuget.org/packages/Wickra)
[![License: MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT_OR_Apache--2.0-blue)](https://github.com/wickra-lib/wickra#license) [![License: MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT_OR_Apache--2.0-blue)](https://github.com/wickra-lib/wickra#license)
**Streaming-first technical indicators for .NET. `dotnet add package Wickra` **Streaming-first technical indicators for C#. `dotnet add package Wickra`
prebuilt native library, no system dependencies.** prebuilt native library, no system dependencies.**
Wickra is a multi-language technical-analysis library with a Rust core and Wickra is a multi-language technical-analysis library with a Rust core and
bindings for Python, Node.js and WebAssembly, plus a C ABI for C/C++, C#, Go, Java, R and any bindings for Python, Node.js and WASM, plus a C ABI for C, C++, C#, Go, Java, R and any
other C-capable language. Every indicator is an O(1) other C-capable language. Every indicator is an O(1)
streaming state machine, so live trading bots and historical backtests share streaming state machine, so live trading bots and historical backtests share
the exact same implementation. This package is the .NET binding; it consumes the the exact same implementation. This package is the C# binding; it consumes the
C ABI hub through `[LibraryImport]` P/Invoke and exposes all 514 streaming-first C ABI hub through `[LibraryImport]` P/Invoke and exposes all 514 streaming-first
indicators as idiomatic `IDisposable` classes. indicators as idiomatic `IDisposable` classes.
@@ -73,10 +73,17 @@ the main repository and documentation site:
- **Docs** (quickstarts, cookbook, TA-Lib migration): <https://docs.wickra.org> - **Docs** (quickstarts, cookbook, TA-Lib migration): <https://docs.wickra.org>
- **Runnable examples:** [`examples/csharp/`](https://github.com/wickra-lib/wickra/tree/main/examples/csharp) - **Runnable examples:** [`examples/csharp/`](https://github.com/wickra-lib/wickra/tree/main/examples/csharp)
Wickra ships native bindings for Python, Node.js, WebAssembly and Rust, plus a Wickra ships native bindings for Python, Node.js, WASM and Rust, plus a
C ABI hub that any C-capable language (C, C++, Go, C#, Java, R) links against — C ABI hub that any C-capable language (C, C++, C#, Go, Java, R) links against —
all exposing the same indicators from the shared, `unsafe`-forbidden Rust core. all exposing the same indicators from the shared, `unsafe`-forbidden Rust core.
## Security
Found a security issue? **Please don't open a public issue.** Report it privately
via the affected repository's *Security* tab (*"Report a vulnerability"*) or email
**support@wickra.org** with a subject line starting `[wickra security]`. Full
policy: <https://github.com/wickra-lib/wickra/blob/main/SECURITY.md>.
## Disclaimer ## Disclaimer
Wickra is an indicator toolkit, not a trading system. The values it computes Wickra is an indicator toolkit, not a trading system. The values it computes
@@ -34,6 +34,21 @@ public class ArchetypeTests
Assert.InRange(last, 1.0, 10.0); Assert.InRange(last, 1.0, 10.0);
} }
[Fact]
public void Query_WarmupPeriodAndIsReady()
{
using var sma = new Sma(3);
Assert.Equal(3, sma.WarmupPeriod());
Assert.False(sma.IsReady());
sma.Update(1.0);
sma.Update(2.0);
Assert.False(sma.IsReady());
sma.Update(3.0);
Assert.True(sma.IsReady());
sma.Reset();
Assert.False(sma.IsReady());
}
[Fact] [Fact]
public void Candle_Atr_IsFinitePositive() public void Candle_Atr_IsFinitePositive()
{ {
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -11,7 +11,7 @@
<!-- NuGet package metadata --> <!-- NuGet package metadata -->
<PackageId>Wickra</PackageId> <PackageId>Wickra</PackageId>
<Version>0.9.0</Version> <Version>0.9.1</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>
+9 -2
View File
@@ -8,7 +8,7 @@
**Streaming-first technical indicators for Go, over the Wickra C ABI hub via cgo.** **Streaming-first technical indicators for Go, over the Wickra C ABI hub via cgo.**
Wickra is a multi-language technical-analysis library with a Rust core and Wickra is a multi-language technical-analysis library with a Rust core and
bindings for Python, Node.js and WebAssembly, plus a C ABI for C/C++, C#, Go, Java, R and bindings for Python, Node.js and WASM, plus a C ABI for C, C++, C#, Go, Java, R and
any other C-capable language. Every indicator is an O(1) streaming state machine, any other C-capable language. Every indicator is an O(1) streaming state machine,
so live trading bots and historical backtests share the exact same so live trading bots and historical backtests share the exact same
implementation. This package is the Go binding; it consumes the C ABI hub through implementation. This package is the Go binding; it consumes the C ABI hub through
@@ -108,10 +108,17 @@ main repository and documentation site:
- **Docs** (quickstarts, cookbook, TA-Lib migration): <https://docs.wickra.org> - **Docs** (quickstarts, cookbook, TA-Lib migration): <https://docs.wickra.org>
- **Runnable examples:** [`examples/go/`](https://github.com/wickra-lib/wickra/tree/main/examples/go) - **Runnable examples:** [`examples/go/`](https://github.com/wickra-lib/wickra/tree/main/examples/go)
Wickra ships native bindings for Python, Node.js, WebAssembly and Rust, plus a Wickra ships native bindings for Python, Node.js, WASM and Rust, plus a
C ABI hub that any C-capable language (C, C++, C#, Go, Java, R) links against — C ABI hub that any C-capable language (C, C++, C#, Go, Java, R) links against —
all exposing the same indicators from the shared, `unsafe`-forbidden Rust core. all exposing the same indicators from the shared, `unsafe`-forbidden Rust core.
## Security
Found a security issue? **Please don't open a public issue.** Report it privately
via the affected repository's *Security* tab (*"Report a vulnerability"*) or email
**support@wickra.org** with a subject line starting `[wickra security]`. Full
policy: <https://github.com/wickra-lib/wickra/blob/main/SECURITY.md>.
## Disclaimer ## Disclaimer
Wickra is an indicator toolkit, not a trading system. The values it computes are Wickra is an indicator toolkit, not a trading system. The values it computes are
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+28
View File
@@ -24,6 +24,34 @@ func TestScalarKnownValue(t *testing.T) {
} }
} }
func TestWarmupPeriodAndIsReady(t *testing.T) {
s, err := NewSma(3)
if err != nil {
t.Fatalf("NewSma: %v", err)
}
defer s.Close()
if got := s.WarmupPeriod(); got != 3 {
t.Fatalf("sma(3) WarmupPeriod = %d, want 3", got)
}
if s.IsReady() {
t.Fatal("sma is ready before any update")
}
s.Update(1)
s.Update(2)
if s.IsReady() {
t.Fatal("sma is ready mid-warmup")
}
s.Update(3)
if !s.IsReady() {
t.Fatal("sma is not ready after the warmup period")
}
s.Reset()
if s.IsReady() {
t.Fatal("sma is ready after reset")
}
}
func TestScalarBatchMatchesStreaming(t *testing.T) { func TestScalarBatchMatchesStreaming(t *testing.T) {
input := []float64{1, 2, 3, 4, 5, 6, 7, 8} input := []float64{1, 2, 3, 4, 5, 6, 7, 8}
+12 -5
View File
@@ -9,7 +9,7 @@
& Memory API — prebuilt native library, no JNI, no system dependencies.** & Memory API — prebuilt native library, no JNI, no system dependencies.**
Wickra is a multi-language technical-analysis library with a Rust core and Wickra is a multi-language technical-analysis library with a Rust core and
bindings for Python, Node.js and WebAssembly, plus a C ABI for C/C++, C#, Go, Java, R bindings for Python, Node.js and WASM, plus a C ABI for C, C++, C#, Go, Java, R
and any other C-capable language. Every indicator is an O(1) streaming state and any other C-capable language. Every indicator is an O(1) streaming state
machine, so live trading bots and historical backtests share the exact same machine, so live trading bots and historical backtests share the exact same
implementation. This package is the Java binding; it consumes the C ABI hub implementation. This package is the Java binding; it consumes the C ABI hub
@@ -30,14 +30,14 @@ Maven:
<dependency> <dependency>
<groupId>org.wickra</groupId> <groupId>org.wickra</groupId>
<artifactId>wickra</artifactId> <artifactId>wickra</artifactId>
<version>0.9.0</version> <version>0.9.1</version>
</dependency> </dependency>
``` ```
Gradle: Gradle:
```kotlin ```kotlin
implementation("org.wickra:wickra:0.9.0") implementation("org.wickra:wickra:0.9.1")
``` ```
The native library ships prebuilt per platform (Linux, macOS, Windows — x64 and The native library ships prebuilt per platform (Linux, macOS, Windows — x64 and
@@ -98,10 +98,17 @@ the main repository and documentation site:
- **Docs** (quickstarts, cookbook, TA-Lib migration): <https://docs.wickra.org> - **Docs** (quickstarts, cookbook, TA-Lib migration): <https://docs.wickra.org>
- **Runnable examples:** [`examples/java/`](https://github.com/wickra-lib/wickra/tree/main/examples/java) - **Runnable examples:** [`examples/java/`](https://github.com/wickra-lib/wickra/tree/main/examples/java)
Wickra ships native bindings for Python, Node.js, WebAssembly and Rust, plus a Wickra ships native bindings for Python, Node.js, WASM and Rust, plus a
C ABI hub that any C-capable language (C, C++, Go, C#, Java, R) links against — C ABI hub that any C-capable language (C, C++, C#, Go, Java, R) links against —
all exposing the same indicators from the shared, `unsafe`-forbidden Rust core. all exposing the same indicators from the shared, `unsafe`-forbidden Rust core.
## Security
Found a security issue? **Please don't open a public issue.** Report it privately
via the affected repository's *Security* tab (*"Report a vulnerability"*) or email
**support@wickra.org** with a subject line starting `[wickra security]`. Full
policy: <https://github.com/wickra-lib/wickra/blob/main/SECURITY.md>.
## Disclaimer ## Disclaimer
Wickra is an indicator toolkit, not a trading system. The values it computes Wickra is an indicator toolkit, not a trading system. The values it computes
+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.0</version> <version>0.9.1</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Wickra</name> <name>Wickra</name>
@@ -71,6 +71,26 @@ public final class AbandonedBaby implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ABANDONED_BABY_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ABANDONED_BABY_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class Abcd implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ABCD_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ABCD_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -57,6 +57,26 @@ public final class AbsoluteBreadthIndex implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ABSOLUTE_BREADTH_INDEX_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ABSOLUTE_BREADTH_INDEX_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -47,6 +47,26 @@ public final class AccelerationBands implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ACCELERATION_BANDS_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ACCELERATION_BANDS_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -80,6 +80,26 @@ public final class AcceleratorOscillator implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ACCELERATOR_OSCILLATOR_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ACCELERATOR_OSCILLATOR_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class AdOscillator implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AD_OSCILLATOR_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AD_OSCILLATOR_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -57,6 +57,26 @@ public final class AdVolumeLine implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AD_VOLUME_LINE_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AD_VOLUME_LINE_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -74,6 +74,26 @@ public final class AdaptiveCci implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADAPTIVE_CCI_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADAPTIVE_CCI_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -51,6 +51,26 @@ public final class AdaptiveCycle implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADAPTIVE_CYCLE_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADAPTIVE_CYCLE_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class AdaptiveLaguerreFilter implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADAPTIVE_LAGUERRE_FILTER_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADAPTIVE_LAGUERRE_FILTER_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class AdaptiveRsi implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADAPTIVE_RSI_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADAPTIVE_RSI_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class Adl implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADL_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADL_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class AdvanceBlock implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADVANCE_BLOCK_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADVANCE_BLOCK_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -57,6 +57,26 @@ public final class AdvanceDecline implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADVANCE_DECLINE_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADVANCE_DECLINE_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -57,6 +57,26 @@ public final class AdvanceDeclineRatio implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADVANCE_DECLINE_RATIO_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADVANCE_DECLINE_RATIO_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -47,6 +47,26 @@ public final class Adx implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADX_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADX_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -74,6 +74,26 @@ public final class Adxr implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ADXR_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ADXR_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -53,6 +53,26 @@ public final class Alligator implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ALLIGATOR_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ALLIGATOR_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class Alma implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ALMA_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ALMA_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -58,6 +58,26 @@ public final class Alpha implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ALPHA_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ALPHA_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -39,6 +39,26 @@ public final class AmihudIlliquidity implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AMIHUD_ILLIQUIDITY_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AMIHUD_ILLIQUIDITY_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -51,6 +51,26 @@ public final class AnchoredRsi implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ANCHORED_RSI_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ANCHORED_RSI_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class AnchoredVwap implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ANCHORED_VWAP_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ANCHORED_VWAP_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -47,6 +47,26 @@ public final class AndrewsPitchfork implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ANDREWS_PITCHFORK_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ANDREWS_PITCHFORK_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -57,6 +57,26 @@ public final class Apo implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_APO_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_APO_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -46,6 +46,26 @@ public final class Aroon implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AROON_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AROON_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -74,6 +74,26 @@ public final class AroonOscillator implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AROON_OSCILLATOR_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AROON_OSCILLATOR_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -74,6 +74,26 @@ public final class Atr implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ATR_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ATR_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -47,6 +47,26 @@ public final class AtrBands implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ATR_BANDS_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ATR_BANDS_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -46,6 +46,26 @@ public final class AtrRatchet implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ATR_RATCHET_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ATR_RATCHET_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -74,6 +74,26 @@ public final class AtrTrailingStop implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_ATR_TRAILING_STOP_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_ATR_TRAILING_STOP_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -48,6 +48,26 @@ public final class AutoFib implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AUTO_FIB_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AUTO_FIB_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -57,6 +57,26 @@ public final class Autocorrelation implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AUTOCORRELATION_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AUTOCORRELATION_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -57,6 +57,26 @@ public final class AutocorrelationPeriodogram implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AUTOCORRELATION_PERIODOGRAM_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AUTOCORRELATION_PERIODOGRAM_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -74,6 +74,26 @@ public final class AverageDailyRange implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AVERAGE_DAILY_RANGE_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AVERAGE_DAILY_RANGE_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class AverageDrawdown implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AVERAGE_DRAWDOWN_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AVERAGE_DRAWDOWN_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class AvgPrice implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AVG_PRICE_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AVG_PRICE_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -77,6 +77,26 @@ public final class AwesomeOscillator implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AWESOME_OSCILLATOR_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AWESOME_OSCILLATOR_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -80,6 +80,26 @@ public final class AwesomeOscillatorHistogram implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_AWESOME_OSCILLATOR_HISTOGRAM_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_AWESOME_OSCILLATOR_HISTOGRAM_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class BalanceOfPower implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BALANCE_OF_POWER_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BALANCE_OF_POWER_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class BandpassFilter implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BANDPASS_FILTER_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BANDPASS_FILTER_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class Bat implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BAT_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BAT_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class BeltHold implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BELT_HOLD_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BELT_HOLD_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -58,6 +58,26 @@ public final class Beta implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BETA_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BETA_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -58,6 +58,26 @@ public final class BetaNeutralSpread implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BETA_NEUTRAL_SPREAD_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BETA_NEUTRAL_SPREAD_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -74,6 +74,26 @@ public final class BetterVolume implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BETTER_VOLUME_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BETTER_VOLUME_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class BipowerVariation implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BIPOWER_VARIATION_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BIPOWER_VARIATION_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class BodySizePct implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BODY_SIZE_PCT_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BODY_SIZE_PCT_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -48,6 +48,26 @@ public final class BollingerBands implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BOLLINGER_BANDS_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BOLLINGER_BANDS_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class BollingerBandwidth implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BOLLINGER_BANDWIDTH_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BOLLINGER_BANDWIDTH_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -47,6 +47,26 @@ public final class BomarBands implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BOMAR_BANDS_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BOMAR_BANDS_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -60,6 +60,26 @@ public final class BreadthThrust implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BREADTH_THRUST_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BREADTH_THRUST_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class Breakaway implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BREAKAWAY_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BREAKAWAY_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -57,6 +57,26 @@ public final class BullishPercentIndex implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BULLISH_PERCENT_INDEX_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BULLISH_PERCENT_INDEX_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class BurkeRatio implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BURKE_RATIO_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BURKE_RATIO_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -71,6 +71,26 @@ public final class Butterfly implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_BUTTERFLY_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_BUTTERFLY_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -36,6 +36,26 @@ public final class CalendarSpread implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CALENDAR_SPREAD_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CALENDAR_SPREAD_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class CalmarRatio implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CALMAR_RATIO_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CALMAR_RATIO_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -50,6 +50,26 @@ public final class Camarilla implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CAMARILLA_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CAMARILLA_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -46,6 +46,26 @@ public final class CandleVolume implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CANDLE_VOLUME_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CANDLE_VOLUME_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -74,6 +74,26 @@ public final class Cci implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CCI_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CCI_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class CenterOfGravity implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CENTER_OF_GRAVITY_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CENTER_OF_GRAVITY_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -44,6 +44,26 @@ public final class CentralPivotRange implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CENTRAL_PIVOT_RANGE_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CENTRAL_PIVOT_RANGE_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -54,6 +54,26 @@ public final class Cfo implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CFO_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CFO_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -74,6 +74,26 @@ public final class ChaikinMoneyFlow implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CHAIKIN_MONEY_FLOW_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CHAIKIN_MONEY_FLOW_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {
@@ -77,6 +77,26 @@ public final class ChaikinOscillator implements AutoCloseable {
} }
} }
/** Number of updates required before update() yields a value. */
public int warmupPeriod() {
try {
long n = (long) NativeMethods.WICKRA_CHAIKIN_OSCILLATOR_WARMUP_PERIOD.invokeExact(handle);
return (int) n;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Whether the indicator has consumed enough input to emit a value. */
public boolean isReady() {
try {
byte r = (byte) NativeMethods.WICKRA_CHAIKIN_OSCILLATOR_IS_READY.invokeExact(handle);
return r != 0;
} catch (Throwable t) {
throw WickraNative.rethrow(t);
}
}
/** Reset to the just-constructed state. */ /** Reset to the just-constructed state. */
public void reset() { public void reset() {
try { try {

Some files were not shown because too many files have changed in this diff Show More