MESA Stochastic Multi Length
length_1 = 48 | length_2 = 21 | length_3 = 9 | length_4 = 6 | trigger_length = 2 Overview
MESA Stochastic Multi Length runs one shared filtered source stream, then evaluates that filtered signal across
four stochastic lookbacks. The result is eight aligned output series: mesa_1, mesa_2,
mesa_3, mesa_4, and matching trigger lines trigger_1 through
trigger_4. Each trigger is a rolling SMA of its corresponding MESA line.
Candle-based input defaults to close. The default parameter set is length_1 = 48,
length_2 = 21, length_3 = 9, length_4 = 6, and
trigger_length = 2. In Rust, the stream API returns a raw eight-value tuple on every update rather
than an Option, so warmup and invalid bars appear as NaN values inside the tuple.
Defaults: source = close, lengths = 48 / 21 / 9 / 6, trigger length = 2.
Implementation Examples
Calculate all four MESA lines and their four trigger lines from a slice or from candles:
use vector_ta::indicators::mesa_stochastic_multi_length::{
mesa_stochastic_multi_length, MesaStochasticMultiLengthInput, MesaStochasticMultiLengthParams,
};
use vector_ta::utilities::data_loader::{Candles, read_candles_from_csv};
let source = vec![101.0, 101.4, 101.1, 102.2, 102.8, 102.5, 103.1];
let input = MesaStochasticMultiLengthInput::from_slice(
&source,
MesaStochasticMultiLengthParams {
length_1: Some(48),
length_2: Some(21),
length_3: Some(9),
length_4: Some(6),
trigger_length: Some(2),
},
);
let out = mesa_stochastic_multi_length(&input)?;
println!("{:?}", out.mesa_1);
println!("{:?}", out.trigger_1);
println!("{:?}", out.mesa_4);
println!("{:?}", out.trigger_4);
// Candle helper defaults to close
let candles: Candles = read_candles_from_csv("data/sample.csv")?;
let out = mesa_stochastic_multi_length(
&MesaStochasticMultiLengthInput::with_default_candles(&candles)
)?; API Reference
Input Methods ▼
MesaStochasticMultiLengthInput::from_candles(
&Candles,
source: &str,
MesaStochasticMultiLengthParams,
) -> MesaStochasticMultiLengthInput
MesaStochasticMultiLengthInput::from_slice(
&[f64],
MesaStochasticMultiLengthParams,
) -> MesaStochasticMultiLengthInput
MesaStochasticMultiLengthInput::from_slices(
&[f64],
MesaStochasticMultiLengthParams,
) -> MesaStochasticMultiLengthInput
MesaStochasticMultiLengthInput::with_default_candles(&Candles) -> MesaStochasticMultiLengthInput Parameters Structure ▼
pub struct MesaStochasticMultiLengthParams {
pub length_1: Option<usize>,
pub length_2: Option<usize>,
pub length_3: Option<usize>,
pub length_4: Option<usize>,
pub trigger_length: Option<usize>,
}
// Defaults
length_1 = 48
length_2 = 21
length_3 = 9
length_4 = 6
trigger_length = 2 Output Structure ▼
pub struct MesaStochasticMultiLengthOutput {
pub mesa_1: Vec<f64>,
pub mesa_2: Vec<f64>,
pub mesa_3: Vec<f64>,
pub mesa_4: Vec<f64>,
pub trigger_1: Vec<f64>,
pub trigger_2: Vec<f64>,
pub trigger_3: Vec<f64>,
pub trigger_4: Vec<f64>,
} Builders, Batch Range, and Stream ▼
MesaStochasticMultiLengthBuilder::new()exposessource(),length_1(),length_2(),length_3(),length_4(),trigger_length(),kernel(),apply(),apply_slice(), andinto_stream().MesaStochasticMultiLengthStream::try_new(params)validates that every length is greater than zero.MesaStochasticMultiLengthStream::update(source)returns(f64, f64, f64, f64, f64, f64, f64, f64)inmesa_1..mesa_4, thentrigger_1..trigger_4order.- The stream has no public
reset()orget_warmup_period()method. MesaStochasticMultiLengthBatchRangesweepslength_1,length_2,length_3,length_4, andtrigger_lengthas(start, end, step)tuples.- Default batch ranges are
(48,48,0),(21,21,0),(9,9,0),(6,6,0), and(2,2,0). - Range rules are strict:
startmust be non-zero,step == 0requiresstart == end, and stepped ranges must be ascending and inclusive. - Batch output is flattened row-major across
rows * colsfor each of the eight returned series, pluscombos,rows, andcols.
Validation and Error Conditions ▼
EmptyInputDatais returned when the source slice is empty.AllValuesNaNis returned when the source contains no finite values.InvalidPeriodis returned when any length or trigger length is zero.OutputLengthMismatchis used by the into-slice path when any output slice length differs from the input length.InvalidRangeis returned for invalid batch tuples.InvalidKernelForBatchcan be returned by batch execution when the selected kernel is not allowed.
Python Bindings
Standard Usage ▼
The Python function returns a dict of NumPy arrays with the eight output keys:
import numpy as np
from vector_ta import mesa_stochastic_multi_length
source = np.asarray(close, dtype=np.float64)
out = mesa_stochastic_multi_length(
source,
length_1=48,
length_2=21,
length_3=9,
length_4=6,
trigger_length=2,
)
print(out["mesa_1"])
print(out["trigger_1"])
print(out["mesa_4"])
print(out["trigger_4"]) Streaming ▼
MesaStochasticMultiLengthStream returns a dict snapshot on each update:
from vector_ta import MesaStochasticMultiLengthStream
stream = MesaStochasticMultiLengthStream(
length_1=48,
length_2=21,
length_3=9,
length_4=6,
trigger_length=2,
)
for value in source:
point = stream.update(float(value))
print(point["mesa_1"], point["trigger_1"]) Batch Processing ▼
Batch output is a dict containing eight reshaped output arrays plus per-row parameter vectors:
from vector_ta import mesa_stochastic_multi_length_batch
batch = mesa_stochastic_multi_length_batch(
source,
length_1_range=(32, 64, 16),
length_2_range=(14, 28, 7),
length_3_range=(9, 9, 0),
length_4_range=(6, 6, 0),
trigger_length_range=(2, 4, 1),
)
print(batch["mesa_1"].shape) # (rows, cols)
print(batch["trigger_1"].shape) # (rows, cols)
print(batch["length_1"])
print(batch["trigger_length"])
print(batch["rows"], batch["cols"]) JavaScript/WASM Bindings
Standard Usage ▼
The high-level JS call returns an object with the same eight field names as the Rust output:
import init, { mesa_stochastic_multi_length_js } from 'vectorta-wasm';
await init();
const source = new Float64Array(close);
const out = mesa_stochastic_multi_length_js(source, 48, 21, 9, 6, 2) as {
mesa_1: number[];
mesa_2: number[];
mesa_3: number[];
mesa_4: number[];
trigger_1: number[];
trigger_2: number[];
trigger_3: number[];
trigger_4: number[];
};
console.log(out.mesa_1);
console.log(out.trigger_1); Batch Processing ▼
Batch config uses five [start, end, step] arrays. The returned object carries flattened output
arrays, parameter vectors, and rows/cols metadata:
import { mesa_stochastic_multi_length_batch_js } from 'vectorta-wasm';
const batch = mesa_stochastic_multi_length_batch_js(source, {
length_1_range: [32, 64, 16],
length_2_range: [14, 28, 7],
length_3_range: [9, 9, 0],
length_4_range: [6, 6, 0],
trigger_length_range: [2, 4, 1],
}) as {
mesa_1: number[];
mesa_2: number[];
mesa_3: number[];
mesa_4: number[];
trigger_1: number[];
trigger_2: number[];
trigger_3: number[];
trigger_4: number[];
length_1: number[];
length_2: number[];
length_3: number[];
length_4: number[];
trigger_length: number[];
rows: number;
cols: number;
};
console.log(batch.rows, batch.cols);
console.log(batch.length_1);
console.log(batch.trigger_length); Low-Level Memory API ▼
WASM also exposes raw buffer helpers for manual memory management. There is no JS stream class export for this indicator.
mesa_stochastic_multi_length_alloc(len: number): number
mesa_stochastic_multi_length_free(ptr: number, len: number): void
mesa_stochastic_multi_length_into(
source_ptr: number,
mesa_1_ptr: number,
mesa_2_ptr: number,
mesa_3_ptr: number,
mesa_4_ptr: number,
trigger_1_ptr: number,
trigger_2_ptr: number,
trigger_3_ptr: number,
trigger_4_ptr: number,
len: number,
length_1: number,
length_2: number,
length_3: number,
length_4: number,
trigger_length: number
): void
mesa_stochastic_multi_length_batch_into(
source_ptr: number,
mesa_1_ptr: number,
mesa_2_ptr: number,
mesa_3_ptr: number,
mesa_4_ptr: number,
trigger_1_ptr: number,
trigger_2_ptr: number,
trigger_3_ptr: number,
trigger_4_ptr: number,
len: number,
length_1_start: number,
length_1_end: number,
length_1_step: number,
length_2_start: number,
length_2_end: number,
length_2_step: number,
length_3_start: number,
length_3_end: number,
length_3_step: number,
length_4_start: number,
length_4_end: number,
length_4_step: number,
trigger_length_start: number,
trigger_length_end: number,
trigger_length_step: number
): number 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)