Cyberpunk Value Trend Analyzer
entry_level = 30 (1–100) | exit_level = 75 (1–100) Overview
Cyberpunk Value Trend Analyzer is a multi-stage regime tool built around where the close sits inside the recent 75-bar range. That normalized close position is smoothed repeatedly to produce a fast value-trend line, while a lagged copy of the previous trend value is kept alongside it for crossover-style interpretation. The result is a bounded trend-strength read that acts more like a state machine than a simple one-line oscillator.
The indicator also computes a deviation index from a 13-bar close average and uses that as an overbought filter. Buy and sell markers are then generated from threshold crossings on the main trend line: a buy triggers when the trend rises through the entry level, and a sell triggers when it falls back below the exit level. Because the trend model depends on a full 75-bar rolling range, the output is intentionally inactive during the early warmup.
Defaults: Cyberpunk Value Trend Analyzer uses `entry_level = 30` and `exit_level = 75`.
Implementation Examples
Compute the full six-channel trend surface from OHLC slices or candle data.
use vector_ta::indicators::cyberpunk_value_trend_analyzer::{
cyberpunk_value_trend_analyzer,
CyberpunkValueTrendAnalyzerInput,
CyberpunkValueTrendAnalyzerParams,
};
use vector_ta::utilities::data_loader::{Candles, read_candles_from_csv};
let output = cyberpunk_value_trend_analyzer(&CyberpunkValueTrendAnalyzerInput::from_slices(
&open,
&high,
&low,
&close,
CyberpunkValueTrendAnalyzerParams::default(),
))?;
let candles: Candles = read_candles_from_csv("data/sample.csv")?;
let candle_output = cyberpunk_value_trend_analyzer(
&CyberpunkValueTrendAnalyzerInput::with_default_candles(&candles)
)?;
println!("trend = {:?}", output.value_trend.last());
println!("deviation = {:?}", output.deviation_index.last());
println!("buy signal = {:?}", candle_output.buy_signal.last()); API Reference
Input Methods ▼
// From candles
CyberpunkValueTrendAnalyzerInput::from_candles(
&Candles,
CyberpunkValueTrendAnalyzerParams,
) -> CyberpunkValueTrendAnalyzerInput
// From OHLC slices
CyberpunkValueTrendAnalyzerInput::from_slices(
&[f64], &[f64], &[f64], &[f64], CyberpunkValueTrendAnalyzerParams
) -> CyberpunkValueTrendAnalyzerInput
// From candles with default parameters
CyberpunkValueTrendAnalyzerInput::with_default_candles(&Candles)
-> CyberpunkValueTrendAnalyzerInput Parameters Structure ▼
pub struct CyberpunkValueTrendAnalyzerParams {
pub entry_level: Option<usize>, // default 30
pub exit_level: Option<usize>, // default 75
} Output Structure ▼
pub struct CyberpunkValueTrendAnalyzerOutput {
pub value_trend: Vec<f64>,
pub value_trend_lag: Vec<f64>,
pub deviation_index: Vec<f64>,
pub overbought_signal: Vec<f64>,
pub buy_signal: Vec<f64>,
pub sell_signal: Vec<f64>,
} Validation, Warmup & NaNs ▼
- Open, high, low, and close must all be non-empty slices with identical lengths.
entry_levelandexit_levelmust both stay within1..=100.- The longest contiguous valid OHLC run must be at least
75bars or the indicator returnsNotEnoughValidData. - If streaming hits a non-finite OHLC bar it resets its internal rolling state.
- Before the 75-bar range is established, the value-trend path remains inactive and the event signals stay non-actionable.
- Batch mode rejects invalid integer ranges, overflowed shapes, and unsupported kernels.
- All six in-place output buffers for batch and WASM low-level entry points must match the required flattened matrix size.
Builder, Streaming & Batch APIs ▼
// Builder
CyberpunkValueTrendAnalyzerBuilder::new()
.entry_level(usize)
.exit_level(usize)
.kernel(Kernel)
.apply_slices(&[f64], &[f64], &[f64], &[f64])
CyberpunkValueTrendAnalyzerBuilder::new()
.apply(&Candles)
CyberpunkValueTrendAnalyzerBuilder::new()
.into_stream()
// Stream
CyberpunkValueTrendAnalyzerStream::try_new(CyberpunkValueTrendAnalyzerParams)
CyberpunkValueTrendAnalyzerStream::update(open, high, low, close)
-> Option<(f64, f64, f64, f64, f64, f64)>
// Batch
CyberpunkValueTrendAnalyzerBatchBuilder::new()
.entry_level_range(start, end, step)
.entry_level_static(usize)
.exit_level_range(start, end, step)
.exit_level_static(usize)
.kernel(Kernel)
.apply_slices(&[f64], &[f64], &[f64], &[f64]) Error Handling ▼
pub enum CyberpunkValueTrendAnalyzerError {
EmptyInputData,
InputLengthMismatch { open_len: usize, high_len: usize, low_len: usize, close_len: usize },
AllValuesNaN,
InvalidEntryLevel { entry_level: usize },
InvalidExitLevel { exit_level: usize },
NotEnoughValidData { needed: usize, valid: usize },
OutputLengthMismatch { expected: usize, got: usize },
MismatchedOutputLen { dst_len: usize, expected_len: usize },
InvalidRange { start: String, end: String, step: String },
InvalidKernel(Kernel),
InvalidKernelForBatch(Kernel),
InvalidInput { msg: String },
} Python Bindings
Python exposes a tuple-returning single-run function, a streaming class, and a batch function. The single-run binding returns six NumPy arrays in order: value_trend, value_trend_lag, deviation_index, overbought_signal, buy_signal, and sell_signal. Batch returns those same channels as matrices plus the tested entry and exit levels together with rows and cols.
import numpy as np
from vector_ta import (
cyberpunk_value_trend_analyzer,
cyberpunk_value_trend_analyzer_batch,
CyberpunkValueTrendAnalyzerStream,
)
open_ = np.asarray(open_values, dtype=np.float64)
high = np.asarray(high_values, dtype=np.float64)
low = np.asarray(low_values, dtype=np.float64)
close = np.asarray(close_values, dtype=np.float64)
value_trend, value_trend_lag, deviation_index, overbought_signal, buy_signal, sell_signal = (
cyberpunk_value_trend_analyzer(
open_,
high,
low,
close,
entry_level=30,
exit_level=75,
kernel="auto",
)
)
stream = CyberpunkValueTrendAnalyzerStream(entry_level=30, exit_level=75)
print(stream.update(open_[-1], high[-1], low[-1], close[-1]))
batch = cyberpunk_value_trend_analyzer_batch(
open_,
high,
low,
close,
entry_level_range=(20, 40, 10),
exit_level_range=(70, 90, 10),
kernel="auto",
)
print(batch["entry_levels"], batch["exit_levels"], batch["rows"], batch["cols"]) JavaScript/WASM Bindings
The WASM layer exposes object-returning single-run and batch wrappers plus low-level allocation and in-place exports. The standard JavaScript wrapper returns the six output arrays directly, while the batch wrapper adds rows, cols, and a combos array containing the tested entry or exit level pairs.
import init, {
cyberpunk_value_trend_analyzer_js,
cyberpunk_value_trend_analyzer_batch_js,
} from "/pkg/vector_ta.js";
await init();
const open = new Float64Array(openValues);
const high = new Float64Array(highValues);
const low = new Float64Array(lowValues);
const close = new Float64Array(closeValues);
const result = cyberpunk_value_trend_analyzer_js(
open,
high,
low,
close,
30,
75,
);
console.log(result.value_trend, result.buy_signal);
const batch = cyberpunk_value_trend_analyzer_batch_js(open, high, low, close, {
entry_level_range: [20, 40, 10],
exit_level_range: [70, 90, 10],
});
console.log(batch.combos, batch.rows, batch.cols); CUDA Bindings (Rust)
Additional details for the CUDA bindings can be found inside the VectorTA repository.
Performance Analysis
Across sizes, Rust CPU runs about 1.14× faster than Tulip C in this benchmark.
AMD Ryzen 9 9950X (CPU) | NVIDIA RTX 4090 (GPU)