test: golden-pin the four de-duplicated indicators across all bindings (#305)
* test: golden-pin the four de-duplicated indicators across all C-ABI bindings Extend gen_golden to emit reference fixtures for AdOscillator (ADOSC), IntradayIntensity, AwesomeOscillatorHistogram and AverageDrawdown, and replay them through the Go / C# / Java / R golden harnesses so their corrected definitions stay bit-identical to the Rust core in every binding. Go suite verified locally (gcc 13 + cgo): all 9 golden tests pass; C#/Java/R use the same fixtures and harness pattern (CI-verified). First step of extending the golden coverage beyond the seven archetype representatives. * test: golden-pin the scalar-output tranche (308 indicators) against Rust Extend gen_golden with a generated emit_scalar that writes reference fixtures for every single-f64-output indicator (scalar / candle / pairwise input) using valid constructor params, and add a manifest-driven generic Python golden replay that reconstructs each by its native name and checks it bit-for-bit against the Rust output. 308 indicators now value-tied to the Rust core in Python (pytest: 308/308). Takes golden coverage from the 7 archetype representatives to 308+ of the catalogue. 22 scalar indicators with non-default constructor constraints are skipped by gen_golden for now (logged), as are non-f64-output ones; multi-output, exotic inputs and the per-indicator arg arities of the C-ABI/Node replays follow. Generated + verified locally with the full toolchain. * test: golden-pin the multi-output tranche (70 indicators) in Python Add a generated emit_multi to gen_golden (per-indicator Output-field access, one CSV column per field) and a manifest-driven generic Python replay that checks every field of each multi-output indicator against the Rust reference. 70 multi-output indicators now value-tied to Rust in Python; combined with the scalar tranche, 378 indicators are golden-pinned. 8 multi with non-default param constraints and 5 with non-f64 Output fields (Option/Vec/i64) are deferred. pytest green. * test(golden): add 30 constraint-tuned indicators to scalar/multi golden suite Emit golden fixtures for 22 scalar-output and 8 multi-output indicators whose constructors need non-default parameters (Alma, Jma, Psar, T3, Mama, DoubleBollinger, ZigZag, ...). All 408 fixtures replay bit-for-bit through the Python binding. * test(golden): cover 36 missed scalar/multi indicators Add 26 single-output (LinearRegression family, HT cycle, Candle volatility estimators, DrawdownDuration) and 10 multi-output (BollingerBands, MACD/MACDEXT/MACDFIX, Camarilla, VWAP bands, ...) indicators to the golden suite. 444 fixtures replay bit-for-bit through the Python binding. * test(golden): cover 50 exotic-input indicators Add deterministic synthetic feeders for the DerivativesTick (17), CrossSection (15), Trade (8), TradeQuote (3) and OrderBook (7) families, derived from the shared OHLCV input series in both gen_golden and a new Python replay harness (test_golden_exotic). All 494 fixtures replay bit-for-bit through the Python binding. * test(golden): complete 514-indicator golden coverage Add the final tranches: 3 mixed multi-output indicators (Ichimoku, WilliamsFractals, LeadLagCrossCorrelation), 6 histogram profiles (time/volume seasonality + TPO/volume price profiles), 10 alt-chart bar builders and the footprint. Every one of the 514 distinct indicators now has a Rust-generated g_<Canonical>.csv fixture and a generic Python replay (scalar/multi/exotic/profile/bars), all passing bit-for-bit. * test(golden): add generic Node replay for all 514 indicators A manifest-driven node:test harness reconstructs every indicator by its native class, feeds the same synthetic stream derived from the shared golden input, and checks output bit-for-bit against the Rust reference fixtures (scalar/multi/exotic/profile/bars). node_manifest.json is generated from index.d.ts plus the Python-side manifests. 514/514 pass. * test(golden): add generated Go replay for all 514 indicators golden_all_test.go (generated by gen_golden_test.py) reconstructs every Go indicator, feeds the shared synthetic stream and checks output bit-for-bit against the Rust reference fixtures. A reflection-based comparator flattens multi-output structs, profiles and bar slices so one path covers all archetypes. This is the first C-ABI binding verified across the full catalogue. 514/514 pass. * test(golden): add generated C# replay for all 514 indicators GoldenAllTests.g.cs (generated by gen_golden_test.py) reconstructs every C# indicator, feeds the shared synthetic stream and checks output bit-for-bit against the Rust reference fixtures via a reflection-based flatten covering scalar/multi/profile/bar archetypes. 514/514 pass. Also add the '#nullable enable' directive the compiler requires to the generated Indicators.g.cs, clearing the four CS8669 warnings on the nullable double[] profile return types. * fix(java): marshal C ABI bool params correctly; add 514 golden replay The Java FFM binding marshalled the cross-section state flags (newHigh, newLow, aboveMa, onBuySignal) as JAVA_DOUBLE arrays, but the C ABI takes them as const bool* (one byte each), so the native side read the low byte of each 8-byte double and saw every flag as false. Add WickraNative. boolSegment and use it across the 15 cross-section indicators. Also pass the MacdExt MaType arguments as byte to match the uint8_t downcall descriptor (was int, throwing WrongMethodTypeException). Add GoldenAllTest.java (generated by gen_golden_test.py): a reflection runner replaying all 514 indicators against the Rust reference fixtures. The bugs above were found by this test; 514/514 now pass. * fix(r): marshal C ABI bool flags correctly; add 514 golden replay The R wrapper passed the cross-section state flags as (bool *)REAL(x), reinterpreting the 8-byte doubles as 1-byte bools so the native side read every flag as false. Add wk_bool_vec to convert each flag vector into a real C bool buffer and use it for all 15 cross-section update wrappers. Add test-golden-all.R + generated golden_specs.R: a reflective runner replaying all 514 indicators against the Rust reference fixtures. The bug above was found by this test; verified 514/514 pass locally. * test(golden): add WASM replay for all 514 indicators A manifest-driven node:test harness loads the nodejs-target wasm-pack build, reconstructs every indicator by its JS class, feeds the shared synthetic stream and checks output bit-for-bit against the Rust reference fixtures. wasm_manifest.json is generated from the wasm .d.ts plus the shared manifests; a recursive flattener covers scalar, multi (Reflect objects), profile and bar shapes. 514/514 pass locally (wasm-pack build --target nodejs, then node --test). * test(golden): add C and C++ replay for all 514 indicators golden_test.c (generated by gen_golden_test.py) drives every indicator through the C ABI (wickra.h) and checks output bit-for-bit against the Rust reference fixtures. golden_test.cpp #includes the same source so the identical runner is compiled and run under both gcc (C) and g++ (C++) via the CMake targets golden_test / golden_test_cpp — proving the extern "C" header is consumable from each language. Both 514/514 (verified via ctest). * test(golden): gofmt the generated Go golden replay * test(golden): make the Node fixture reader CRLF-safe and pin fixtures to LF
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
"""Generate tests/testthat/golden_specs.R: the per-indicator spec list (canonical
|
||||
name, archetype, ctor params, output width) consumed by test-golden-all.R, which
|
||||
replays all 514 indicators against the Rust reference fixtures g_<Canonical>.csv.
|
||||
|
||||
Run from repo root: python bindings/r/gen_golden_test.py
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
|
||||
ROOT = os.path.normpath(os.path.join(os.path.dirname(__file__), "..", ".."))
|
||||
MAN = json.load(open(os.path.join(ROOT, "testdata", "golden", "golden_manifest.json")))
|
||||
|
||||
lines = [
|
||||
"# Code generated by gen_golden_test.py. DO NOT EDIT.",
|
||||
"# Per-indicator golden spec: canonical name, archetype, ctor params, output width.",
|
||||
"GOLDEN_SPECS <- list(",
|
||||
]
|
||||
for e in MAN:
|
||||
n = e.get("n", e.get("width", 0))
|
||||
params = ",".join(repr(float(p)) for p in e["params"])
|
||||
lines.append(f' list(canon="{e["canonical"]}", arch="{e["arch"]}", params=c({params}), width={n}L),')
|
||||
lines[-1] = lines[-1].rstrip(",")
|
||||
lines.append(")")
|
||||
|
||||
dest = os.path.join(ROOT, "bindings", "r", "tests", "testthat", "golden_specs.R")
|
||||
open(dest, "w", encoding="utf-8").write("\n".join(lines) + "\n")
|
||||
print("wrote golden_specs.R with", len(MAN), "specs")
|
||||
+30
-15
@@ -7,6 +7,21 @@
|
||||
#include <stddef.h>
|
||||
#include "wickra.h"
|
||||
|
||||
/* Convert an R numeric vector of flags (non-zero == TRUE) into a C `bool*`
|
||||
* buffer (one byte per element). The cross-section indicators take their state
|
||||
* flags as `const bool*`; casting `wk_bool_vec(x)` would reinterpret the
|
||||
* 8-byte doubles as 1-byte bools and read every flag as false. The buffer is
|
||||
* allocated with R_alloc, so it lives until the enclosing .Call returns. */
|
||||
static bool *wk_bool_vec(SEXP x) {
|
||||
R_xlen_t n = Rf_xlength(x);
|
||||
bool *out = (bool *)R_alloc(n, sizeof(bool));
|
||||
double *src = REAL(x);
|
||||
for (R_xlen_t i = 0; i < n; i++) {
|
||||
out[i] = src[i] != 0.0;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
static void abandoned_baby_fin(SEXP e) {
|
||||
struct AbandonedBaby *h = (struct AbandonedBaby *)R_ExternalPtrAddr(e);
|
||||
if (h) wickra_abandoned_baby_free(h);
|
||||
@@ -104,7 +119,7 @@ SEXP wk_absolute_breadth_index_new(void) {
|
||||
}
|
||||
SEXP wk_absolute_breadth_index_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct AbsoluteBreadthIndex *h = (struct AbsoluteBreadthIndex *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_absolute_breadth_index_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_absolute_breadth_index_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_absolute_breadth_index_warmup_period(SEXP e) {
|
||||
struct AbsoluteBreadthIndex *h = (struct AbsoluteBreadthIndex *)R_ExternalPtrAddr(e);
|
||||
@@ -260,7 +275,7 @@ SEXP wk_ad_volume_line_new(void) {
|
||||
}
|
||||
SEXP wk_ad_volume_line_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct AdVolumeLine *h = (struct AdVolumeLine *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_ad_volume_line_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_ad_volume_line_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_ad_volume_line_warmup_period(SEXP e) {
|
||||
struct AdVolumeLine *h = (struct AdVolumeLine *)R_ExternalPtrAddr(e);
|
||||
@@ -531,7 +546,7 @@ SEXP wk_advance_decline_new(void) {
|
||||
}
|
||||
SEXP wk_advance_decline_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct AdvanceDecline *h = (struct AdvanceDecline *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_advance_decline_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_advance_decline_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_advance_decline_warmup_period(SEXP e) {
|
||||
struct AdvanceDecline *h = (struct AdvanceDecline *)R_ExternalPtrAddr(e);
|
||||
@@ -562,7 +577,7 @@ SEXP wk_advance_decline_ratio_new(void) {
|
||||
}
|
||||
SEXP wk_advance_decline_ratio_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct AdvanceDeclineRatio *h = (struct AdvanceDeclineRatio *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_advance_decline_ratio_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_advance_decline_ratio_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_advance_decline_ratio_warmup_period(SEXP e) {
|
||||
struct AdvanceDeclineRatio *h = (struct AdvanceDeclineRatio *)R_ExternalPtrAddr(e);
|
||||
@@ -2059,7 +2074,7 @@ SEXP wk_breadth_thrust_new(SEXP a0) {
|
||||
}
|
||||
SEXP wk_breadth_thrust_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct BreadthThrust *h = (struct BreadthThrust *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_breadth_thrust_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_breadth_thrust_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_breadth_thrust_warmup_period(SEXP e) {
|
||||
struct BreadthThrust *h = (struct BreadthThrust *)R_ExternalPtrAddr(e);
|
||||
@@ -2131,7 +2146,7 @@ SEXP wk_bullish_percent_index_new(void) {
|
||||
}
|
||||
SEXP wk_bullish_percent_index_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct BullishPercentIndex *h = (struct BullishPercentIndex *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_bullish_percent_index_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_bullish_percent_index_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_bullish_percent_index_warmup_period(SEXP e) {
|
||||
struct BullishPercentIndex *h = (struct BullishPercentIndex *)R_ExternalPtrAddr(e);
|
||||
@@ -3462,7 +3477,7 @@ SEXP wk_cumulative_volume_index_new(void) {
|
||||
}
|
||||
SEXP wk_cumulative_volume_index_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct CumulativeVolumeIndex *h = (struct CumulativeVolumeIndex *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_cumulative_volume_index_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_cumulative_volume_index_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_cumulative_volume_index_warmup_period(SEXP e) {
|
||||
struct CumulativeVolumeIndex *h = (struct CumulativeVolumeIndex *)R_ExternalPtrAddr(e);
|
||||
@@ -7104,7 +7119,7 @@ SEXP wk_high_low_index_new(SEXP a0) {
|
||||
}
|
||||
SEXP wk_high_low_index_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct HighLowIndex *h = (struct HighLowIndex *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_high_low_index_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_high_low_index_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_high_low_index_warmup_period(SEXP e) {
|
||||
struct HighLowIndex *h = (struct HighLowIndex *)R_ExternalPtrAddr(e);
|
||||
@@ -10118,7 +10133,7 @@ SEXP wk_mc_clellan_oscillator_new(void) {
|
||||
}
|
||||
SEXP wk_mc_clellan_oscillator_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct McClellanOscillator *h = (struct McClellanOscillator *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_mc_clellan_oscillator_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_mc_clellan_oscillator_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_mc_clellan_oscillator_warmup_period(SEXP e) {
|
||||
struct McClellanOscillator *h = (struct McClellanOscillator *)R_ExternalPtrAddr(e);
|
||||
@@ -10149,7 +10164,7 @@ SEXP wk_mc_clellan_summation_index_new(void) {
|
||||
}
|
||||
SEXP wk_mc_clellan_summation_index_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct McClellanSummationIndex *h = (struct McClellanSummationIndex *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_mc_clellan_summation_index_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_mc_clellan_summation_index_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_mc_clellan_summation_index_warmup_period(SEXP e) {
|
||||
struct McClellanSummationIndex *h = (struct McClellanSummationIndex *)R_ExternalPtrAddr(e);
|
||||
@@ -10914,7 +10929,7 @@ SEXP wk_new_highs_new_lows_new(void) {
|
||||
}
|
||||
SEXP wk_new_highs_new_lows_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct NewHighsNewLows *h = (struct NewHighsNewLows *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_new_highs_new_lows_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_new_highs_new_lows_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_new_highs_new_lows_warmup_period(SEXP e) {
|
||||
struct NewHighsNewLows *h = (struct NewHighsNewLows *)R_ExternalPtrAddr(e);
|
||||
@@ -11870,7 +11885,7 @@ SEXP wk_percent_above_ma_new(void) {
|
||||
}
|
||||
SEXP wk_percent_above_ma_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct PercentAboveMa *h = (struct PercentAboveMa *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_percent_above_ma_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_percent_above_ma_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_percent_above_ma_warmup_period(SEXP e) {
|
||||
struct PercentAboveMa *h = (struct PercentAboveMa *)R_ExternalPtrAddr(e);
|
||||
@@ -17276,7 +17291,7 @@ SEXP wk_tick_index_new(void) {
|
||||
}
|
||||
SEXP wk_tick_index_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct TickIndex *h = (struct TickIndex *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_tick_index_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_tick_index_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_tick_index_warmup_period(SEXP e) {
|
||||
struct TickIndex *h = (struct TickIndex *)R_ExternalPtrAddr(e);
|
||||
@@ -17853,7 +17868,7 @@ SEXP wk_trin_new(void) {
|
||||
}
|
||||
SEXP wk_trin_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct Trin *h = (struct Trin *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_trin_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_trin_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_trin_warmup_period(SEXP e) {
|
||||
struct Trin *h = (struct Trin *)R_ExternalPtrAddr(e);
|
||||
@@ -18651,7 +18666,7 @@ SEXP wk_up_down_volume_ratio_new(void) {
|
||||
}
|
||||
SEXP wk_up_down_volume_ratio_update(SEXP e, SEXP a0, SEXP a1, SEXP a2, SEXP a3, SEXP a4, SEXP a5, SEXP a6) {
|
||||
struct UpDownVolumeRatio *h = (struct UpDownVolumeRatio *)R_ExternalPtrAddr(e);
|
||||
return Rf_ScalarReal(wickra_up_down_volume_ratio_update(h, (double *)REAL(a0), (double *)REAL(a1), (bool *)REAL(a2), (bool *)REAL(a3), (bool *)REAL(a4), (bool *)REAL(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
return Rf_ScalarReal(wickra_up_down_volume_ratio_update(h, (double *)REAL(a0), (double *)REAL(a1), wk_bool_vec(a2), wk_bool_vec(a3), wk_bool_vec(a4), wk_bool_vec(a5), (uintptr_t)Rf_xlength(a0), (int64_t)Rf_asReal(a6)));
|
||||
}
|
||||
SEXP wk_up_down_volume_ratio_warmup_period(SEXP e) {
|
||||
struct UpDownVolumeRatio *h = (struct UpDownVolumeRatio *)R_ExternalPtrAddr(e);
|
||||
|
||||
@@ -0,0 +1,518 @@
|
||||
# Code generated by gen_golden_test.py. DO NOT EDIT.
|
||||
# Per-indicator golden spec: canonical name, archetype, ctor params, output width.
|
||||
GOLDEN_SPECS <- list(
|
||||
list(canon="AbandonedBaby", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Abcd", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="AbsoluteBreadthIndex", arch="cross", params=c(), width=0L),
|
||||
list(canon="AccelerationBands", arch="multi_candle", params=c(14.0,2.0), width=3L),
|
||||
list(canon="AcceleratorOscillator", arch="scalar_candle", params=c(3.0,7.0,14.0), width=0L),
|
||||
list(canon="AdOscillator", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="AdVolumeLine", arch="cross", params=c(), width=0L),
|
||||
list(canon="AdaptiveCci", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="AdaptiveCycle", arch="scalar_f64", params=c(), width=0L),
|
||||
list(canon="AdaptiveLaguerreFilter", arch="scalar_f64", params=c(20.0), width=0L),
|
||||
list(canon="AdaptiveRsi", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Adl", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="AdvanceBlock", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="AdvanceDecline", arch="cross", params=c(), width=0L),
|
||||
list(canon="AdvanceDeclineRatio", arch="cross", params=c(), width=0L),
|
||||
list(canon="Adx", arch="multi_candle", params=c(14.0), width=3L),
|
||||
list(canon="Adxr", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="Alligator", arch="multi_candle", params=c(3.0,7.0,14.0), width=3L),
|
||||
list(canon="Alma", arch="scalar_f64", params=c(9.0,0.85,6.0), width=0L),
|
||||
list(canon="Alpha", arch="pairwise", params=c(14.0,2.0), width=0L),
|
||||
list(canon="AmihudIlliquidity", arch="trade", params=c(20.0), width=0L),
|
||||
list(canon="AnchoredRsi", arch="scalar_f64", params=c(), width=0L),
|
||||
list(canon="AnchoredVwap", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="AndrewsPitchfork", arch="multi_candle", params=c(14.0), width=3L),
|
||||
list(canon="Apo", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Aroon", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="AroonOscillator", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="Atr", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="AtrBands", arch="multi_candle", params=c(14.0,2.0), width=3L),
|
||||
list(canon="AtrRatchet", arch="multi_candle", params=c(14.0,2.0,0.5), width=2L),
|
||||
list(canon="AtrTrailingStop", arch="scalar_candle", params=c(14.0,2.0), width=0L),
|
||||
list(canon="AutoFib", arch="multi_candle", params=c(), width=7L),
|
||||
list(canon="Autocorrelation", arch="scalar_f64", params=c(10.0,1.0), width=0L),
|
||||
list(canon="AutocorrelationPeriodogram", arch="scalar_f64", params=c(10.0,48.0), width=0L),
|
||||
list(canon="AverageDailyRange", arch="scalar_candle", params=c(14.0,0.0), width=0L),
|
||||
list(canon="AverageDrawdown", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="AvgPrice", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="AwesomeOscillator", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="AwesomeOscillatorHistogram", arch="scalar_candle", params=c(3.0,7.0,14.0), width=0L),
|
||||
list(canon="BalanceOfPower", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="BandpassFilter", arch="scalar_f64", params=c(20.0,0.3), width=0L),
|
||||
list(canon="Bat", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="BeltHold", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Beta", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="BetaNeutralSpread", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="BetterVolume", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="BipowerVariation", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="BodySizePct", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="BollingerBands", arch="multi_f64", params=c(20.0,2.0), width=4L),
|
||||
list(canon="BollingerBandwidth", arch="scalar_f64", params=c(14.0,2.0), width=0L),
|
||||
list(canon="BomarBands", arch="multi_f64", params=c(4.0,0.85), width=3L),
|
||||
list(canon="BreadthThrust", arch="cross", params=c(10.0), width=0L),
|
||||
list(canon="Breakaway", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="BullishPercentIndex", arch="cross", params=c(), width=0L),
|
||||
list(canon="BurkeRatio", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Butterfly", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="CalendarSpread", arch="deriv", params=c(), width=0L),
|
||||
list(canon="CalmarRatio", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Camarilla", arch="multi_candle", params=c(), width=9L),
|
||||
list(canon="CandleVolume", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="Cci", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="CenterOfGravity", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="CentralPivotRange", arch="multi_candle", params=c(), width=3L),
|
||||
list(canon="Cfo", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="ChaikinMoneyFlow", arch="scalar_candle", params=c(20.0), width=0L),
|
||||
list(canon="ChaikinOscillator", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="ChaikinVolatility", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="ChandeKrollStop", arch="multi_candle", params=c(3.0,2.0,7.0), width=2L),
|
||||
list(canon="ChandelierExit", arch="multi_candle", params=c(14.0,2.0), width=2L),
|
||||
list(canon="ChoppinessIndex", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="ClassicPivots", arch="multi_candle", params=c(), width=7L),
|
||||
list(canon="CloseVsOpen", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="ClosingMarubozu", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Cmo", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="CoefficientOfVariation", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Cointegration", arch="multi_pairwise", params=c(40.0,1.0), width=3L),
|
||||
list(canon="CommonSenseRatio", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="CompositeProfile", arch="multi_candle", params=c(20.0,24.0,0.7), width=3L),
|
||||
list(canon="ConcealingBabySwallow", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="ConditionalValueAtRisk", arch="scalar_f64", params=c(20.0,0.95), width=0L),
|
||||
list(canon="ConnorsRsi", arch="scalar_f64", params=c(3.0,7.0,14.0), width=0L),
|
||||
list(canon="Coppock", arch="scalar_f64", params=c(3.0,7.0,14.0), width=0L),
|
||||
list(canon="CorrelationTrendIndicator", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Counterattack", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Crab", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="CumulativeVolumeDelta", arch="trade", params=c(), width=0L),
|
||||
list(canon="CumulativeVolumeIndex", arch="cross", params=c(), width=0L),
|
||||
list(canon="CupAndHandle", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="CyberneticCycle", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Cypher", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="DayOfWeekProfile", arch="profile_bins", params=c(0.0), width=7L),
|
||||
list(canon="Decycler", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="DecyclerOscillator", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Dema", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="DemandIndex", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="DemarkPivots", arch="multi_candle", params=c(), width=3L),
|
||||
list(canon="DepthSlope", arch="ob", params=c(), width=0L),
|
||||
list(canon="DerivativeOscillator", arch="scalar_f64", params=c(3.0,7.0,14.0,28.0), width=0L),
|
||||
list(canon="DetrendedStdDev", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="DisparityIndex", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="DistanceSsd", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="Doji", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="DojiStar", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="DollarBars", arch="bars_candle5", params=c(50000.0), width=0L),
|
||||
list(canon="Donchian", arch="multi_candle", params=c(14.0), width=3L),
|
||||
list(canon="DonchianStop", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="DoubleBollinger", arch="multi_f64", params=c(20.0,1.0,2.0), width=5L),
|
||||
list(canon="DoubleTopBottom", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="DownsideGapThreeMethods", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Dpo", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="DragonflyDoji", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="DrawdownDuration", arch="scalar_f64", params=c(), width=0L),
|
||||
list(canon="DumplingTop", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="Dx", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="DynamicMomentumIndex", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="EaseOfMovement", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="EffectiveSpread", arch="trademid", params=c(), width=0L),
|
||||
list(canon="EhlersStochastic", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Ehma", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="ElderImpulse", arch="scalar_f64", params=c(3.0,7.0,14.0,28.0), width=0L),
|
||||
list(canon="ElderRay", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="ElderSafeZone", arch="multi_candle", params=c(10.0,2.0), width=2L),
|
||||
list(canon="Ema", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="EmpiricalModeDecomposition", arch="scalar_f64", params=c(20.0,0.1), width=0L),
|
||||
list(canon="Engulfing", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Equivolume", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="EstimatedLeverageRatio", arch="deriv", params=c(), width=0L),
|
||||
list(canon="EvenBetterSinewave", arch="scalar_f64", params=c(40.0,10.0), width=0L),
|
||||
list(canon="EveningDojiStar", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Evwma", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="EwmaVolatility", arch="scalar_f64", params=c(0.94), width=0L),
|
||||
list(canon="Expectancy", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="FallingThreeMethods", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Fama", arch="scalar_f64", params=c(0.5,0.05), width=0L),
|
||||
list(canon="FibArcs", arch="multi_candle", params=c(), width=3L),
|
||||
list(canon="FibChannel", arch="multi_candle", params=c(), width=4L),
|
||||
list(canon="FibConfluence", arch="multi_candle", params=c(), width=2L),
|
||||
list(canon="FibExtension", arch="multi_candle", params=c(), width=5L),
|
||||
list(canon="FibFan", arch="multi_candle", params=c(), width=3L),
|
||||
list(canon="FibProjection", arch="multi_candle", params=c(), width=4L),
|
||||
list(canon="FibRetracement", arch="multi_candle", params=c(), width=7L),
|
||||
list(canon="FibTimeZones", arch="multi_candle", params=c(), width=2L),
|
||||
list(canon="FibonacciPivots", arch="multi_candle", params=c(), width=7L),
|
||||
list(canon="FisherRsi", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="FisherTransform", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="FlagPennant", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Footprint", arch="footprint", params=c(1.0), width=0L),
|
||||
list(canon="ForceIndex", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="FractalChaosBands", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="Frama", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="FryPanBottom", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="FundingBasis", arch="deriv", params=c(), width=0L),
|
||||
list(canon="FundingImpliedApr", arch="deriv", params=c(1095.0), width=0L),
|
||||
list(canon="FundingRate", arch="deriv", params=c(), width=0L),
|
||||
list(canon="FundingRateMean", arch="deriv", params=c(20.0), width=0L),
|
||||
list(canon="FundingRateZScore", arch="deriv", params=c(20.0), width=0L),
|
||||
list(canon="GainLossRatio", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="GainToPainRatio", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="GapSideBySideWhite", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Garch11", arch="scalar_f64", params=c(2e-06,0.1,0.88), width=0L),
|
||||
list(canon="GarmanKlassVolatility", arch="scalar_candle", params=c(20.0,252.0), width=0L),
|
||||
list(canon="Gartley", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="GatorOscillator", arch="multi_candle", params=c(3.0,7.0,14.0), width=2L),
|
||||
list(canon="GeneralizedDema", arch="scalar_f64", params=c(5.0,0.7), width=0L),
|
||||
list(canon="GeometricMa", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="GoldenPocket", arch="multi_candle", params=c(), width=3L),
|
||||
list(canon="GrangerCausality", arch="pairwise", params=c(60.0,1.0), width=0L),
|
||||
list(canon="GravestoneDoji", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Hammer", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="HangingMan", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Harami", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="HaramiCross", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="HasbrouckInformationShare", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="HeadAndShoulders", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="HeikinAshi", arch="multi_candle", params=c(), width=4L),
|
||||
list(canon="HeikinAshiOscillator", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="HiLoActivator", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="HighLowIndex", arch="cross", params=c(10.0), width=0L),
|
||||
list(canon="HighLowRange", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="HighLowVolumeNodes", arch="multi_candle", params=c(3.0,7.0), width=2L),
|
||||
list(canon="HighWave", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="HighpassFilter", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Hikkake", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="HikkakeModified", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="HilbertDominantCycle", arch="scalar_f64", params=c(), width=0L),
|
||||
list(canon="HistoricalVolatility", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Hma", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="HoltWinters", arch="scalar_f64", params=c(0.5,0.1), width=0L),
|
||||
list(canon="HomingPigeon", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="HtDcPhase", arch="scalar_f64", params=c(), width=0L),
|
||||
list(canon="HtPhasor", arch="multi_f64", params=c(), width=2L),
|
||||
list(canon="HtTrendMode", arch="scalar_f64", params=c(), width=0L),
|
||||
list(canon="HurstChannel", arch="multi_candle", params=c(14.0,2.0), width=3L),
|
||||
list(canon="HurstExponent", arch="scalar_f64", params=c(100.0,4.0), width=0L),
|
||||
list(canon="Ichimoku", arch="multi_candle", params=c(9.0,26.0,52.0,26.0), width=5L),
|
||||
list(canon="IdenticalThreeCrows", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="ImbalanceBars", arch="bars_candle4", params=c(5.0), width=0L),
|
||||
list(canon="InNeck", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Inertia", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="InformationRatio", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="InitialBalance", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="InstantaneousTrendline", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="IntradayIntensity", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="IntradayMomentumIndex", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="IntradayVolatilityProfile", arch="profile_bins", params=c(24.0,0.0), width=24L),
|
||||
list(canon="InverseFisherTransform", arch="scalar_f64", params=c(2.0), width=0L),
|
||||
list(canon="InvertedHammer", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="JarqueBera", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Jma", arch="scalar_f64", params=c(7.0,0.0,2.0), width=0L),
|
||||
list(canon="JumpIndicator", arch="scalar_f64", params=c(14.0,2.0), width=0L),
|
||||
list(canon="KRatio", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="KagiBars", arch="bars_close", params=c(2.0), width=0L),
|
||||
list(canon="KalmanHedgeRatio", arch="multi_pairwise", params=c(0.01,0.001), width=3L),
|
||||
list(canon="Kama", arch="scalar_f64", params=c(3.0,7.0,14.0), width=0L),
|
||||
list(canon="KaseDevStop", arch="multi_candle", params=c(14.0,2.0), width=2L),
|
||||
list(canon="KasePermissionStochastic", arch="multi_candle", params=c(3.0,7.0), width=2L),
|
||||
list(canon="KellyCriterion", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Keltner", arch="multi_candle", params=c(3.0,7.0,2.0), width=3L),
|
||||
list(canon="KendallTau", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="Kicking", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="KickingByLength", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Kst", arch="multi_f64", params=c(3.0,7.0,14.0,28.0,35.0,42.0,56.0,63.0,70.0), width=2L),
|
||||
list(canon="Kurtosis", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Kvo", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="KylesLambda", arch="trademid", params=c(20.0), width=0L),
|
||||
list(canon="LadderBottom", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="LaguerreRsi", arch="scalar_f64", params=c(0.5), width=0L),
|
||||
list(canon="LeadLagCrossCorrelation", arch="multi_pairwise", params=c(20.0,10.0), width=2L),
|
||||
list(canon="LinRegAngle", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="LinRegChannel", arch="multi_f64", params=c(14.0,2.0), width=3L),
|
||||
list(canon="LinRegIntercept", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="LinRegSlope", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="LinearRegression", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="LiquidationFeatures", arch="deriv_multi", params=c(), width=5L),
|
||||
list(canon="LogReturn", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="LongLeggedDoji", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="LongLine", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="LongShortRatio", arch="deriv", params=c(), width=0L),
|
||||
list(canon="M2Measure", arch="scalar_f64", params=c(14.0,2.0,0.5), width=0L),
|
||||
list(canon="MaEnvelope", arch="multi_f64", params=c(14.0,2.0), width=3L),
|
||||
list(canon="MacdExt", arch="multi_f64", params=c(12.0,0.0,26.0,0.0,9.0,0.0), width=3L),
|
||||
list(canon="MacdFix", arch="multi_f64", params=c(9.0), width=3L),
|
||||
list(canon="MacdHistogram", arch="scalar_f64", params=c(3.0,7.0,14.0), width=0L),
|
||||
list(canon="MacdIndicator", arch="multi_f64", params=c(12.0,26.0,9.0), width=3L),
|
||||
list(canon="Mama", arch="multi_f64", params=c(0.5,0.05), width=2L),
|
||||
list(canon="MarketFacilitationIndex", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="MartinRatio", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Marubozu", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="MassIndex", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="MatHold", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="MatchingLow", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="MaxDrawdown", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="McClellanOscillator", arch="cross", params=c(), width=0L),
|
||||
list(canon="McClellanSummationIndex", arch="cross", params=c(), width=0L),
|
||||
list(canon="McGinleyDynamic", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="MedianAbsoluteDeviation", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="MedianChannel", arch="multi_f64", params=c(14.0,2.0), width=3L),
|
||||
list(canon="MedianMa", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="MedianPrice", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Mfi", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="Microprice", arch="ob", params=c(), width=0L),
|
||||
list(canon="MidPoint", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="MidPrice", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="MinusDi", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="MinusDm", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="ModifiedMaStop", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="Mom", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="MorningDojiStar", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="MorningEveningStar", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="MurreyMathLines", arch="multi_candle", params=c(14.0), width=9L),
|
||||
list(canon="NakedPoc", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Natr", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="NewHighsNewLows", arch="cross", params=c(), width=0L),
|
||||
list(canon="NewPriceLines", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="Nrtr", arch="multi_candle", params=c(2.0), width=2L),
|
||||
list(canon="Nvi", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="OIPriceDivergence", arch="deriv", params=c(20.0), width=0L),
|
||||
list(canon="OIWeighted", arch="deriv", params=c(), width=0L),
|
||||
list(canon="Obv", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="OiToVolumeRatio", arch="deriv", params=c(), width=0L),
|
||||
list(canon="OmegaRatio", arch="scalar_f64", params=c(14.0,2.0), width=0L),
|
||||
list(canon="OnNeck", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="OpenInterestDelta", arch="deriv", params=c(), width=0L),
|
||||
list(canon="OpenInterestMomentum", arch="deriv", params=c(10.0), width=0L),
|
||||
list(canon="OpeningMarubozu", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="OpeningRange", arch="multi_candle", params=c(14.0), width=3L),
|
||||
list(canon="OrderBookImbalanceFull", arch="ob", params=c(), width=0L),
|
||||
list(canon="OrderBookImbalanceTop1", arch="ob", params=c(), width=0L),
|
||||
list(canon="OrderBookImbalanceTopN", arch="ob", params=c(5.0), width=0L),
|
||||
list(canon="OrderFlowImbalance", arch="ob", params=c(20.0), width=0L),
|
||||
list(canon="OuHalfLife", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="OvernightGap", arch="scalar_candle", params=c(0.0), width=0L),
|
||||
list(canon="OvernightIntradayReturn", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="PainIndex", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="PairSpreadZScore", arch="pairwise", params=c(20.0,20.0), width=0L),
|
||||
list(canon="PairwiseBeta", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="ParkinsonVolatility", arch="scalar_candle", params=c(20.0,252.0), width=0L),
|
||||
list(canon="PearsonCorrelation", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="PercentAboveMa", arch="cross", params=c(), width=0L),
|
||||
list(canon="PercentB", arch="scalar_f64", params=c(14.0,2.0), width=0L),
|
||||
list(canon="PercentageTrailingStop", arch="scalar_f64", params=c(2.0), width=0L),
|
||||
list(canon="PerpetualPremiumIndex", arch="deriv", params=c(), width=0L),
|
||||
list(canon="Pgo", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="PiercingDarkCloud", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Pin", arch="trade", params=c(20.0), width=0L),
|
||||
list(canon="PivotReversal", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="PlusDi", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="PlusDm", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="Pmo", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="PointAndFigureBars", arch="bars_close", params=c(2.0,3.0), width=0L),
|
||||
list(canon="PolarizedFractalEfficiency", arch="scalar_f64", params=c(10.0,5.0), width=0L),
|
||||
list(canon="Ppo", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="PpoHistogram", arch="scalar_f64", params=c(3.0,7.0,14.0), width=0L),
|
||||
list(canon="ProfileShape", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="ProfitFactor", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="ProjectionBands", arch="multi_candle", params=c(14.0), width=3L),
|
||||
list(canon="ProjectionOscillator", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="Psar", arch="scalar_candle", params=c(0.02,0.02,0.2), width=0L),
|
||||
list(canon="Pvi", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Qqe", arch="multi_f64", params=c(3.0,7.0,2.0), width=2L),
|
||||
list(canon="Qstick", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="QuartileBands", arch="multi_f64", params=c(14.0), width=3L),
|
||||
list(canon="QuotedSpread", arch="ob", params=c(), width=0L),
|
||||
list(canon="RSquared", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="RangeBars", arch="bars_close", params=c(2.0), width=0L),
|
||||
list(canon="RealizedSpread", arch="trademid", params=c(20.0), width=0L),
|
||||
list(canon="RealizedVolatility", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="RecoveryFactor", arch="scalar_f64", params=c(), width=0L),
|
||||
list(canon="RectangleRange", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Reflex", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="RegimeLabel", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="RelativeStrengthAB", arch="multi_pairwise", params=c(14.0,14.0), width=3L),
|
||||
list(canon="RenkoBars", arch="bars_close", params=c(2.0), width=0L),
|
||||
list(canon="RenkoTrailingStop", arch="scalar_f64", params=c(2.0), width=0L),
|
||||
list(canon="RickshawMan", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="RisingThreeMethods", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Rmi", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Roc", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Rocp", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Rocr", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Rocr100", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="RogersSatchellVolatility", arch="scalar_candle", params=c(20.0,252.0), width=0L),
|
||||
list(canon="RollMeasure", arch="trade", params=c(20.0), width=0L),
|
||||
list(canon="RollingCorrelation", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="RollingCovariance", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="RollingIqr", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="RollingMinMaxScaler", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="RollingPercentileRank", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="RollingQuantile", arch="scalar_f64", params=c(20.0,0.5), width=0L),
|
||||
list(canon="RollingVwap", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="RoofingFilter", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Rsi", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Rsx", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="RunBars", arch="bars_candle4", params=c(3.0), width=0L),
|
||||
list(canon="Rvi", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="RviVolatility", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Rwi", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="SampleEntropy", arch="scalar_f64", params=c(20.0,2.0,0.2), width=0L),
|
||||
list(canon="SarExt", arch="scalar_candle", params=c(2.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5), width=0L),
|
||||
list(canon="SeasonalZScore", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="SeparatingLines", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="SessionHighLow", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="SessionRange", arch="multi_candle", params=c(14.0), width=3L),
|
||||
list(canon="SessionVwap", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="ShannonEntropy", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Shark", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="SharpeRatio", arch="scalar_f64", params=c(14.0,2.0), width=0L),
|
||||
list(canon="ShootingStar", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="ShortLine", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="SignedVolume", arch="trade", params=c(), width=0L),
|
||||
list(canon="SineWave", arch="scalar_f64", params=c(), width=0L),
|
||||
list(canon="SineWeightedMa", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="SinglePrints", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Skewness", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Sma", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Smi", arch="scalar_candle", params=c(3.0,7.0,14.0), width=0L),
|
||||
list(canon="Smma", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="SmoothedHeikinAshi", arch="multi_candle", params=c(14.0), width=4L),
|
||||
list(canon="SortinoRatio", arch="scalar_f64", params=c(14.0,2.0), width=0L),
|
||||
list(canon="SpearmanCorrelation", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="SpinningTop", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="SpreadAr1Coefficient", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="SpreadBollingerBands", arch="multi_pairwise", params=c(14.0,2.0), width=4L),
|
||||
list(canon="SpreadHurst", arch="pairwise", params=c(14.0), width=0L),
|
||||
list(canon="StalledPattern", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="StandardError", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="StandardErrorBands", arch="multi_f64", params=c(14.0,2.0), width=3L),
|
||||
list(canon="StarcBands", arch="multi_candle", params=c(3.0,7.0,2.0), width=3L),
|
||||
list(canon="Stc", arch="scalar_f64", params=c(10.0,23.0,10.0,0.5), width=0L),
|
||||
list(canon="StdDev", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="StepTrailingStop", arch="scalar_f64", params=c(2.0), width=0L),
|
||||
list(canon="SterlingRatio", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="StickSandwich", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="StochRsi", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Stochastic", arch="multi_candle", params=c(3.0,7.0), width=2L),
|
||||
list(canon="StochasticCci", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="SuperSmoother", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="SuperTrend", arch="multi_candle", params=c(14.0,2.0), width=2L),
|
||||
list(canon="T3", arch="scalar_f64", params=c(5.0,0.7), width=0L),
|
||||
list(canon="TailRatio", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="TakerBuySellRatio", arch="deriv", params=c(), width=0L),
|
||||
list(canon="Takuri", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TasukiGap", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TdCamouflage", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TdClop", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TdClopwin", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TdCombo", arch="scalar_candle", params=c(3.0,7.0,14.0,28.0), width=0L),
|
||||
list(canon="TdCountdown", arch="scalar_candle", params=c(3.0,7.0,14.0,28.0), width=0L),
|
||||
list(canon="TdDWave", arch="scalar_candle", params=c(2.0), width=0L),
|
||||
list(canon="TdDeMarker", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="TdDifferential", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TdLines", arch="multi_candle", params=c(3.0,7.0), width=2L),
|
||||
list(canon="TdMovingAverage", arch="multi_candle", params=c(3.0,7.0), width=2L),
|
||||
list(canon="TdOpen", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TdPressure", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="TdPropulsion", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TdRangeProjection", arch="multi_candle", params=c(), width=2L),
|
||||
list(canon="TdRei", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="TdRiskLevel", arch="multi_candle", params=c(3.0,7.0), width=2L),
|
||||
list(canon="TdSequential", arch="multi_candle", params=c(3.0,7.0,14.0,28.0), width=3L),
|
||||
list(canon="TdSetup", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="TdTrap", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Tema", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="TermStructureBasis", arch="deriv", params=c(), width=0L),
|
||||
list(canon="ThreeDrives", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="ThreeInside", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="ThreeLineBreak", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="ThreeLineBreakBars", arch="bars_close", params=c(3.0), width=0L),
|
||||
list(canon="ThreeLineStrike", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="ThreeOutside", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="ThreeSoldiersOrCrows", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="ThreeStarsInSouth", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Thrusting", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TickBars", arch="bars_candle5", params=c(2.0), width=0L),
|
||||
list(canon="TickIndex", arch="cross", params=c(), width=0L),
|
||||
list(canon="Tii", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="TimeBasedStop", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="TimeOfDayReturnProfile", arch="profile_bins", params=c(24.0,0.0), width=24L),
|
||||
list(canon="TowerTopBottom", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TpoProfile", arch="profile_pricebins", params=c(30.0,50.0), width=52L),
|
||||
list(canon="TradeImbalance", arch="trade", params=c(20.0), width=0L),
|
||||
list(canon="TradeSignAutocorrelation", arch="trade", params=c(20.0), width=0L),
|
||||
list(canon="TradeVolumeIndex", arch="scalar_candle", params=c(2.0), width=0L),
|
||||
list(canon="TrendLabel", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="TrendStrengthIndex", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Trendflex", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="TreynorRatio", arch="pairwise", params=c(14.0,2.0), width=0L),
|
||||
list(canon="Triangle", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Trima", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Trin", arch="cross", params=c(), width=0L),
|
||||
list(canon="TripleTopBottom", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Tristar", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Trix", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="TrueRange", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="Tsf", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="TsfOscillator", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Tsi", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="Tsv", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="TtmSqueeze", arch="multi_candle", params=c(14.0,2.0,0.5), width=2L),
|
||||
list(canon="TtmTrend", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="TurnOfMonth", arch="scalar_candle", params=c(3.0,3.0,0.0), width=0L),
|
||||
list(canon="Tweezer", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TwiggsMoneyFlow", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="TwoCrows", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="TypicalPrice", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="UlcerIndex", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="UltimateOscillator", arch="scalar_candle", params=c(3.0,7.0,14.0), width=0L),
|
||||
list(canon="UniqueThreeRiver", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="UniversalOscillator", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="UpDownVolumeRatio", arch="cross", params=c(), width=0L),
|
||||
list(canon="UpsideGapThreeMethods", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="UpsideGapTwoCrows", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="UpsidePotentialRatio", arch="scalar_f64", params=c(14.0,2.0), width=0L),
|
||||
list(canon="ValueArea", arch="multi_candle", params=c(20.0,50.0,0.7), width=3L),
|
||||
list(canon="ValueAtRisk", arch="scalar_f64", params=c(20.0,0.95), width=0L),
|
||||
list(canon="Variance", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="VarianceRatio", arch="pairwise", params=c(60.0,2.0), width=0L),
|
||||
list(canon="VerticalHorizontalFilter", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Vidya", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="VolatilityCone", arch="multi_candle", params=c(3.0,7.0), width=5L),
|
||||
list(canon="VolatilityOfVolatility", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="VolatilityRatio", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="VoltyStop", arch="scalar_candle", params=c(14.0,2.0), width=0L),
|
||||
list(canon="VolumeBars", arch="bars_candle5", params=c(500.0), width=0L),
|
||||
list(canon="VolumeByTimeProfile", arch="profile_bins", params=c(24.0,0.0), width=24L),
|
||||
list(canon="VolumeOscillator", arch="scalar_candle", params=c(3.0,7.0), width=0L),
|
||||
list(canon="VolumePriceTrend", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="VolumeProfile", arch="profile_pricebins", params=c(20.0,50.0), width=52L),
|
||||
list(canon="VolumeRsi", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="VolumeWeightedMacd", arch="multi_candle", params=c(3.0,7.0,14.0), width=3L),
|
||||
list(canon="VolumeWeightedSr", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="Vortex", arch="multi_candle", params=c(14.0), width=2L),
|
||||
list(canon="Vpin", arch="trade", params=c(5000.0,10.0), width=0L),
|
||||
list(canon="Vwap", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="VwapStdDevBands", arch="multi_candle", params=c(2.0), width=4L),
|
||||
list(canon="Vwma", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="Vzo", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="Wad", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="WavePm", arch="scalar_f64", params=c(3.0,7.0), width=0L),
|
||||
list(canon="WaveTrend", arch="multi_candle", params=c(3.0,7.0,14.0), width=2L),
|
||||
list(canon="Wedge", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="WeightedClose", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="WickRatio", arch="scalar_candle", params=c(), width=0L),
|
||||
list(canon="WilliamsFractals", arch="multi_candle", params=c(), width=2L),
|
||||
list(canon="WilliamsR", arch="scalar_candle", params=c(14.0), width=0L),
|
||||
list(canon="WinRate", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="Wma", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="WoodiePivots", arch="multi_candle", params=c(), width=5L),
|
||||
list(canon="YangZhangVolatility", arch="scalar_candle", params=c(20.0,252.0), width=0L),
|
||||
list(canon="YoyoExit", arch="scalar_candle", params=c(14.0,2.0), width=0L),
|
||||
list(canon="ZScore", arch="scalar_f64", params=c(14.0), width=0L),
|
||||
list(canon="ZeroLagMacd", arch="multi_f64", params=c(3.0,7.0,14.0), width=3L),
|
||||
list(canon="ZigZag", arch="multi_candle", params=c(0.02), width=2L),
|
||||
list(canon="Zlema", arch="scalar_f64", params=c(14.0), width=0L)
|
||||
)
|
||||
@@ -0,0 +1,121 @@
|
||||
# Generic golden-fixture parity for the whole 514-indicator catalogue: every
|
||||
# indicator is reconstructed by its constructor, fed the synthetic stream derived
|
||||
# from the shared testdata/golden input (identical to gen_golden's Rust
|
||||
# construction) and checked bit-for-bit against g_<Canonical>.csv. One reflective
|
||||
# runner flattens scalar, multi-output, profile and bar shapes.
|
||||
#
|
||||
# Like test-golden.R, the fixtures live at the repo root and are not bundled into
|
||||
# the standalone package, so packaged checks (r-universe / CRAN) skip; the parity
|
||||
# is enforced by the monorepo CI. Specs are generated by gen_golden_test.py.
|
||||
|
||||
find_golden_dir_all <- function() {
|
||||
d <- normalizePath(getwd(), winslash = "/", mustWork = FALSE)
|
||||
repeat {
|
||||
g <- file.path(d, "testdata", "golden")
|
||||
if (dir.exists(g)) return(g)
|
||||
parent <- dirname(d)
|
||||
if (identical(parent, d)) return(NULL)
|
||||
d <- parent
|
||||
}
|
||||
}
|
||||
|
||||
golden_dir_all <- find_golden_dir_all()
|
||||
|
||||
test_that("all 514 indicators match the Rust golden fixtures", {
|
||||
skip_if(is.null(golden_dir_all), "golden fixtures not bundled with the package")
|
||||
source(test_path("golden_specs.R"), local = TRUE)
|
||||
|
||||
gcell <- function(s) {
|
||||
if (s == "nan") NA_real_ else if (s == "inf") Inf else if (s == "-inf") -Inf else as.numeric(s)
|
||||
}
|
||||
read_rows <- function(name) {
|
||||
lines <- readLines(file.path(golden_dir_all, paste0(name, ".csv")))[-1]
|
||||
lapply(lines, function(l) {
|
||||
if (nchar(l) == 0) return(numeric(0))
|
||||
vapply(strsplit(l, ",", fixed = TRUE)[[1]], gcell, numeric(1), USE.NAMES = FALSE)
|
||||
})
|
||||
}
|
||||
input_rows <- lapply(
|
||||
readLines(file.path(golden_dir_all, "input.csv"))[-1],
|
||||
function(l) as.numeric(strsplit(l, ",", fixed = TRUE)[[1]])
|
||||
)
|
||||
|
||||
deriv_fields <- function(r) {
|
||||
o <- r[1]; h <- r[2]; l <- r[3]; c <- r[4]; v <- r[5]
|
||||
c((c - o) / c * 0.01, c, c - 0.5, c + 1.0, v * 10, v * 0.6, v * 0.4,
|
||||
v * 0.55, v * 0.45, h - c, c - l)
|
||||
}
|
||||
cross_lists <- function(r) {
|
||||
o <- r[1]; c <- r[4]; v <- r[5]; j <- 0:4
|
||||
list(change = (c - o) + j, volume = v + j * 10,
|
||||
newHigh = as.numeric(j %% 2 == 0), newLow = as.numeric(j %% 3 == 0),
|
||||
aboveMa = as.numeric(j %% 2 == 0), onBuy = as.numeric(j %% 3 == 0))
|
||||
}
|
||||
ob_lists <- function(r) {
|
||||
c <- r[4]; v <- r[5]; k <- 1:5
|
||||
list(bp = c - 0.1 * k, bs = v / k, ap = c + 0.1 * k, asz = v * 0.9 / k)
|
||||
}
|
||||
flatten <- function(o, arch, width) {
|
||||
if (arch %in% c("profile_bins")) {
|
||||
if (is.null(o) || length(o) == 0 || all(is.na(o))) return(rep(NA_real_, width))
|
||||
return(as.numeric(o))
|
||||
}
|
||||
if (arch == "profile_pricebins") {
|
||||
if (is.list(o)) return(c(o$price_low, o$price_high, as.numeric(o$values)))
|
||||
return(rep(NA_real_, width))
|
||||
}
|
||||
if (arch %in% c("bars_close", "bars_candle4", "bars_candle5", "footprint")) {
|
||||
if (is.null(o) || length(o) == 0) return(numeric(0))
|
||||
if (is.matrix(o)) return(as.numeric(t(o)))
|
||||
return(as.numeric(o))
|
||||
}
|
||||
as.numeric(o)
|
||||
}
|
||||
|
||||
compute <- function(spec, ind, r, i) {
|
||||
o <- r[1]; h <- r[2]; l <- r[3]; cl <- r[4]; v <- r[5]; ts <- as.integer(i - 1)
|
||||
out <- switch(spec$arch,
|
||||
scalar_f64 = update(ind, cl),
|
||||
multi_f64 = update(ind, cl),
|
||||
pairwise = , multi_pairwise = update(ind, cl, o),
|
||||
scalar_candle = , multi_candle = , profile_bins = , profile_pricebins =
|
||||
update(ind, o, h, l, cl, v, ts),
|
||||
trade = update(ind, cl, v, cl >= o, ts),
|
||||
trademid = update(ind, cl, v, cl >= o, ts, (h + l) / 2),
|
||||
ob = { L <- ob_lists(r); update(ind, L$bp, L$bs, L$ap, L$asz) },
|
||||
cross = { L <- cross_lists(r)
|
||||
update(ind, L$change, L$volume, L$newHigh, L$newLow, L$aboveMa, L$onBuy, ts) },
|
||||
deriv = , deriv_multi = { d <- deriv_fields(r)
|
||||
do.call(update, c(list(ind), as.list(d), list(ts))) },
|
||||
bars_close = update(ind, cl, cl, cl, cl, 1, 0L),
|
||||
bars_candle4 = update(ind, o, h, l, cl, 1, 0L),
|
||||
bars_candle5 = update(ind, o, h, l, cl, v, 0L),
|
||||
footprint = update(ind, cl, v, cl >= o, ts),
|
||||
stop("arch ", spec$arch)
|
||||
)
|
||||
flatten(out, spec$arch, spec$width)
|
||||
}
|
||||
|
||||
for (spec in GOLDEN_SPECS) {
|
||||
ind <- do.call(get(spec$canon), as.list(spec$params))
|
||||
exp <- read_rows(paste0("g_", spec$canon))
|
||||
for (i in seq_along(input_rows)) {
|
||||
got <- compute(spec, ind, input_rows[[i]], i)
|
||||
want <- exp[[i]]
|
||||
expect_equal(length(got), length(want),
|
||||
info = sprintf("%s row %d arity", spec$canon, i))
|
||||
for (k in seq_along(want)) {
|
||||
w <- want[k]; g <- got[k]
|
||||
if (is.na(w)) {
|
||||
expect_true(is.na(g), info = sprintf("%s row %d col %d: want NA", spec$canon, i, k))
|
||||
} else if (is.infinite(w)) {
|
||||
expect_true(is.infinite(g) && sign(g) == sign(w),
|
||||
info = sprintf("%s row %d col %d: want %g", spec$canon, i, k, w))
|
||||
} else {
|
||||
expect_lte(abs(g - w), 1e-6 * max(1, abs(w)),
|
||||
label = sprintf("%s row %d col %d (got %s want %g)", spec$canon, i, k, as.character(g), w))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -117,3 +117,37 @@ test_that("multi-output ADX matches golden", {
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
# The four de-duplicated indicators, pinned against the Rust reference.
|
||||
|
||||
test_that("de-duplicated candle indicators match golden", {
|
||||
skip_if_no_golden()
|
||||
golden_input <- read_golden_input()
|
||||
specs <- list(
|
||||
list("ad_oscillator", AdOscillator()),
|
||||
list("intraday_intensity", IntradayIntensity()),
|
||||
list("awesome_oscillator_histogram", AwesomeOscillatorHistogram(5, 34, 1))
|
||||
)
|
||||
for (spec in specs) {
|
||||
name <- spec[[1]]
|
||||
ind <- spec[[2]]
|
||||
exp <- read_golden(name)
|
||||
for (i in seq_len(nrow(golden_input))) {
|
||||
got <- update(ind, golden_input$open[i], golden_input$high[i], golden_input$low[i],
|
||||
golden_input$close[i], golden_input$volume[i], i - 1)
|
||||
expect_close(got, gcell(exp[i, 1]), i, name)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
test_that("AverageDrawdown matches golden", {
|
||||
skip_if_no_golden()
|
||||
golden_input <- read_golden_input()
|
||||
avg <- AverageDrawdown(20)
|
||||
exp <- read_golden("average_drawdown")
|
||||
for (i in seq_len(nrow(golden_input))) {
|
||||
# generator fed the close column as the equity-curve sample.
|
||||
got <- update(avg, golden_input$close[i])
|
||||
expect_close(got, gcell(exp[i, 1]), i, "average_drawdown")
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user