Skip to main content

vector_ta/indicators/
registry.rs

1use crate::indicators::moving_averages::param_schema::{ma_param_schema, MaParamKind};
2use crate::indicators::moving_averages::registry::list_moving_averages;
3use once_cell::sync::Lazy;
4use serde::Serialize;
5use std::collections::HashMap;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
8#[serde(rename_all = "snake_case")]
9pub enum IndicatorParamKind {
10    Int,
11    Float,
12    Bool,
13    EnumString,
14}
15
16#[derive(Debug, Clone, Copy, PartialEq, Serialize)]
17#[serde(rename_all = "snake_case")]
18pub enum ParamValueStatic {
19    Int(i64),
20    Float(f64),
21    Bool(bool),
22    EnumString(&'static str),
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
26#[serde(rename_all = "snake_case")]
27pub enum IndicatorValueType {
28    F64,
29    F32,
30    I32,
31    Bool,
32}
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
35#[serde(rename_all = "snake_case")]
36pub enum IndicatorInputKind {
37    Slice,
38    Candles,
39    Ohlc,
40    Ohlcv,
41    HighLow,
42    CloseVolume,
43}
44
45#[derive(Debug, Clone, Serialize)]
46pub struct IndicatorParamInfo {
47    pub key: &'static str,
48    pub label: &'static str,
49    pub kind: IndicatorParamKind,
50    pub required: bool,
51    pub default: Option<ParamValueStatic>,
52    pub min: Option<f64>,
53    pub max: Option<f64>,
54    pub step: Option<f64>,
55    pub enum_values: &'static [&'static str],
56    pub notes: Option<&'static str>,
57}
58
59#[derive(Debug, Clone, Copy, Serialize)]
60pub struct IndicatorOutputInfo {
61    pub id: &'static str,
62    pub label: &'static str,
63    pub value_type: IndicatorValueType,
64}
65
66#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
67pub struct IndicatorCapabilities {
68    pub supports_cpu_single: bool,
69    pub supports_cpu_batch: bool,
70    pub supports_cuda_single: bool,
71    pub supports_cuda_batch: bool,
72    pub supports_cuda_vram: bool,
73}
74
75#[derive(Debug, Clone, Serialize)]
76pub struct IndicatorInfo {
77    pub id: &'static str,
78    pub label: &'static str,
79    pub category: &'static str,
80    pub dynamic_strategy_eligible: bool,
81    pub input_kind: IndicatorInputKind,
82    pub outputs: Vec<IndicatorOutputInfo>,
83    pub params: Vec<IndicatorParamInfo>,
84    pub capabilities: IndicatorCapabilities,
85    pub notes: Option<&'static str>,
86}
87
88const BUCKET_B_INDICATORS: &[&str] = &[
89    "acosc",
90    "adaptive_bounds_rsi",
91    "adjustable_ma_alternating_extremities",
92    "alligator",
93    "alphatrend",
94    "aroon",
95    "aso",
96    "bandpass",
97    "bollinger_bands_width",
98    "chande",
99    "chandelier_exit",
100    "cksp",
101    "correlation_cycle",
102    "cyberpunk_value_trend_analyzer",
103    "damiani_volatmeter",
104    "di",
105    "dm",
106    "donchian",
107    "ehlers_adaptive_cg",
108    "adaptive_momentum_oscillator",
109    "dvdiqqe",
110    "emd_trend",
111    "emd",
112    "eri",
113    "evasive_supertrend",
114    "reversal_signals",
115    "fisher",
116    "fvg_positioning_average",
117    "fvg_trailing_stop",
118    "market_structure_trailing_stop",
119    "gatorosc",
120    "halftrend",
121    "hypertrend",
122    "adaptive_schaff_trend_cycle",
123    "smoothed_gaussian_trend_filter",
124    "ict_propulsion_block",
125    "kdj",
126    "keltner",
127    "kst",
128    "lpc",
129    "mab",
130    "macz",
131    "mama",
132    "minmax",
133    "msw",
134    "nadaraya_watson_envelope",
135    "otto",
136    "pma",
137    "prb",
138    "qqe",
139    "qqe_weighted_oscillator",
140    "market_structure_confluence",
141    "range_filtered_trend_signals",
142    "range_oscillator",
143    "volume_weighted_relative_strength_index",
144    "range_filter",
145    "rsmk",
146    "squeeze_momentum",
147    "srsi",
148    "supertrend",
149    "supertrend_oscillator",
150    "vi",
151    "voss",
152    "wavetrend",
153    "wto",
154    "ehlers_pma",
155    "buff_averages",
156    "vwap",
157    "pivot",
158    "normalized_volume_true_range",
159];
160
161const EMPTY_ENUM_VALUES: &[&str] = &[];
162const ENUM_VALUES_TRUE_FALSE: &[&str] = &["true", "false"];
163const ENUM_VALUES_DEMAND_INDEX_MA_TYPE: &[&str] = &["ema", "sma", "wma", "rma"];
164const ENUM_VALUES_EHLERS_LINEAR_EXTRAPOLATION_SIGNAL_MODE: &[&str] = &[
165    "predict_filter_crosses",
166    "predict_middle_crosses",
167    "filter_middle_crosses",
168];
169const ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE: &[&str] = &[
170    "open", "high", "low", "close", "hl2", "hlc3", "ohlc4", "hlcc4",
171];
172const ENUM_VALUES_HALF_CAUSAL_ESTIMATOR_SOURCE: &[&str] = &["volume", "tr", "change", "test"];
173const ENUM_VALUES_HALF_CAUSAL_ESTIMATOR_KERNEL_TYPE: &[&str] =
174    &["gaussian", "epanechnikov", "triangular", "sinc"];
175const ENUM_VALUES_HALF_CAUSAL_ESTIMATOR_CONFIDENCE_ADJUST: &[&str] =
176    &["symmetric", "linear", "none"];
177const ENUM_VALUES_FIBONACCI_TRAILING_STOP_TRIGGER: &[&str] = &["close", "wick"];
178const ENUM_VALUES_FIBONACCI_ENTRY_BANDS_SOURCE: &[&str] = &[
179    "open", "high", "low", "close", "hl2", "hlc3", "ohlc4", "hlcc4",
180];
181const ENUM_VALUES_FIBONACCI_ENTRY_BANDS_TP_AGGRESSIVENESS: &[&str] = &["low", "medium", "high"];
182const ENUM_VALUES_MULTI_LENGTH_STOCHASTIC_AVERAGE_METHOD: &[&str] = &["none", "sma", "tma", "lsma"];
183const ENUM_VALUES_MONOTONICITY_INDEX_MODE: &[&str] = &["complexity", "efficiency"];
184const ENUM_VALUES_MA_OUTPUT: &[&str] = &["mama", "fama"];
185const ENUM_VALUES_PMA_OUTPUT: &[&str] = &["predict", "trigger"];
186const ENUM_VALUES_EHLERS_ADAPTIVE_CG_OUTPUT: &[&str] = &["cg", "trigger"];
187const ENUM_VALUES_ADAPTIVE_MOMENTUM_OSCILLATOR_OUTPUT: &[&str] = &["amo", "ama"];
188const ENUM_VALUES_BUFF_OUTPUT: &[&str] = &["fast", "slow"];
189const ENUM_VALUES_GMMA_TYPE: &[&str] = &["guppy", "super_guppy"];
190const ENUM_VALUES_CANDLE_STRENGTH_OSCILLATOR_MODE: &[&str] = &["bollinger", "donchian"];
191const ENUM_VALUES_N_ORDER_EMA_STYLE: &[&str] = &["ema", "dema", "hema", "tema"];
192const ENUM_VALUES_N_ORDER_EMA_IIR_STYLE: &[&str] =
193    &["all_pole", "impulse_matched", "matched_z", "bilinear"];
194const ENUM_VALUES_FVG_POSITIONING_AVERAGE_LOOKBACK_TYPE: &[&str] = &["Bar Count", "FVG Count"];
195const ENUM_VALUES_MS_TS_RESET_ON: &[&str] = &["CHoCH", "All"];
196const ENUM_VALUES_PRICE_SOURCE: &[&str] = &[
197    "open", "high", "low", "close", "hl2", "hlc3", "ohlc4", "hlcc4",
198];
199const ENUM_VALUES_VDO_SESSION_MODE: &[&str] =
200    &["4_hours", "daily", "weekly", "rolling_bars", "rolling_days"];
201const ENUM_VALUES_VDO_DEVIATION_MODE: &[&str] = &["percent", "absolute", "zscore"];
202const ENUM_VALUES_ICHI_NORMALIZE_MODE: &[&str] = &["all", "window", "disabled"];
203const ENUM_VALUES_STATISTICAL_TRAILING_STOP_BASE_LEVEL: &[&str] =
204    &["level0", "level1", "level2", "level3"];
205const ENUM_VALUES_EDCT3_OUTPUT: &[&str] = &["corrected", "t3"];
206const ENUM_VALUES_NORMALIZED_VOLUME_TRUE_RANGE_OUTPUT: &[&str] = &[
207    "normalized_volume",
208    "normalized_true_range",
209    "baseline",
210    "atr",
211    "average_volume",
212];
213const ENUM_VALUES_MOVING_AVERAGE_CROSS_PROBABILITY_MA_TYPE: &[&str] = &["ema", "sma"];
214const ENUM_VALUES_BULLS_V_BEARS_MA_TYPE: &[&str] = &["ema", "sma", "wma"];
215const ENUM_VALUES_BULLS_V_BEARS_CALCULATION_METHOD: &[&str] = &["normalized", "raw"];
216const ENUM_VALUES_SMOOTH_THEIL_SEN_STAT_STYLE: &[&str] = &["mean", "smooth_median", "median"];
217const ENUM_VALUES_SMOOTH_THEIL_SEN_DEVIATION_STYLE: &[&str] = &["mad", "rmsd"];
218const ENUM_VALUES_PMARP_MA_TYPE: &[&str] = &["sma", "ema", "hma", "rma", "vwma"];
219const ENUM_VALUES_PMARP_LINE_MODE: &[&str] = &["pmar", "pmarp"];
220const ENUM_VALUES_EMD_TREND_SOURCE: &[&str] = &[
221    "open", "high", "low", "close", "oc2", "hl2", "occ3", "hlc3", "ohlc4", "hlcc4",
222];
223const ENUM_VALUES_EMD_TREND_AVG_TYPE: &[&str] =
224    &["SMA", "EMA", "HMA", "DEMA", "TEMA", "RMA", "FRAMA"];
225
226const OUTPUT_VALUE_F64: IndicatorOutputInfo = IndicatorOutputInfo {
227    id: "value",
228    label: "Value",
229    value_type: IndicatorValueType::F64,
230};
231
232const OUTPUT_VALUE_BOOL: IndicatorOutputInfo = IndicatorOutputInfo {
233    id: "value",
234    label: "Value",
235    value_type: IndicatorValueType::Bool,
236};
237
238const OUTPUT_MATRIX: IndicatorOutputInfo = IndicatorOutputInfo {
239    id: "matrix",
240    label: "Matrix",
241    value_type: IndicatorValueType::Bool,
242};
243
244const OUTPUT_MACD: IndicatorOutputInfo = IndicatorOutputInfo {
245    id: "macd",
246    label: "MACD",
247    value_type: IndicatorValueType::F64,
248};
249const OUTPUT_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
250    id: "signal",
251    label: "Signal",
252    value_type: IndicatorValueType::F64,
253};
254const OUTPUT_INDEX: IndicatorOutputInfo = IndicatorOutputInfo {
255    id: "index",
256    label: "Index",
257    value_type: IndicatorValueType::F64,
258};
259const OUTPUT_CUMULATIVE_MEAN: IndicatorOutputInfo = IndicatorOutputInfo {
260    id: "cumulative_mean",
261    label: "Cumulative Mean",
262    value_type: IndicatorValueType::F64,
263};
264const OUTPUT_TRAILING_STOP: IndicatorOutputInfo = IndicatorOutputInfo {
265    id: "trailing_stop",
266    label: "Trailing Stop",
267    value_type: IndicatorValueType::F64,
268};
269const OUTPUT_DIRECTION: IndicatorOutputInfo = IndicatorOutputInfo {
270    id: "direction",
271    label: "Direction",
272    value_type: IndicatorValueType::F64,
273};
274const OUTPUT_UPPER_BOUND: IndicatorOutputInfo = IndicatorOutputInfo {
275    id: "upper_bound",
276    label: "Upper Bound",
277    value_type: IndicatorValueType::F64,
278};
279const OUTPUT_IN_PHASE: IndicatorOutputInfo = IndicatorOutputInfo {
280    id: "in_phase",
281    label: "In Phase",
282    value_type: IndicatorValueType::F64,
283};
284const OUTPUT_LEAD_SERIES: IndicatorOutputInfo = IndicatorOutputInfo {
285    id: "lead",
286    label: "Lead",
287    value_type: IndicatorValueType::F64,
288};
289const OUTPUT_SHORT: IndicatorOutputInfo = IndicatorOutputInfo {
290    id: "short",
291    label: "Short",
292    value_type: IndicatorValueType::F64,
293};
294const OUTPUT_LONG: IndicatorOutputInfo = IndicatorOutputInfo {
295    id: "long",
296    label: "Long",
297    value_type: IndicatorValueType::F64,
298};
299const OUTPUT_CROSSOVER: IndicatorOutputInfo = IndicatorOutputInfo {
300    id: "crossover",
301    label: "Crossover",
302    value_type: IndicatorValueType::F64,
303};
304const OUTPUT_CROSSUNDER: IndicatorOutputInfo = IndicatorOutputInfo {
305    id: "crossunder",
306    label: "Crossunder",
307    value_type: IndicatorValueType::F64,
308};
309const OUTPUT_DEMAND_INDEX: IndicatorOutputInfo = IndicatorOutputInfo {
310    id: "demand_index",
311    label: "Demand Index",
312    value_type: IndicatorValueType::F64,
313};
314const OUTPUT_ZVWAP: IndicatorOutputInfo = IndicatorOutputInfo {
315    id: "zvwap",
316    label: "ZVWAP",
317    value_type: IndicatorValueType::F64,
318};
319const OUTPUT_SUPPORT_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
320    id: "support_signal",
321    label: "Support Signal",
322    value_type: IndicatorValueType::F64,
323};
324const OUTPUT_RESISTANCE_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
325    id: "resistance_signal",
326    label: "Resistance Signal",
327    value_type: IndicatorValueType::F64,
328};
329const OUTPUT_DIFF: IndicatorOutputInfo = IndicatorOutputInfo {
330    id: "diff",
331    label: "DIFF",
332    value_type: IndicatorValueType::F64,
333};
334const OUTPUT_DEA: IndicatorOutputInfo = IndicatorOutputInfo {
335    id: "dea",
336    label: "DEA",
337    value_type: IndicatorValueType::F64,
338};
339const OUTPUT_LINE_CONVERGENCE: IndicatorOutputInfo = IndicatorOutputInfo {
340    id: "line_convergence",
341    label: "Line Convergence",
342    value_type: IndicatorValueType::F64,
343};
344const OUTPUT_BUY_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
345    id: "buy_signal",
346    label: "Buy Signal",
347    value_type: IndicatorValueType::F64,
348};
349const OUTPUT_SELL_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
350    id: "sell_signal",
351    label: "Sell Signal",
352    value_type: IndicatorValueType::F64,
353};
354const OUTPUT_OSCILLATOR: IndicatorOutputInfo = IndicatorOutputInfo {
355    id: "oscillator",
356    label: "Oscillator",
357    value_type: IndicatorValueType::F64,
358};
359const OUTPUT_MAX_PEAK_VALUE: IndicatorOutputInfo = IndicatorOutputInfo {
360    id: "max_peak_value",
361    label: "Max Peak Value",
362    value_type: IndicatorValueType::F64,
363};
364const OUTPUT_MIN_PEAK_VALUE: IndicatorOutputInfo = IndicatorOutputInfo {
365    id: "min_peak_value",
366    label: "Min Peak Value",
367    value_type: IndicatorValueType::F64,
368};
369const OUTPUT_MARKET_EXTREME: IndicatorOutputInfo = IndicatorOutputInfo {
370    id: "market_extreme",
371    label: "Market Extreme",
372    value_type: IndicatorValueType::F64,
373};
374const OUTPUT_REGULAR_BULLISH: IndicatorOutputInfo = IndicatorOutputInfo {
375    id: "regular_bullish",
376    label: "Regular Bullish",
377    value_type: IndicatorValueType::F64,
378};
379const OUTPUT_HIDDEN_BULLISH: IndicatorOutputInfo = IndicatorOutputInfo {
380    id: "hidden_bullish",
381    label: "Hidden Bullish",
382    value_type: IndicatorValueType::F64,
383};
384const OUTPUT_REGULAR_BEARISH: IndicatorOutputInfo = IndicatorOutputInfo {
385    id: "regular_bearish",
386    label: "Regular Bearish",
387    value_type: IndicatorValueType::F64,
388};
389const OUTPUT_HIDDEN_BEARISH: IndicatorOutputInfo = IndicatorOutputInfo {
390    id: "hidden_bearish",
391    label: "Hidden Bearish",
392    value_type: IndicatorValueType::F64,
393};
394const OUTPUT_GO_LONG: IndicatorOutputInfo = IndicatorOutputInfo {
395    id: "go_long",
396    label: "Go Long",
397    value_type: IndicatorValueType::F64,
398};
399const OUTPUT_GO_SHORT: IndicatorOutputInfo = IndicatorOutputInfo {
400    id: "go_short",
401    label: "Go Short",
402    value_type: IndicatorValueType::F64,
403};
404const OUTPUT_DOMINANT_CYCLE: IndicatorOutputInfo = IndicatorOutputInfo {
405    id: "dominant_cycle",
406    label: "Dominant Cycle",
407    value_type: IndicatorValueType::F64,
408};
409const OUTPUT_NORMALIZED_POWER: IndicatorOutputInfo = IndicatorOutputInfo {
410    id: "normalized_power",
411    label: "Normalized Power",
412    value_type: IndicatorValueType::F64,
413};
414const OUTPUT_IMI: IndicatorOutputInfo = IndicatorOutputInfo {
415    id: "imi",
416    label: "IMI",
417    value_type: IndicatorValueType::F64,
418};
419const OUTPUT_UPPER_HIT: IndicatorOutputInfo = IndicatorOutputInfo {
420    id: "upper_hit",
421    label: "Upper Hit",
422    value_type: IndicatorValueType::F64,
423};
424const OUTPUT_LOWER_HIT: IndicatorOutputInfo = IndicatorOutputInfo {
425    id: "lower_hit",
426    label: "Lower Hit",
427    value_type: IndicatorValueType::F64,
428};
429const OUTPUT_HIST: IndicatorOutputInfo = IndicatorOutputInfo {
430    id: "hist",
431    label: "Histogram",
432    value_type: IndicatorValueType::F64,
433};
434const OUTPUT_UPPER: IndicatorOutputInfo = IndicatorOutputInfo {
435    id: "upper",
436    label: "Upper",
437    value_type: IndicatorValueType::F64,
438};
439const OUTPUT_MIDDLE: IndicatorOutputInfo = IndicatorOutputInfo {
440    id: "middle",
441    label: "Middle",
442    value_type: IndicatorValueType::F64,
443};
444const OUTPUT_AVERAGE: IndicatorOutputInfo = IndicatorOutputInfo {
445    id: "average",
446    label: "Average",
447    value_type: IndicatorValueType::F64,
448};
449const OUTPUT_LOWER: IndicatorOutputInfo = IndicatorOutputInfo {
450    id: "lower",
451    label: "Lower",
452    value_type: IndicatorValueType::F64,
453};
454const OUTPUT_K: IndicatorOutputInfo = IndicatorOutputInfo {
455    id: "k",
456    label: "K",
457    value_type: IndicatorValueType::F64,
458};
459const OUTPUT_D: IndicatorOutputInfo = IndicatorOutputInfo {
460    id: "d",
461    label: "D",
462    value_type: IndicatorValueType::F64,
463};
464const OUTPUT_VPCI: IndicatorOutputInfo = IndicatorOutputInfo {
465    id: "vpci",
466    label: "VPCI",
467    value_type: IndicatorValueType::F64,
468};
469const OUTPUT_VPCIS: IndicatorOutputInfo = IndicatorOutputInfo {
470    id: "vpcis",
471    label: "VPCIS",
472    value_type: IndicatorValueType::F64,
473};
474const OUTPUT_MOMENTUM: IndicatorOutputInfo = IndicatorOutputInfo {
475    id: "momentum",
476    label: "Momentum",
477    value_type: IndicatorValueType::F64,
478};
479const OUTPUT_RESERVOIR: IndicatorOutputInfo = IndicatorOutputInfo {
480    id: "reservoir",
481    label: "Reservoir",
482    value_type: IndicatorValueType::F64,
483};
484const OUTPUT_SQUEEZE_ACTIVE: IndicatorOutputInfo = IndicatorOutputInfo {
485    id: "squeeze_active",
486    label: "Squeeze Active",
487    value_type: IndicatorValueType::F64,
488};
489const OUTPUT_SQUEEZE_START: IndicatorOutputInfo = IndicatorOutputInfo {
490    id: "squeeze_start",
491    label: "Squeeze Start",
492    value_type: IndicatorValueType::F64,
493};
494const OUTPUT_RANGE_HIGH: IndicatorOutputInfo = IndicatorOutputInfo {
495    id: "range_high",
496    label: "Range High",
497    value_type: IndicatorValueType::F64,
498};
499const OUTPUT_RANGE_LOW: IndicatorOutputInfo = IndicatorOutputInfo {
500    id: "range_low",
501    label: "Range Low",
502    value_type: IndicatorValueType::F64,
503};
504const OUTPUT_SQUEEZE: IndicatorOutputInfo = IndicatorOutputInfo {
505    id: "squeeze",
506    label: "Squeeze",
507    value_type: IndicatorValueType::F64,
508};
509const OUTPUT_MAMA: IndicatorOutputInfo = IndicatorOutputInfo {
510    id: "mama",
511    label: "MAMA",
512    value_type: IndicatorValueType::F64,
513};
514const OUTPUT_MA: IndicatorOutputInfo = IndicatorOutputInfo {
515    id: "ma",
516    label: "MA",
517    value_type: IndicatorValueType::F64,
518};
519const OUTPUT_FAMA: IndicatorOutputInfo = IndicatorOutputInfo {
520    id: "fama",
521    label: "FAMA",
522    value_type: IndicatorValueType::F64,
523};
524const OUTPUT_PREDICTION: IndicatorOutputInfo = IndicatorOutputInfo {
525    id: "prediction",
526    label: "Prediction",
527    value_type: IndicatorValueType::F64,
528};
529const OUTPUT_PREDICT: IndicatorOutputInfo = IndicatorOutputInfo {
530    id: "predict",
531    label: "Predict",
532    value_type: IndicatorValueType::F64,
533};
534const OUTPUT_FILTER: IndicatorOutputInfo = IndicatorOutputInfo {
535    id: "filter",
536    label: "Filter",
537    value_type: IndicatorValueType::F64,
538};
539const OUTPUT_STATE: IndicatorOutputInfo = IndicatorOutputInfo {
540    id: "state",
541    label: "State",
542    value_type: IndicatorValueType::F64,
543};
544const OUTPUT_TRIGGER: IndicatorOutputInfo = IndicatorOutputInfo {
545    id: "trigger",
546    label: "Trigger",
547    value_type: IndicatorValueType::F64,
548};
549const OUTPUT_CORRECTED: IndicatorOutputInfo = IndicatorOutputInfo {
550    id: "corrected",
551    label: "Corrected",
552    value_type: IndicatorValueType::F64,
553};
554const OUTPUT_T3: IndicatorOutputInfo = IndicatorOutputInfo {
555    id: "t3",
556    label: "T3",
557    value_type: IndicatorValueType::F64,
558};
559const OUTPUT_CYCLE: IndicatorOutputInfo = IndicatorOutputInfo {
560    id: "cycle",
561    label: "Cycle",
562    value_type: IndicatorValueType::F64,
563};
564const OUTPUT_BULL: IndicatorOutputInfo = IndicatorOutputInfo {
565    id: "bull",
566    label: "Bull",
567    value_type: IndicatorValueType::F64,
568};
569const OUTPUT_BEAR: IndicatorOutputInfo = IndicatorOutputInfo {
570    id: "bear",
571    label: "Bear",
572    value_type: IndicatorValueType::F64,
573};
574const OUTPUT_FAST: IndicatorOutputInfo = IndicatorOutputInfo {
575    id: "fast",
576    label: "Fast",
577    value_type: IndicatorValueType::F64,
578};
579const OUTPUT_SLOW: IndicatorOutputInfo = IndicatorOutputInfo {
580    id: "slow",
581    label: "Slow",
582    value_type: IndicatorValueType::F64,
583};
584const OUTPUT_PLUS: IndicatorOutputInfo = IndicatorOutputInfo {
585    id: "plus",
586    label: "Plus",
587    value_type: IndicatorValueType::F64,
588};
589const OUTPUT_MINUS: IndicatorOutputInfo = IndicatorOutputInfo {
590    id: "minus",
591    label: "Minus",
592    value_type: IndicatorValueType::F64,
593};
594const OUTPUT_UP: IndicatorOutputInfo = IndicatorOutputInfo {
595    id: "up",
596    label: "Up",
597    value_type: IndicatorValueType::F64,
598};
599const OUTPUT_DOWN: IndicatorOutputInfo = IndicatorOutputInfo {
600    id: "down",
601    label: "Down",
602    value_type: IndicatorValueType::F64,
603};
604const OUTPUT_LEVEL: IndicatorOutputInfo = IndicatorOutputInfo {
605    id: "level",
606    label: "Level",
607    value_type: IndicatorValueType::F64,
608};
609const OUTPUT_BAND: IndicatorOutputInfo = IndicatorOutputInfo {
610    id: "band",
611    label: "Band",
612    value_type: IndicatorValueType::F64,
613};
614const OUTPUT_ANCHOR_LINE: IndicatorOutputInfo = IndicatorOutputInfo {
615    id: "anchor",
616    label: "Anchor",
617    value_type: IndicatorValueType::F64,
618};
619const OUTPUT_SWITCH_PRICE_LINE: IndicatorOutputInfo = IndicatorOutputInfo {
620    id: "switch_price",
621    label: "Switch Price",
622    value_type: IndicatorValueType::F64,
623};
624const OUTPUT_BIAS: IndicatorOutputInfo = IndicatorOutputInfo {
625    id: "bias",
626    label: "Bias",
627    value_type: IndicatorValueType::F64,
628};
629const OUTPUT_TREND: IndicatorOutputInfo = IndicatorOutputInfo {
630    id: "trend",
631    label: "Trend",
632    value_type: IndicatorValueType::F64,
633};
634const OUTPUT_CHANGED: IndicatorOutputInfo = IndicatorOutputInfo {
635    id: "changed",
636    label: "Changed",
637    value_type: IndicatorValueType::F64,
638};
639const OUTPUT_J: IndicatorOutputInfo = IndicatorOutputInfo {
640    id: "j",
641    label: "J",
642    value_type: IndicatorValueType::F64,
643};
644const OUTPUT_MOMENTUM_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
645    id: "signal",
646    label: "Signal",
647    value_type: IndicatorValueType::F64,
648};
649const OUTPUT_WT1: IndicatorOutputInfo = IndicatorOutputInfo {
650    id: "wt1",
651    label: "WT1",
652    value_type: IndicatorValueType::F64,
653};
654const OUTPUT_WT2: IndicatorOutputInfo = IndicatorOutputInfo {
655    id: "wt2",
656    label: "WT2",
657    value_type: IndicatorValueType::F64,
658};
659const OUTPUT_WT_DIFF: IndicatorOutputInfo = IndicatorOutputInfo {
660    id: "wt_diff",
661    label: "WT Diff",
662    value_type: IndicatorValueType::F64,
663};
664const OUTPUT_WAVETREND1: IndicatorOutputInfo = IndicatorOutputInfo {
665    id: "wavetrend1",
666    label: "WaveTrend 1",
667    value_type: IndicatorValueType::F64,
668};
669const OUTPUT_WAVETREND2: IndicatorOutputInfo = IndicatorOutputInfo {
670    id: "wavetrend2",
671    label: "WaveTrend 2",
672    value_type: IndicatorValueType::F64,
673};
674const OUTPUT_WAVETREND: IndicatorOutputInfo = IndicatorOutputInfo {
675    id: "wavetrend",
676    label: "WaveTrend",
677    value_type: IndicatorValueType::F64,
678};
679const OUTPUT_HISTOGRAM: IndicatorOutputInfo = IndicatorOutputInfo {
680    id: "histogram",
681    label: "Histogram",
682    value_type: IndicatorValueType::F64,
683};
684const OUTPUT_YZ: IndicatorOutputInfo = IndicatorOutputInfo {
685    id: "yz",
686    label: "YZ",
687    value_type: IndicatorValueType::F64,
688};
689const OUTPUT_HVR: IndicatorOutputInfo = IndicatorOutputInfo {
690    id: "hvr",
691    label: "HVR",
692    value_type: IndicatorValueType::F64,
693};
694const OUTPUT_HV: IndicatorOutputInfo = IndicatorOutputInfo {
695    id: "hv",
696    label: "HV",
697    value_type: IndicatorValueType::F64,
698};
699const OUTPUT_RS: IndicatorOutputInfo = IndicatorOutputInfo {
700    id: "rs",
701    label: "RS",
702    value_type: IndicatorValueType::F64,
703};
704const OUTPUT_ESTIMATE: IndicatorOutputInfo = IndicatorOutputInfo {
705    id: "estimate",
706    label: "Estimate",
707    value_type: IndicatorValueType::F64,
708};
709const OUTPUT_EXPECTED_VALUE: IndicatorOutputInfo = IndicatorOutputInfo {
710    id: "expected_value",
711    label: "Expected Value",
712    value_type: IndicatorValueType::F64,
713};
714const OUTPUT_ZERO_CROSS_UP: IndicatorOutputInfo = IndicatorOutputInfo {
715    id: "zero_cross_up",
716    label: "Zero Cross Up",
717    value_type: IndicatorValueType::F64,
718};
719const OUTPUT_ZERO_CROSS_DOWN: IndicatorOutputInfo = IndicatorOutputInfo {
720    id: "zero_cross_down",
721    label: "Zero Cross Down",
722    value_type: IndicatorValueType::F64,
723};
724const OUTPUT_EXTREMITY: IndicatorOutputInfo = IndicatorOutputInfo {
725    id: "extremity",
726    label: "Extremity",
727    value_type: IndicatorValueType::F64,
728};
729const OUTPUT_SMOOTHED_OPEN: IndicatorOutputInfo = IndicatorOutputInfo {
730    id: "smoothed_open",
731    label: "Smoothed Open",
732    value_type: IndicatorValueType::F64,
733};
734const OUTPUT_SMOOTHED_HIGH: IndicatorOutputInfo = IndicatorOutputInfo {
735    id: "smoothed_high",
736    label: "Smoothed High",
737    value_type: IndicatorValueType::F64,
738};
739const OUTPUT_SMOOTHED_LOW: IndicatorOutputInfo = IndicatorOutputInfo {
740    id: "smoothed_low",
741    label: "Smoothed Low",
742    value_type: IndicatorValueType::F64,
743};
744const OUTPUT_SMOOTHED_CLOSE: IndicatorOutputInfo = IndicatorOutputInfo {
745    id: "smoothed_close",
746    label: "Smoothed Close",
747    value_type: IndicatorValueType::F64,
748};
749const OUTPUT_RSI_LINE: IndicatorOutputInfo = IndicatorOutputInfo {
750    id: "rsi",
751    label: "RSI",
752    value_type: IndicatorValueType::F64,
753};
754const OUTPUT_LOWER_MID: IndicatorOutputInfo = IndicatorOutputInfo {
755    id: "lower_mid",
756    label: "Lower Mid",
757    value_type: IndicatorValueType::F64,
758};
759const OUTPUT_UPPER_MID: IndicatorOutputInfo = IndicatorOutputInfo {
760    id: "upper_mid",
761    label: "Upper Mid",
762    value_type: IndicatorValueType::F64,
763};
764const OUTPUT_REGIME: IndicatorOutputInfo = IndicatorOutputInfo {
765    id: "regime",
766    label: "Regime",
767    value_type: IndicatorValueType::F64,
768};
769const OUTPUT_REGIME_FLIP: IndicatorOutputInfo = IndicatorOutputInfo {
770    id: "regime_flip",
771    label: "Regime Flip",
772    value_type: IndicatorValueType::F64,
773};
774const OUTPUT_LOWER_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
775    id: "lower_signal",
776    label: "Lower Signal",
777    value_type: IndicatorValueType::F64,
778};
779const OUTPUT_UPPER_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
780    id: "upper_signal",
781    label: "Upper Signal",
782    value_type: IndicatorValueType::F64,
783};
784const OUTPUT_FORWARD_BACKWARD: IndicatorOutputInfo = IndicatorOutputInfo {
785    id: "forward_backward",
786    label: "Forward Backward",
787    value_type: IndicatorValueType::F64,
788};
789const OUTPUT_BACKWARD_LINE: IndicatorOutputInfo = IndicatorOutputInfo {
790    id: "backward",
791    label: "Backward",
792    value_type: IndicatorValueType::F64,
793};
794const OUTPUT_SLOPE: IndicatorOutputInfo = IndicatorOutputInfo {
795    id: "slope",
796    label: "Slope",
797    value_type: IndicatorValueType::F64,
798};
799const OUTPUT_INTERCEPT: IndicatorOutputInfo = IndicatorOutputInfo {
800    id: "intercept",
801    label: "Intercept",
802    value_type: IndicatorValueType::F64,
803};
804const OUTPUT_DEVIATION: IndicatorOutputInfo = IndicatorOutputInfo {
805    id: "deviation",
806    label: "Deviation",
807    value_type: IndicatorValueType::F64,
808};
809const OUTPUT_BULLISH_REVERSAL: IndicatorOutputInfo = IndicatorOutputInfo {
810    id: "bullish_reversal",
811    label: "Bullish Reversal",
812    value_type: IndicatorValueType::F64,
813};
814const OUTPUT_BEARISH_REVERSAL: IndicatorOutputInfo = IndicatorOutputInfo {
815    id: "bearish_reversal",
816    label: "Bearish Reversal",
817    value_type: IndicatorValueType::F64,
818};
819const OUTPUT_NORMALIZED_VOLUME: IndicatorOutputInfo = IndicatorOutputInfo {
820    id: "normalized_volume",
821    label: "Normalized Volume",
822    value_type: IndicatorValueType::F64,
823};
824const OUTPUT_NORMALIZED_TRUE_RANGE: IndicatorOutputInfo = IndicatorOutputInfo {
825    id: "normalized_true_range",
826    label: "Normalized True Range",
827    value_type: IndicatorValueType::F64,
828};
829const OUTPUT_BASELINE: IndicatorOutputInfo = IndicatorOutputInfo {
830    id: "baseline",
831    label: "Baseline",
832    value_type: IndicatorValueType::F64,
833};
834const OUTPUT_ATR_LINE: IndicatorOutputInfo = IndicatorOutputInfo {
835    id: "atr",
836    label: "ATR",
837    value_type: IndicatorValueType::F64,
838};
839const OUTPUT_AVERAGE_VOLUME: IndicatorOutputInfo = IndicatorOutputInfo {
840    id: "average_volume",
841    label: "Average Volume",
842    value_type: IndicatorValueType::F64,
843};
844const OUTPUT_CG: IndicatorOutputInfo = IndicatorOutputInfo {
845    id: "cg",
846    label: "CG",
847    value_type: IndicatorValueType::F64,
848};
849const OUTPUT_AMO: IndicatorOutputInfo = IndicatorOutputInfo {
850    id: "amo",
851    label: "AMO",
852    value_type: IndicatorValueType::F64,
853};
854const OUTPUT_AMA: IndicatorOutputInfo = IndicatorOutputInfo {
855    id: "ama",
856    label: "AMA",
857    value_type: IndicatorValueType::F64,
858};
859const OUTPUT_RANGE_TOP: IndicatorOutputInfo = IndicatorOutputInfo {
860    id: "range_top",
861    label: "Range Top",
862    value_type: IndicatorValueType::F64,
863};
864const OUTPUT_RANGE_BOTTOM: IndicatorOutputInfo = IndicatorOutputInfo {
865    id: "range_bottom",
866    label: "Range Bottom",
867    value_type: IndicatorValueType::F64,
868};
869const OUTPUT_BULLISH: IndicatorOutputInfo = IndicatorOutputInfo {
870    id: "bullish",
871    label: "Bullish",
872    value_type: IndicatorValueType::F64,
873};
874const OUTPUT_EXTRA_BULLISH: IndicatorOutputInfo = IndicatorOutputInfo {
875    id: "extra_bullish",
876    label: "Extra Bullish",
877    value_type: IndicatorValueType::F64,
878};
879const OUTPUT_BEARISH: IndicatorOutputInfo = IndicatorOutputInfo {
880    id: "bearish",
881    label: "Bearish",
882    value_type: IndicatorValueType::F64,
883};
884const OUTPUT_EXTRA_BEARISH: IndicatorOutputInfo = IndicatorOutputInfo {
885    id: "extra_bearish",
886    label: "Extra Bearish",
887    value_type: IndicatorValueType::F64,
888};
889const OUTPUT_UPTREND_BASE: IndicatorOutputInfo = IndicatorOutputInfo {
890    id: "uptrend_base",
891    label: "Uptrend Base",
892    value_type: IndicatorValueType::F64,
893};
894const OUTPUT_DOWNTREND_BASE: IndicatorOutputInfo = IndicatorOutputInfo {
895    id: "downtrend_base",
896    label: "Downtrend Base",
897    value_type: IndicatorValueType::F64,
898};
899const OUTPUT_UPTREND_EXTENSION: IndicatorOutputInfo = IndicatorOutputInfo {
900    id: "uptrend_extension",
901    label: "Uptrend Extension",
902    value_type: IndicatorValueType::F64,
903};
904const OUTPUT_DOWNTREND_EXTENSION: IndicatorOutputInfo = IndicatorOutputInfo {
905    id: "downtrend_extension",
906    label: "Downtrend Extension",
907    value_type: IndicatorValueType::F64,
908};
909const OUTPUT_BULLISH_CHANGE: IndicatorOutputInfo = IndicatorOutputInfo {
910    id: "bullish_change",
911    label: "Bullish Change",
912    value_type: IndicatorValueType::F64,
913};
914const OUTPUT_BEARISH_CHANGE: IndicatorOutputInfo = IndicatorOutputInfo {
915    id: "bearish_change",
916    label: "Bearish Change",
917    value_type: IndicatorValueType::F64,
918};
919const OUTPUT_VOLATILITY: IndicatorOutputInfo = IndicatorOutputInfo {
920    id: "volatility",
921    label: "Volatility",
922    value_type: IndicatorValueType::F64,
923};
924const OUTPUT_VARIANCE: IndicatorOutputInfo = IndicatorOutputInfo {
925    id: "variance",
926    label: "Variance",
927    value_type: IndicatorValueType::F64,
928};
929const OUTPUT_TMF: IndicatorOutputInfo = IndicatorOutputInfo {
930    id: "tmf",
931    label: "TMF",
932    value_type: IndicatorValueType::F64,
933};
934const OUTPUT_SMOOTHED: IndicatorOutputInfo = IndicatorOutputInfo {
935    id: "smoothed",
936    label: "Smoothed",
937    value_type: IndicatorValueType::F64,
938};
939const OUTPUT_HVP: IndicatorOutputInfo = IndicatorOutputInfo {
940    id: "hvp",
941    label: "HVP",
942    value_type: IndicatorValueType::F64,
943};
944const OUTPUT_HVP_SMA: IndicatorOutputInfo = IndicatorOutputInfo {
945    id: "hvp_sma",
946    label: "HVP SMA",
947    value_type: IndicatorValueType::F64,
948};
949const OUTPUT_EDF: IndicatorOutputInfo = IndicatorOutputInfo {
950    id: "edf",
951    label: "EDF",
952    value_type: IndicatorValueType::F64,
953};
954const OUTPUT_KBW: IndicatorOutputInfo = IndicatorOutputInfo {
955    id: "kbw",
956    label: "KBW",
957    value_type: IndicatorValueType::F64,
958};
959const OUTPUT_KBW_SMA: IndicatorOutputInfo = IndicatorOutputInfo {
960    id: "kbw_sma",
961    label: "KBW SMA",
962    value_type: IndicatorValueType::F64,
963};
964const OUTPUT_MMI: IndicatorOutputInfo = IndicatorOutputInfo {
965    id: "mmi",
966    label: "MMI",
967    value_type: IndicatorValueType::F64,
968};
969const OUTPUT_MMI_SMOOTHED: IndicatorOutputInfo = IndicatorOutputInfo {
970    id: "mmi_smoothed",
971    label: "MMI Smoothed",
972    value_type: IndicatorValueType::F64,
973};
974const OUTPUT_PRICE_DENSITY: IndicatorOutputInfo = IndicatorOutputInfo {
975    id: "price_density",
976    label: "Price Density",
977    value_type: IndicatorValueType::F64,
978};
979const OUTPUT_PRICE_DENSITY_PERCENT: IndicatorOutputInfo = IndicatorOutputInfo {
980    id: "price_density_percent",
981    label: "Price Density Percent",
982    value_type: IndicatorValueType::F64,
983};
984const OUTPUT_IMPULSE_MACD: IndicatorOutputInfo = IndicatorOutputInfo {
985    id: "impulse_macd",
986    label: "Impulse MACD",
987    value_type: IndicatorValueType::F64,
988};
989const OUTPUT_MOMENTUM_RATIO_OSCILLATOR: IndicatorOutputInfo = IndicatorOutputInfo {
990    id: "line",
991    label: "Line",
992    value_type: IndicatorValueType::F64,
993};
994const OUTPUT_SUPERTREND_OSCILLATOR: IndicatorOutputInfo = IndicatorOutputInfo {
995    id: "oscillator",
996    label: "Oscillator",
997    value_type: IndicatorValueType::F64,
998};
999const OUTPUT_CONV_ACCELERATION: IndicatorOutputInfo = IndicatorOutputInfo {
1000    id: "conv_acceleration",
1001    label: "Convolution Acceleration",
1002    value_type: IndicatorValueType::F64,
1003};
1004const OUTPUT_PLUS_TCF: IndicatorOutputInfo = IndicatorOutputInfo {
1005    id: "plus_tcf",
1006    label: "Plus TCF",
1007    value_type: IndicatorValueType::F64,
1008};
1009const OUTPUT_MINUS_TCF: IndicatorOutputInfo = IndicatorOutputInfo {
1010    id: "minus_tcf",
1011    label: "Minus TCF",
1012    value_type: IndicatorValueType::F64,
1013};
1014const OUTPUT_VQI_SUM: IndicatorOutputInfo = IndicatorOutputInfo {
1015    id: "vqi_sum",
1016    label: "VQI Sum",
1017    value_type: IndicatorValueType::F64,
1018};
1019const OUTPUT_FAST_SMA: IndicatorOutputInfo = IndicatorOutputInfo {
1020    id: "fast_sma",
1021    label: "Fast SMA",
1022    value_type: IndicatorValueType::F64,
1023};
1024const OUTPUT_SLOW_SMA: IndicatorOutputInfo = IndicatorOutputInfo {
1025    id: "slow_sma",
1026    label: "Slow SMA",
1027    value_type: IndicatorValueType::F64,
1028};
1029const OUTPUT_EMA: IndicatorOutputInfo = IndicatorOutputInfo {
1030    id: "ema",
1031    label: "EMA",
1032    value_type: IndicatorValueType::F64,
1033};
1034const OUTPUT_FORECAST: IndicatorOutputInfo = IndicatorOutputInfo {
1035    id: "forecast",
1036    label: "Forecast",
1037    value_type: IndicatorValueType::F64,
1038};
1039const OUTPUT_BULLISH_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
1040    id: "bullish_signal",
1041    label: "Bullish Signal",
1042    value_type: IndicatorValueType::F64,
1043};
1044const OUTPUT_BEARISH_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
1045    id: "bearish_signal",
1046    label: "Bearish Signal",
1047    value_type: IndicatorValueType::F64,
1048};
1049
1050const OUTPUTS_VALUE_F64: &[IndicatorOutputInfo] = &[OUTPUT_VALUE_F64];
1051const OUTPUTS_VALUE_BOOL: &[IndicatorOutputInfo] = &[OUTPUT_VALUE_BOOL];
1052const OUTPUTS_MATRIX_BOOL: &[IndicatorOutputInfo] = &[OUTPUT_MATRIX];
1053const OUTPUTS_MACD: &[IndicatorOutputInfo] = &[OUTPUT_MACD, OUTPUT_SIGNAL, OUTPUT_HIST];
1054const OUTPUTS_BOLLINGER: &[IndicatorOutputInfo] = &[OUTPUT_UPPER, OUTPUT_MIDDLE, OUTPUT_LOWER];
1055const OUTPUTS_STOCH: &[IndicatorOutputInfo] = &[OUTPUT_K, OUTPUT_D];
1056const OUTPUTS_VPCI: &[IndicatorOutputInfo] = &[OUTPUT_VPCI, OUTPUT_VPCIS];
1057const OUTPUTS_TTM_SQUEEZE: &[IndicatorOutputInfo] = &[OUTPUT_MOMENTUM, OUTPUT_SQUEEZE];
1058const OUTPUTS_MAMA: &[IndicatorOutputInfo] = &[OUTPUT_MAMA, OUTPUT_FAMA];
1059const OUTPUTS_EHLERS_PMA: &[IndicatorOutputInfo] = &[OUTPUT_PREDICT, OUTPUT_TRIGGER];
1060const OUTPUTS_EHLERS_ADAPTIVE_CG: &[IndicatorOutputInfo] = &[OUTPUT_CG, OUTPUT_TRIGGER];
1061const OUTPUTS_ADAPTIVE_MOMENTUM_OSCILLATOR: &[IndicatorOutputInfo] = &[OUTPUT_AMO, OUTPUT_AMA];
1062const OUTPUTS_BUFF_AVERAGES: &[IndicatorOutputInfo] = &[OUTPUT_FAST, OUTPUT_SLOW];
1063const OUTPUTS_EDCT3: &[IndicatorOutputInfo] = &[OUTPUT_CORRECTED, OUTPUT_T3];
1064const OUTPUTS_PLUS_MINUS: &[IndicatorOutputInfo] = &[OUTPUT_PLUS, OUTPUT_MINUS];
1065const OUTPUTS_UP_DOWN: &[IndicatorOutputInfo] = &[OUTPUT_UP, OUTPUT_DOWN];
1066const OUTPUTS_STATISTICAL_TRAILING_STOP: &[IndicatorOutputInfo] = &[
1067    OUTPUT_LEVEL,
1068    OUTPUT_ANCHOR_LINE,
1069    OUTPUT_BIAS,
1070    OUTPUT_CHANGED,
1071];
1072const OUTPUTS_SUPERTREND_RECOVERY: &[IndicatorOutputInfo] = &[
1073    OUTPUT_BAND,
1074    OUTPUT_SWITCH_PRICE_LINE,
1075    OUTPUT_TREND,
1076    OUTPUT_CHANGED,
1077];
1078const OUTPUTS_RANGE_BREAKOUT_SIGNALS: &[IndicatorOutputInfo] = &[
1079    OUTPUT_RANGE_TOP,
1080    OUTPUT_RANGE_BOTTOM,
1081    OUTPUT_BULLISH,
1082    OUTPUT_EXTRA_BULLISH,
1083    OUTPUT_BEARISH,
1084    OUTPUT_EXTRA_BEARISH,
1085];
1086const OUTPUTS_EXPONENTIAL_TREND: &[IndicatorOutputInfo] = &[
1087    OUTPUT_UPTREND_BASE,
1088    OUTPUT_DOWNTREND_BASE,
1089    OUTPUT_UPTREND_EXTENSION,
1090    OUTPUT_DOWNTREND_EXTENSION,
1091    OUTPUT_BULLISH_CHANGE,
1092    OUTPUT_BEARISH_CHANGE,
1093];
1094const OUTPUT_ALPHA_TRAIL: IndicatorOutputInfo = IndicatorOutputInfo {
1095    id: "alpha_trail",
1096    label: "AlphaTrail",
1097    value_type: IndicatorValueType::F64,
1098};
1099const OUTPUT_ALPHA_TRAIL_BULLISH: IndicatorOutputInfo = IndicatorOutputInfo {
1100    id: "alpha_trail_bullish",
1101    label: "AlphaTrail Bullish",
1102    value_type: IndicatorValueType::F64,
1103};
1104const OUTPUT_ALPHA_TRAIL_BEARISH: IndicatorOutputInfo = IndicatorOutputInfo {
1105    id: "alpha_trail_bearish",
1106    label: "AlphaTrail Bearish",
1107    value_type: IndicatorValueType::F64,
1108};
1109const OUTPUT_ALPHA_DIR: IndicatorOutputInfo = IndicatorOutputInfo {
1110    id: "alpha_dir",
1111    label: "AlphaTrail Direction",
1112    value_type: IndicatorValueType::F64,
1113};
1114const OUTPUT_MFI: IndicatorOutputInfo = IndicatorOutputInfo {
1115    id: "mfi",
1116    label: "Money Flow Index",
1117    value_type: IndicatorValueType::F64,
1118};
1119const OUTPUT_TP_UPPER: IndicatorOutputInfo = IndicatorOutputInfo {
1120    id: "tp_upper",
1121    label: "TP Upper",
1122    value_type: IndicatorValueType::F64,
1123};
1124const OUTPUT_TP_LOWER: IndicatorOutputInfo = IndicatorOutputInfo {
1125    id: "tp_lower",
1126    label: "TP Lower",
1127    value_type: IndicatorValueType::F64,
1128};
1129const OUTPUT_ALPHA_TRAIL_BULLISH_SWITCH: IndicatorOutputInfo = IndicatorOutputInfo {
1130    id: "alpha_trail_bullish_switch",
1131    label: "AlphaTrail Bullish Switch",
1132    value_type: IndicatorValueType::F64,
1133};
1134const OUTPUT_ALPHA_TRAIL_BEARISH_SWITCH: IndicatorOutputInfo = IndicatorOutputInfo {
1135    id: "alpha_trail_bearish_switch",
1136    label: "AlphaTrail Bearish Switch",
1137    value_type: IndicatorValueType::F64,
1138};
1139const OUTPUT_MFI_OVERBOUGHT: IndicatorOutputInfo = IndicatorOutputInfo {
1140    id: "mfi_overbought",
1141    label: "MFI Overbought",
1142    value_type: IndicatorValueType::F64,
1143};
1144const OUTPUT_MFI_OVERSOLD: IndicatorOutputInfo = IndicatorOutputInfo {
1145    id: "mfi_oversold",
1146    label: "MFI Oversold",
1147    value_type: IndicatorValueType::F64,
1148};
1149const OUTPUT_MFI_CROSS_UP_MID: IndicatorOutputInfo = IndicatorOutputInfo {
1150    id: "mfi_cross_up_mid",
1151    label: "MFI Cross Up Mid",
1152    value_type: IndicatorValueType::F64,
1153};
1154const OUTPUT_MFI_CROSS_DOWN_MID: IndicatorOutputInfo = IndicatorOutputInfo {
1155    id: "mfi_cross_down_mid",
1156    label: "MFI Cross Down Mid",
1157    value_type: IndicatorValueType::F64,
1158};
1159const OUTPUT_PRICE_CROSS_ALPHA_TRAIL_UP: IndicatorOutputInfo = IndicatorOutputInfo {
1160    id: "price_cross_alpha_trail_up",
1161    label: "Price Cross AlphaTrail Up",
1162    value_type: IndicatorValueType::F64,
1163};
1164const OUTPUT_PRICE_CROSS_ALPHA_TRAIL_DOWN: IndicatorOutputInfo = IndicatorOutputInfo {
1165    id: "price_cross_alpha_trail_down",
1166    label: "Price Cross AlphaTrail Down",
1167    value_type: IndicatorValueType::F64,
1168};
1169const OUTPUT_MFI_ABOVE_90: IndicatorOutputInfo = IndicatorOutputInfo {
1170    id: "mfi_above_90",
1171    label: "MFI Above 90",
1172    value_type: IndicatorValueType::F64,
1173};
1174const OUTPUT_MFI_BELOW_10: IndicatorOutputInfo = IndicatorOutputInfo {
1175    id: "mfi_below_10",
1176    label: "MFI Below 10",
1177    value_type: IndicatorValueType::F64,
1178};
1179const OUTPUTS_TREND_FLOW_TRAIL: &[IndicatorOutputInfo] = &[
1180    OUTPUT_ALPHA_TRAIL,
1181    OUTPUT_ALPHA_TRAIL_BULLISH,
1182    OUTPUT_ALPHA_TRAIL_BEARISH,
1183    OUTPUT_ALPHA_DIR,
1184    OUTPUT_MFI,
1185    OUTPUT_TP_UPPER,
1186    OUTPUT_TP_LOWER,
1187    OUTPUT_ALPHA_TRAIL_BULLISH_SWITCH,
1188    OUTPUT_ALPHA_TRAIL_BEARISH_SWITCH,
1189    OUTPUT_MFI_OVERBOUGHT,
1190    OUTPUT_MFI_OVERSOLD,
1191    OUTPUT_MFI_CROSS_UP_MID,
1192    OUTPUT_MFI_CROSS_DOWN_MID,
1193    OUTPUT_PRICE_CROSS_ALPHA_TRAIL_UP,
1194    OUTPUT_PRICE_CROSS_ALPHA_TRAIL_DOWN,
1195    OUTPUT_MFI_ABOVE_90,
1196    OUTPUT_MFI_BELOW_10,
1197];
1198const OUTPUTS_STANDARDIZED_PSAR_OSCILLATOR: &[IndicatorOutputInfo] = &[
1199    IndicatorOutputInfo {
1200        id: "oscillator",
1201        label: "Oscillator",
1202        value_type: IndicatorValueType::F64,
1203    },
1204    IndicatorOutputInfo {
1205        id: "ma",
1206        label: "MA",
1207        value_type: IndicatorValueType::F64,
1208    },
1209    IndicatorOutputInfo {
1210        id: "bullish_reversal",
1211        label: "Bullish Reversal",
1212        value_type: IndicatorValueType::F64,
1213    },
1214    IndicatorOutputInfo {
1215        id: "bearish_reversal",
1216        label: "Bearish Reversal",
1217        value_type: IndicatorValueType::F64,
1218    },
1219    IndicatorOutputInfo {
1220        id: "regular_bullish",
1221        label: "Regular Bullish",
1222        value_type: IndicatorValueType::F64,
1223    },
1224    IndicatorOutputInfo {
1225        id: "regular_bearish",
1226        label: "Regular Bearish",
1227        value_type: IndicatorValueType::F64,
1228    },
1229    IndicatorOutputInfo {
1230        id: "bullish_weakening",
1231        label: "Bullish Weakening",
1232        value_type: IndicatorValueType::F64,
1233    },
1234    IndicatorOutputInfo {
1235        id: "bearish_weakening",
1236        label: "Bearish Weakening",
1237        value_type: IndicatorValueType::F64,
1238    },
1239];
1240const OUTPUTS_VDUBUS_DIVERGENCE_WAVE_PATTERN_GENERATOR: &[IndicatorOutputInfo] = &[
1241    IndicatorOutputInfo {
1242        id: "fast_standard",
1243        label: "Fast Standard",
1244        value_type: IndicatorValueType::F64,
1245    },
1246    IndicatorOutputInfo {
1247        id: "fast_climax",
1248        label: "Fast Climax",
1249        value_type: IndicatorValueType::F64,
1250    },
1251    IndicatorOutputInfo {
1252        id: "fast_rounded",
1253        label: "Fast Rounded",
1254        value_type: IndicatorValueType::F64,
1255    },
1256    IndicatorOutputInfo {
1257        id: "fast_predator",
1258        label: "Fast Predator",
1259        value_type: IndicatorValueType::F64,
1260    },
1261    IndicatorOutputInfo {
1262        id: "slow_standard",
1263        label: "Slow Standard",
1264        value_type: IndicatorValueType::F64,
1265    },
1266    IndicatorOutputInfo {
1267        id: "slow_climax",
1268        label: "Slow Climax",
1269        value_type: IndicatorValueType::F64,
1270    },
1271    IndicatorOutputInfo {
1272        id: "slow_rounded",
1273        label: "Slow Rounded",
1274        value_type: IndicatorValueType::F64,
1275    },
1276    IndicatorOutputInfo {
1277        id: "slow_predator",
1278        label: "Slow Predator",
1279        value_type: IndicatorValueType::F64,
1280    },
1281    IndicatorOutputInfo {
1282        id: "opposing_force",
1283        label: "Opposing Force",
1284        value_type: IndicatorValueType::F64,
1285    },
1286    OUTPUT_MACD,
1287    OUTPUT_SIGNAL,
1288    OUTPUT_HIST,
1289];
1290const OUTPUTS_TREND_CHANGED: &[IndicatorOutputInfo] = &[OUTPUT_TREND, OUTPUT_CHANGED];
1291const OUTPUTS_KDJ: &[IndicatorOutputInfo] = &[OUTPUT_K, OUTPUT_D, OUTPUT_J];
1292const OUTPUTS_SQUEEZE_MOMENTUM: &[IndicatorOutputInfo] =
1293    &[OUTPUT_MOMENTUM, OUTPUT_SQUEEZE, OUTPUT_MOMENTUM_SIGNAL];
1294const OUTPUTS_WTO: &[IndicatorOutputInfo] =
1295    &[OUTPUT_WAVETREND1, OUTPUT_WAVETREND2, OUTPUT_HISTOGRAM];
1296const OUTPUTS_WAVETREND: &[IndicatorOutputInfo] = &[OUTPUT_WT1, OUTPUT_WT2, OUTPUT_WT_DIFF];
1297const OUTPUTS_MOD_GOD_MODE: &[IndicatorOutputInfo] =
1298    &[OUTPUT_WAVETREND, OUTPUT_SIGNAL, OUTPUT_HISTOGRAM];
1299const OUTPUTS_HALF_CAUSAL_ESTIMATOR: &[IndicatorOutputInfo] =
1300    &[OUTPUT_ESTIMATE, OUTPUT_EXPECTED_VALUE];
1301const OUTPUTS_YANG_ZHANG: &[IndicatorOutputInfo] = &[OUTPUT_YZ, OUTPUT_RS];
1302const OUTPUTS_PARKINSON: &[IndicatorOutputInfo] = &[OUTPUT_VOLATILITY, OUTPUT_VARIANCE];
1303const OUTPUTS_TWIGGS_MONEY_FLOW: &[IndicatorOutputInfo] = &[OUTPUT_TMF, OUTPUT_SMOOTHED];
1304const OUTPUTS_HVP: &[IndicatorOutputInfo] = &[OUTPUT_HVP, OUTPUT_HVP_SMA];
1305const OUTPUTS_EHLERS_DETRENDING_FILTER: &[IndicatorOutputInfo] = &[OUTPUT_EDF, OUTPUT_SIGNAL];
1306const OUTPUTS_KELTNER_CHANNEL_WIDTH_OSCILLATOR: &[IndicatorOutputInfo] =
1307    &[OUTPUT_KBW, OUTPUT_KBW_SMA];
1308const OUTPUTS_MARKET_MEANNESS_INDEX: &[IndicatorOutputInfo] = &[OUTPUT_MMI, OUTPUT_MMI_SMOOTHED];
1309const OUTPUTS_PRICE_DENSITY_MARKET_NOISE: &[IndicatorOutputInfo] =
1310    &[OUTPUT_PRICE_DENSITY, OUTPUT_PRICE_DENSITY_PERCENT];
1311const OUTPUTS_IMPULSE_MACD: &[IndicatorOutputInfo] =
1312    &[OUTPUT_IMPULSE_MACD, OUTPUT_HISTOGRAM, OUTPUT_SIGNAL];
1313const OUTPUTS_MOMENTUM_RATIO_OSCILLATOR: &[IndicatorOutputInfo] =
1314    &[OUTPUT_MOMENTUM_RATIO_OSCILLATOR, OUTPUT_SIGNAL];
1315const OUTPUTS_SUPERTREND_OSCILLATOR: &[IndicatorOutputInfo] = &[
1316    OUTPUT_SUPERTREND_OSCILLATOR,
1317    OUTPUT_SIGNAL,
1318    OUTPUT_HISTOGRAM,
1319];
1320const OUTPUTS_HYPERTREND: &[IndicatorOutputInfo] = &[
1321    OUTPUT_AVERAGE,
1322    OUTPUT_UPPER,
1323    OUTPUT_LOWER,
1324    OUTPUT_TREND,
1325    OUTPUT_CHANGED,
1326];
1327const OUTPUTS_LOGARITHMIC_MOVING_AVERAGE: &[IndicatorOutputInfo] = &[
1328    IndicatorOutputInfo {
1329        id: "lma",
1330        label: "LMA",
1331        value_type: IndicatorValueType::F64,
1332    },
1333    OUTPUT_SIGNAL,
1334    IndicatorOutputInfo {
1335        id: "position",
1336        label: "Position",
1337        value_type: IndicatorValueType::F64,
1338    },
1339    IndicatorOutputInfo {
1340        id: "momentum_confirmed",
1341        label: "Momentum Confirmed",
1342        value_type: IndicatorValueType::F64,
1343    },
1344];
1345const OUTPUTS_ADAPTIVE_SCHAFF_TREND_CYCLE: &[IndicatorOutputInfo] = &[
1346    IndicatorOutputInfo {
1347        id: "stc",
1348        label: "STC",
1349        value_type: IndicatorValueType::F64,
1350    },
1351    OUTPUT_HISTOGRAM,
1352];
1353const OUTPUTS_SMOOTHED_GAUSSIAN_TREND_FILTER: &[IndicatorOutputInfo] = &[
1354    IndicatorOutputInfo {
1355        id: "filter",
1356        label: "Filter",
1357        value_type: IndicatorValueType::F64,
1358    },
1359    IndicatorOutputInfo {
1360        id: "supertrend",
1361        label: "SuperTrend",
1362        value_type: IndicatorValueType::F64,
1363    },
1364    OUTPUT_TREND,
1365    IndicatorOutputInfo {
1366        id: "ranging",
1367        label: "Ranging",
1368        value_type: IndicatorValueType::F64,
1369    },
1370];
1371const OUTPUTS_STOCHASTIC_ADAPTIVE_D: &[IndicatorOutputInfo] = &[
1372    IndicatorOutputInfo {
1373        id: "standard_d",
1374        label: "Standard %D",
1375        value_type: IndicatorValueType::F64,
1376    },
1377    IndicatorOutputInfo {
1378        id: "adaptive_d",
1379        label: "Adaptive %D",
1380        value_type: IndicatorValueType::F64,
1381    },
1382    IndicatorOutputInfo {
1383        id: "difference",
1384        label: "Difference",
1385        value_type: IndicatorValueType::F64,
1386    },
1387];
1388const OUTPUTS_ICT_PROPULSION_BLOCK: &[IndicatorOutputInfo] = &[
1389    IndicatorOutputInfo {
1390        id: "bullish_high",
1391        label: "Bullish High",
1392        value_type: IndicatorValueType::F64,
1393    },
1394    IndicatorOutputInfo {
1395        id: "bullish_low",
1396        label: "Bullish Low",
1397        value_type: IndicatorValueType::F64,
1398    },
1399    IndicatorOutputInfo {
1400        id: "bullish_kind",
1401        label: "Bullish Kind",
1402        value_type: IndicatorValueType::F64,
1403    },
1404    IndicatorOutputInfo {
1405        id: "bullish_active",
1406        label: "Bullish Active",
1407        value_type: IndicatorValueType::F64,
1408    },
1409    IndicatorOutputInfo {
1410        id: "bullish_mitigated",
1411        label: "Bullish Mitigated",
1412        value_type: IndicatorValueType::F64,
1413    },
1414    IndicatorOutputInfo {
1415        id: "bullish_new",
1416        label: "Bullish New",
1417        value_type: IndicatorValueType::F64,
1418    },
1419    IndicatorOutputInfo {
1420        id: "bearish_high",
1421        label: "Bearish High",
1422        value_type: IndicatorValueType::F64,
1423    },
1424    IndicatorOutputInfo {
1425        id: "bearish_low",
1426        label: "Bearish Low",
1427        value_type: IndicatorValueType::F64,
1428    },
1429    IndicatorOutputInfo {
1430        id: "bearish_kind",
1431        label: "Bearish Kind",
1432        value_type: IndicatorValueType::F64,
1433    },
1434    IndicatorOutputInfo {
1435        id: "bearish_active",
1436        label: "Bearish Active",
1437        value_type: IndicatorValueType::F64,
1438    },
1439    IndicatorOutputInfo {
1440        id: "bearish_mitigated",
1441        label: "Bearish Mitigated",
1442        value_type: IndicatorValueType::F64,
1443    },
1444    IndicatorOutputInfo {
1445        id: "bearish_new",
1446        label: "Bearish New",
1447        value_type: IndicatorValueType::F64,
1448    },
1449];
1450const OUTPUTS_LEAVITT_CONVOLUTION_ACCELERATION: &[IndicatorOutputInfo] =
1451    &[OUTPUT_CONV_ACCELERATION, OUTPUT_SIGNAL];
1452const OUTPUTS_TREND_CONTINUATION_FACTOR: &[IndicatorOutputInfo] =
1453    &[OUTPUT_PLUS_TCF, OUTPUT_MINUS_TCF];
1454const OUTPUTS_VOLUME_WEIGHTED_STOCHASTIC_RSI: &[IndicatorOutputInfo] = &[OUTPUT_K, OUTPUT_D];
1455const OUTPUTS_VOLATILITY_QUALITY_INDEX: &[IndicatorOutputInfo] =
1456    &[OUTPUT_VQI_SUM, OUTPUT_FAST_SMA, OUTPUT_SLOW_SMA];
1457const OUTPUTS_ANDEAN_OSCILLATOR: &[IndicatorOutputInfo] =
1458    &[OUTPUT_BULL, OUTPUT_BEAR, OUTPUT_SIGNAL];
1459const OUTPUTS_CYCLE_CHANNEL_OSCILLATOR: &[IndicatorOutputInfo] = &[OUTPUT_FAST, OUTPUT_SLOW];
1460const OUTPUTS_DAILY_FACTOR: &[IndicatorOutputInfo] = &[OUTPUT_VALUE_F64, OUTPUT_EMA, OUTPUT_SIGNAL];
1461const OUTPUTS_MOVING_AVERAGE_CROSS_PROBABILITY: &[IndicatorOutputInfo] = &[
1462    OUTPUT_VALUE_F64,
1463    IndicatorOutputInfo {
1464        id: "slow_ma",
1465        label: "Slow MA",
1466        value_type: IndicatorValueType::F64,
1467    },
1468    IndicatorOutputInfo {
1469        id: "fast_ma",
1470        label: "Fast MA",
1471        value_type: IndicatorValueType::F64,
1472    },
1473    OUTPUT_FORECAST,
1474    OUTPUT_UPPER,
1475    OUTPUT_LOWER,
1476    OUTPUT_DIRECTION,
1477];
1478const OUTPUTS_BULLS_V_BEARS: &[IndicatorOutputInfo] = &[
1479    OUTPUT_VALUE_F64,
1480    OUTPUT_BULL,
1481    OUTPUT_BEAR,
1482    OUTPUT_MA,
1483    OUTPUT_UPPER,
1484    OUTPUT_LOWER,
1485    OUTPUT_BULLISH_SIGNAL,
1486    OUTPUT_BEARISH_SIGNAL,
1487    OUTPUT_ZERO_CROSS_UP,
1488    OUTPUT_ZERO_CROSS_DOWN,
1489];
1490const OUTPUTS_ADJUSTABLE_MA_ALTERNATING_EXTREMITIES: &[IndicatorOutputInfo] = &[
1491    OUTPUT_MA,
1492    OUTPUT_UPPER,
1493    OUTPUT_LOWER,
1494    OUTPUT_EXTREMITY,
1495    OUTPUT_STATE,
1496    OUTPUT_CHANGED,
1497    OUTPUT_SMOOTHED_OPEN,
1498    OUTPUT_SMOOTHED_HIGH,
1499    OUTPUT_SMOOTHED_LOW,
1500    OUTPUT_SMOOTHED_CLOSE,
1501];
1502const OUTPUTS_QQE_WEIGHTED_OSCILLATOR: &[IndicatorOutputInfo] =
1503    &[OUTPUT_RSI_LINE, OUTPUT_TRAILING_STOP];
1504const OUTPUTS_ADAPTIVE_BOUNDS_RSI: &[IndicatorOutputInfo] = &[
1505    OUTPUT_RSI_LINE,
1506    OUTPUT_LOWER,
1507    OUTPUT_LOWER_MID,
1508    OUTPUT_MIDDLE,
1509    OUTPUT_UPPER_MID,
1510    OUTPUT_UPPER,
1511    OUTPUT_REGIME,
1512    OUTPUT_REGIME_FLIP,
1513    OUTPUT_LOWER_SIGNAL,
1514    OUTPUT_UPPER_SIGNAL,
1515];
1516const OUTPUTS_FORWARD_BACKWARD_EXPONENTIAL_OSCILLATOR: &[IndicatorOutputInfo] = &[
1517    OUTPUT_FORWARD_BACKWARD,
1518    OUTPUT_BACKWARD_LINE,
1519    OUTPUT_HISTOGRAM,
1520];
1521const OUTPUTS_RANGE_OSCILLATOR: &[IndicatorOutputInfo] = &[
1522    IndicatorOutputInfo {
1523        id: "oscillator",
1524        label: "Oscillator",
1525        value_type: IndicatorValueType::F64,
1526    },
1527    IndicatorOutputInfo {
1528        id: "ma",
1529        label: "MA",
1530        value_type: IndicatorValueType::F64,
1531    },
1532    IndicatorOutputInfo {
1533        id: "upper_band",
1534        label: "Upper Band",
1535        value_type: IndicatorValueType::F64,
1536    },
1537    IndicatorOutputInfo {
1538        id: "lower_band",
1539        label: "Lower Band",
1540        value_type: IndicatorValueType::F64,
1541    },
1542    IndicatorOutputInfo {
1543        id: "range_width",
1544        label: "Range Width",
1545        value_type: IndicatorValueType::F64,
1546    },
1547    IndicatorOutputInfo {
1548        id: "in_range",
1549        label: "In Range",
1550        value_type: IndicatorValueType::F64,
1551    },
1552    OUTPUT_TREND,
1553    IndicatorOutputInfo {
1554        id: "break_up",
1555        label: "Break Up",
1556        value_type: IndicatorValueType::F64,
1557    },
1558    IndicatorOutputInfo {
1559        id: "break_down",
1560        label: "Break Down",
1561        value_type: IndicatorValueType::F64,
1562    },
1563];
1564const OUTPUTS_RANGE_FILTERED_TREND_SIGNALS: &[IndicatorOutputInfo] = &[
1565    IndicatorOutputInfo {
1566        id: "kalman",
1567        label: "Kalman",
1568        value_type: IndicatorValueType::F64,
1569    },
1570    IndicatorOutputInfo {
1571        id: "supertrend",
1572        label: "Supertrend",
1573        value_type: IndicatorValueType::F64,
1574    },
1575    IndicatorOutputInfo {
1576        id: "upper_band",
1577        label: "Upper Band",
1578        value_type: IndicatorValueType::F64,
1579    },
1580    IndicatorOutputInfo {
1581        id: "lower_band",
1582        label: "Lower Band",
1583        value_type: IndicatorValueType::F64,
1584    },
1585    OUTPUT_TREND,
1586    IndicatorOutputInfo {
1587        id: "kalman_trend",
1588        label: "Kalman Trend",
1589        value_type: IndicatorValueType::F64,
1590    },
1591    OUTPUT_STATE,
1592    IndicatorOutputInfo {
1593        id: "market_trending",
1594        label: "Market Trending",
1595        value_type: IndicatorValueType::F64,
1596    },
1597    IndicatorOutputInfo {
1598        id: "market_ranging",
1599        label: "Market Ranging",
1600        value_type: IndicatorValueType::F64,
1601    },
1602    IndicatorOutputInfo {
1603        id: "short_term_bullish",
1604        label: "Short Term Bullish",
1605        value_type: IndicatorValueType::F64,
1606    },
1607    IndicatorOutputInfo {
1608        id: "short_term_bearish",
1609        label: "Short Term Bearish",
1610        value_type: IndicatorValueType::F64,
1611    },
1612    IndicatorOutputInfo {
1613        id: "long_term_bullish",
1614        label: "Long Term Bullish",
1615        value_type: IndicatorValueType::F64,
1616    },
1617    IndicatorOutputInfo {
1618        id: "long_term_bearish",
1619        label: "Long Term Bearish",
1620        value_type: IndicatorValueType::F64,
1621    },
1622];
1623const OUTPUTS_MARKET_STRUCTURE_CONFLUENCE: &[IndicatorOutputInfo] = &[
1624    IndicatorOutputInfo {
1625        id: "basis",
1626        label: "Basis",
1627        value_type: IndicatorValueType::F64,
1628    },
1629    IndicatorOutputInfo {
1630        id: "upper_band",
1631        label: "Upper Band",
1632        value_type: IndicatorValueType::F64,
1633    },
1634    IndicatorOutputInfo {
1635        id: "lower_band",
1636        label: "Lower Band",
1637        value_type: IndicatorValueType::F64,
1638    },
1639    IndicatorOutputInfo {
1640        id: "structure_direction",
1641        label: "Structure Direction",
1642        value_type: IndicatorValueType::F64,
1643    },
1644    IndicatorOutputInfo {
1645        id: "bullish_arrow",
1646        label: "Bullish Arrow",
1647        value_type: IndicatorValueType::F64,
1648    },
1649    IndicatorOutputInfo {
1650        id: "bearish_arrow",
1651        label: "Bearish Arrow",
1652        value_type: IndicatorValueType::F64,
1653    },
1654    IndicatorOutputInfo {
1655        id: "bullish_change",
1656        label: "Bullish Change",
1657        value_type: IndicatorValueType::F64,
1658    },
1659    IndicatorOutputInfo {
1660        id: "bearish_change",
1661        label: "Bearish Change",
1662        value_type: IndicatorValueType::F64,
1663    },
1664    IndicatorOutputInfo {
1665        id: "hh",
1666        label: "HH",
1667        value_type: IndicatorValueType::F64,
1668    },
1669    IndicatorOutputInfo {
1670        id: "lh",
1671        label: "LH",
1672        value_type: IndicatorValueType::F64,
1673    },
1674    IndicatorOutputInfo {
1675        id: "hl",
1676        label: "HL",
1677        value_type: IndicatorValueType::F64,
1678    },
1679    IndicatorOutputInfo {
1680        id: "ll",
1681        label: "LL",
1682        value_type: IndicatorValueType::F64,
1683    },
1684    IndicatorOutputInfo {
1685        id: "bullish_bos",
1686        label: "Bullish BOS",
1687        value_type: IndicatorValueType::F64,
1688    },
1689    IndicatorOutputInfo {
1690        id: "bullish_choch",
1691        label: "Bullish CHoCH",
1692        value_type: IndicatorValueType::F64,
1693    },
1694    IndicatorOutputInfo {
1695        id: "bearish_bos",
1696        label: "Bearish BOS",
1697        value_type: IndicatorValueType::F64,
1698    },
1699    IndicatorOutputInfo {
1700        id: "bearish_choch",
1701        label: "Bearish CHoCH",
1702        value_type: IndicatorValueType::F64,
1703    },
1704];
1705const OUTPUTS_VOLUME_WEIGHTED_RELATIVE_STRENGTH_INDEX: &[IndicatorOutputInfo] = &[
1706    OUTPUT_RSI_LINE,
1707    IndicatorOutputInfo {
1708        id: "consolidation_strength",
1709        label: "Consolidation Strength",
1710        value_type: IndicatorValueType::F64,
1711    },
1712    IndicatorOutputInfo {
1713        id: "rsi_ma",
1714        label: "RSI MA",
1715        value_type: IndicatorValueType::F64,
1716    },
1717    IndicatorOutputInfo {
1718        id: "bearish_tp",
1719        label: "Bearish TP",
1720        value_type: IndicatorValueType::F64,
1721    },
1722    IndicatorOutputInfo {
1723        id: "bullish_tp",
1724        label: "Bullish TP",
1725        value_type: IndicatorValueType::F64,
1726    },
1727];
1728const OUTPUTS_SMOOTH_THEIL_SEN: &[IndicatorOutputInfo] = &[
1729    OUTPUT_VALUE_F64,
1730    OUTPUT_UPPER,
1731    OUTPUT_LOWER,
1732    OUTPUT_SLOPE,
1733    OUTPUT_INTERCEPT,
1734    OUTPUT_DEVIATION,
1735];
1736const OUTPUTS_REGRESSION_SLOPE_OSCILLATOR: &[IndicatorOutputInfo] = &[
1737    OUTPUT_VALUE_F64,
1738    OUTPUT_SIGNAL,
1739    OUTPUT_BULLISH_REVERSAL,
1740    OUTPUT_BEARISH_REVERSAL,
1741];
1742const OUTPUTS_EHLERS_SIMPLE_CYCLE_INDICATOR: &[IndicatorOutputInfo] =
1743    &[OUTPUT_CYCLE, OUTPUT_TRIGGER];
1744const OUTPUTS_RANDOM_WALK_INDEX: &[IndicatorOutputInfo] = &[
1745    IndicatorOutputInfo {
1746        id: "high",
1747        label: "High",
1748        value_type: IndicatorValueType::F64,
1749    },
1750    IndicatorOutputInfo {
1751        id: "low",
1752        label: "Low",
1753        value_type: IndicatorValueType::F64,
1754    },
1755];
1756const OUTPUTS_PRICE_MOVING_AVERAGE_RATIO_PERCENTILE: &[IndicatorOutputInfo] = &[
1757    IndicatorOutputInfo {
1758        id: "pmar",
1759        label: "PMAR",
1760        value_type: IndicatorValueType::F64,
1761    },
1762    IndicatorOutputInfo {
1763        id: "pmarp",
1764        label: "PMARP",
1765        value_type: IndicatorValueType::F64,
1766    },
1767    IndicatorOutputInfo {
1768        id: "plotline",
1769        label: "Plotline",
1770        value_type: IndicatorValueType::F64,
1771    },
1772    IndicatorOutputInfo {
1773        id: "signal",
1774        label: "Signal",
1775        value_type: IndicatorValueType::F64,
1776    },
1777    IndicatorOutputInfo {
1778        id: "pmar_high",
1779        label: "Historical PMAR High",
1780        value_type: IndicatorValueType::F64,
1781    },
1782    IndicatorOutputInfo {
1783        id: "pmar_low",
1784        label: "Historical PMAR Low",
1785        value_type: IndicatorValueType::F64,
1786    },
1787    IndicatorOutputInfo {
1788        id: "scaled_pmar",
1789        label: "Scaled PMAR",
1790        value_type: IndicatorValueType::F64,
1791    },
1792];
1793const OUTPUTS_RELATIVE_STRENGTH_INDEX_WAVE_INDICATOR: &[IndicatorOutputInfo] = &[
1794    IndicatorOutputInfo {
1795        id: "rsi_ma1",
1796        label: "RSI MA1",
1797        value_type: IndicatorValueType::F64,
1798    },
1799    IndicatorOutputInfo {
1800        id: "rsi_ma2",
1801        label: "RSI MA2",
1802        value_type: IndicatorValueType::F64,
1803    },
1804    IndicatorOutputInfo {
1805        id: "rsi_ma3",
1806        label: "RSI MA3",
1807        value_type: IndicatorValueType::F64,
1808    },
1809    IndicatorOutputInfo {
1810        id: "rsi_ma4",
1811        label: "RSI MA4",
1812        value_type: IndicatorValueType::F64,
1813    },
1814    IndicatorOutputInfo {
1815        id: "state",
1816        label: "State",
1817        value_type: IndicatorValueType::F64,
1818    },
1819];
1820const OUTPUTS_MESA_STOCHASTIC_MULTI_LENGTH: &[IndicatorOutputInfo] = &[
1821    IndicatorOutputInfo {
1822        id: "mesa_1",
1823        label: "MESA 1",
1824        value_type: IndicatorValueType::F64,
1825    },
1826    IndicatorOutputInfo {
1827        id: "mesa_2",
1828        label: "MESA 2",
1829        value_type: IndicatorValueType::F64,
1830    },
1831    IndicatorOutputInfo {
1832        id: "mesa_3",
1833        label: "MESA 3",
1834        value_type: IndicatorValueType::F64,
1835    },
1836    IndicatorOutputInfo {
1837        id: "mesa_4",
1838        label: "MESA 4",
1839        value_type: IndicatorValueType::F64,
1840    },
1841    IndicatorOutputInfo {
1842        id: "trigger_1",
1843        label: "Trigger 1",
1844        value_type: IndicatorValueType::F64,
1845    },
1846    IndicatorOutputInfo {
1847        id: "trigger_2",
1848        label: "Trigger 2",
1849        value_type: IndicatorValueType::F64,
1850    },
1851    IndicatorOutputInfo {
1852        id: "trigger_3",
1853        label: "Trigger 3",
1854        value_type: IndicatorValueType::F64,
1855    },
1856    IndicatorOutputInfo {
1857        id: "trigger_4",
1858        label: "Trigger 4",
1859        value_type: IndicatorValueType::F64,
1860    },
1861];
1862const OUTPUTS_SPEARMAN_CORRELATION: &[IndicatorOutputInfo] = &[
1863    IndicatorOutputInfo {
1864        id: "raw",
1865        label: "Raw",
1866        value_type: IndicatorValueType::F64,
1867    },
1868    IndicatorOutputInfo {
1869        id: "smoothed",
1870        label: "Smoothed",
1871        value_type: IndicatorValueType::F64,
1872    },
1873];
1874const OUTPUTS_VWAP_DEVIATION_OSCILLATOR: &[IndicatorOutputInfo] = &[
1875    IndicatorOutputInfo {
1876        id: "osc",
1877        label: "Oscillator",
1878        value_type: IndicatorValueType::F64,
1879    },
1880    IndicatorOutputInfo {
1881        id: "std1",
1882        label: "Std 1",
1883        value_type: IndicatorValueType::F64,
1884    },
1885    IndicatorOutputInfo {
1886        id: "std2",
1887        label: "Std 2",
1888        value_type: IndicatorValueType::F64,
1889    },
1890    IndicatorOutputInfo {
1891        id: "std3",
1892        label: "Std 3",
1893        value_type: IndicatorValueType::F64,
1894    },
1895];
1896const OUTPUTS_ICHIMOKU_OSCILLATOR: &[IndicatorOutputInfo] = &[
1897    IndicatorOutputInfo {
1898        id: "signal",
1899        label: "Signal",
1900        value_type: IndicatorValueType::F64,
1901    },
1902    IndicatorOutputInfo {
1903        id: "ma",
1904        label: "MA",
1905        value_type: IndicatorValueType::F64,
1906    },
1907    IndicatorOutputInfo {
1908        id: "conversion",
1909        label: "Conversion",
1910        value_type: IndicatorValueType::F64,
1911    },
1912    IndicatorOutputInfo {
1913        id: "base",
1914        label: "Base",
1915        value_type: IndicatorValueType::F64,
1916    },
1917    IndicatorOutputInfo {
1918        id: "chikou",
1919        label: "Chikou",
1920        value_type: IndicatorValueType::F64,
1921    },
1922    IndicatorOutputInfo {
1923        id: "current_kumo_a",
1924        label: "Current Kumo A",
1925        value_type: IndicatorValueType::F64,
1926    },
1927    IndicatorOutputInfo {
1928        id: "current_kumo_b",
1929        label: "Current Kumo B",
1930        value_type: IndicatorValueType::F64,
1931    },
1932    IndicatorOutputInfo {
1933        id: "future_kumo_a",
1934        label: "Future Kumo A",
1935        value_type: IndicatorValueType::F64,
1936    },
1937    IndicatorOutputInfo {
1938        id: "future_kumo_b",
1939        label: "Future Kumo B",
1940        value_type: IndicatorValueType::F64,
1941    },
1942    IndicatorOutputInfo {
1943        id: "max_level",
1944        label: "Max Level",
1945        value_type: IndicatorValueType::F64,
1946    },
1947    IndicatorOutputInfo {
1948        id: "high_level",
1949        label: "High Level",
1950        value_type: IndicatorValueType::F64,
1951    },
1952    IndicatorOutputInfo {
1953        id: "low_level",
1954        label: "Low Level",
1955        value_type: IndicatorValueType::F64,
1956    },
1957    IndicatorOutputInfo {
1958        id: "min_level",
1959        label: "Min Level",
1960        value_type: IndicatorValueType::F64,
1961    },
1962];
1963const OUTPUTS_NORMALIZED_VOLUME_TRUE_RANGE: &[IndicatorOutputInfo] = &[
1964    OUTPUT_NORMALIZED_VOLUME,
1965    OUTPUT_NORMALIZED_TRUE_RANGE,
1966    OUTPUT_BASELINE,
1967    OUTPUT_ATR_LINE,
1968    OUTPUT_AVERAGE_VOLUME,
1969];
1970const OUTPUTS_ACOSC: &[IndicatorOutputInfo] = &[
1971    IndicatorOutputInfo {
1972        id: "osc",
1973        label: "Oscillator",
1974        value_type: IndicatorValueType::F64,
1975    },
1976    IndicatorOutputInfo {
1977        id: "change",
1978        label: "Change",
1979        value_type: IndicatorValueType::F64,
1980    },
1981];
1982const OUTPUTS_ALLIGATOR: &[IndicatorOutputInfo] = &[
1983    IndicatorOutputInfo {
1984        id: "jaw",
1985        label: "Jaw",
1986        value_type: IndicatorValueType::F64,
1987    },
1988    IndicatorOutputInfo {
1989        id: "teeth",
1990        label: "Teeth",
1991        value_type: IndicatorValueType::F64,
1992    },
1993    IndicatorOutputInfo {
1994        id: "lips",
1995        label: "Lips",
1996        value_type: IndicatorValueType::F64,
1997    },
1998];
1999const OUTPUTS_K1_K2: &[IndicatorOutputInfo] = &[
2000    IndicatorOutputInfo {
2001        id: "k1",
2002        label: "K1",
2003        value_type: IndicatorValueType::F64,
2004    },
2005    IndicatorOutputInfo {
2006        id: "k2",
2007        label: "K2",
2008        value_type: IndicatorValueType::F64,
2009    },
2010];
2011const OUTPUTS_BULLS_BEARS: &[IndicatorOutputInfo] = &[
2012    IndicatorOutputInfo {
2013        id: "bulls",
2014        label: "Bulls",
2015        value_type: IndicatorValueType::F64,
2016    },
2017    IndicatorOutputInfo {
2018        id: "bears",
2019        label: "Bears",
2020        value_type: IndicatorValueType::F64,
2021    },
2022];
2023const OUTPUTS_BANDPASS: &[IndicatorOutputInfo] = &[
2024    IndicatorOutputInfo {
2025        id: "bp",
2026        label: "BandPass",
2027        value_type: IndicatorValueType::F64,
2028    },
2029    IndicatorOutputInfo {
2030        id: "bp_normalized",
2031        label: "Normalized",
2032        value_type: IndicatorValueType::F64,
2033    },
2034    OUTPUT_SIGNAL,
2035    OUTPUT_TRIGGER,
2036];
2037const OUTPUTS_LONG_SHORT_STOP: &[IndicatorOutputInfo] = &[
2038    IndicatorOutputInfo {
2039        id: "long_stop",
2040        label: "Long Stop",
2041        value_type: IndicatorValueType::F64,
2042    },
2043    IndicatorOutputInfo {
2044        id: "short_stop",
2045        label: "Short Stop",
2046        value_type: IndicatorValueType::F64,
2047    },
2048];
2049const OUTPUTS_LONG_SHORT_VALUES: &[IndicatorOutputInfo] = &[
2050    IndicatorOutputInfo {
2051        id: "long_values",
2052        label: "Long",
2053        value_type: IndicatorValueType::F64,
2054    },
2055    IndicatorOutputInfo {
2056        id: "short_values",
2057        label: "Short",
2058        value_type: IndicatorValueType::F64,
2059    },
2060];
2061const OUTPUTS_CORRELATION_CYCLE: &[IndicatorOutputInfo] = &[
2062    IndicatorOutputInfo {
2063        id: "real",
2064        label: "Real",
2065        value_type: IndicatorValueType::F64,
2066    },
2067    IndicatorOutputInfo {
2068        id: "imag",
2069        label: "Imag",
2070        value_type: IndicatorValueType::F64,
2071    },
2072    IndicatorOutputInfo {
2073        id: "angle",
2074        label: "Angle",
2075        value_type: IndicatorValueType::F64,
2076    },
2077    IndicatorOutputInfo {
2078        id: "state",
2079        label: "State",
2080        value_type: IndicatorValueType::F64,
2081    },
2082];
2083const OUTPUTS_VOL_ANTI: &[IndicatorOutputInfo] = &[
2084    IndicatorOutputInfo {
2085        id: "vol",
2086        label: "Vol",
2087        value_type: IndicatorValueType::F64,
2088    },
2089    IndicatorOutputInfo {
2090        id: "anti",
2091        label: "Anti",
2092        value_type: IndicatorValueType::F64,
2093    },
2094];
2095const OUTPUTS_DVDIQQE: &[IndicatorOutputInfo] = &[
2096    IndicatorOutputInfo {
2097        id: "dvdi",
2098        label: "DVDI",
2099        value_type: IndicatorValueType::F64,
2100    },
2101    IndicatorOutputInfo {
2102        id: "fast_tl",
2103        label: "Fast TL",
2104        value_type: IndicatorValueType::F64,
2105    },
2106    IndicatorOutputInfo {
2107        id: "slow_tl",
2108        label: "Slow TL",
2109        value_type: IndicatorValueType::F64,
2110    },
2111    IndicatorOutputInfo {
2112        id: "center_line",
2113        label: "Center Line",
2114        value_type: IndicatorValueType::F64,
2115    },
2116];
2117const OUTPUTS_UPPER_MIDDLE_LOWER_BAND: &[IndicatorOutputInfo] = &[
2118    IndicatorOutputInfo {
2119        id: "upperband",
2120        label: "Upper",
2121        value_type: IndicatorValueType::F64,
2122    },
2123    IndicatorOutputInfo {
2124        id: "middleband",
2125        label: "Middle",
2126        value_type: IndicatorValueType::F64,
2127    },
2128    IndicatorOutputInfo {
2129        id: "lowerband",
2130        label: "Lower",
2131        value_type: IndicatorValueType::F64,
2132    },
2133];
2134const OUTPUTS_BULL_BEAR: &[IndicatorOutputInfo] = &[
2135    IndicatorOutputInfo {
2136        id: "bull",
2137        label: "Bull",
2138        value_type: IndicatorValueType::F64,
2139    },
2140    IndicatorOutputInfo {
2141        id: "bear",
2142        label: "Bear",
2143        value_type: IndicatorValueType::F64,
2144    },
2145];
2146const OUTPUTS_FVG_TS: &[IndicatorOutputInfo] = &[
2147    OUTPUT_UPPER,
2148    OUTPUT_LOWER,
2149    IndicatorOutputInfo {
2150        id: "upper_ts",
2151        label: "Upper TS",
2152        value_type: IndicatorValueType::F64,
2153    },
2154    IndicatorOutputInfo {
2155        id: "lower_ts",
2156        label: "Lower TS",
2157        value_type: IndicatorValueType::F64,
2158    },
2159];
2160const OUTPUTS_GATOROSC: &[IndicatorOutputInfo] = &[
2161    OUTPUT_UPPER,
2162    OUTPUT_LOWER,
2163    IndicatorOutputInfo {
2164        id: "upper_change",
2165        label: "Upper Change",
2166        value_type: IndicatorValueType::F64,
2167    },
2168    IndicatorOutputInfo {
2169        id: "lower_change",
2170        label: "Lower Change",
2171        value_type: IndicatorValueType::F64,
2172    },
2173];
2174const OUTPUTS_HALFTREND: &[IndicatorOutputInfo] = &[
2175    IndicatorOutputInfo {
2176        id: "halftrend",
2177        label: "HalfTrend",
2178        value_type: IndicatorValueType::F64,
2179    },
2180    OUTPUT_TREND,
2181    IndicatorOutputInfo {
2182        id: "atr_high",
2183        label: "ATR High",
2184        value_type: IndicatorValueType::F64,
2185    },
2186    IndicatorOutputInfo {
2187        id: "atr_low",
2188        label: "ATR Low",
2189        value_type: IndicatorValueType::F64,
2190    },
2191    IndicatorOutputInfo {
2192        id: "buy_signal",
2193        label: "Buy",
2194        value_type: IndicatorValueType::F64,
2195    },
2196    IndicatorOutputInfo {
2197        id: "sell_signal",
2198        label: "Sell",
2199        value_type: IndicatorValueType::F64,
2200    },
2201];
2202const OUTPUTS_LINE_SIGNAL: &[IndicatorOutputInfo] = &[
2203    IndicatorOutputInfo {
2204        id: "line",
2205        label: "Line",
2206        value_type: IndicatorValueType::F64,
2207    },
2208    OUTPUT_SIGNAL,
2209];
2210const OUTPUTS_FISHER: &[IndicatorOutputInfo] = &[
2211    IndicatorOutputInfo {
2212        id: "fisher",
2213        label: "Fisher",
2214        value_type: IndicatorValueType::F64,
2215    },
2216    OUTPUT_SIGNAL,
2217];
2218const OUTPUTS_UPPER_LOWER: &[IndicatorOutputInfo] = &[OUTPUT_UPPER, OUTPUT_LOWER];
2219const OUTPUTS_FILTER_BANDS: &[IndicatorOutputInfo] = &[
2220    IndicatorOutputInfo {
2221        id: "filter",
2222        label: "Filter",
2223        value_type: IndicatorValueType::F64,
2224    },
2225    IndicatorOutputInfo {
2226        id: "high_band",
2227        label: "High Band",
2228        value_type: IndicatorValueType::F64,
2229    },
2230    IndicatorOutputInfo {
2231        id: "low_band",
2232        label: "Low Band",
2233        value_type: IndicatorValueType::F64,
2234    },
2235];
2236const OUTPUTS_MINMAX: &[IndicatorOutputInfo] = &[
2237    IndicatorOutputInfo {
2238        id: "is_min",
2239        label: "Is Min",
2240        value_type: IndicatorValueType::F64,
2241    },
2242    IndicatorOutputInfo {
2243        id: "is_max",
2244        label: "Is Max",
2245        value_type: IndicatorValueType::F64,
2246    },
2247    IndicatorOutputInfo {
2248        id: "last_min",
2249        label: "Last Min",
2250        value_type: IndicatorValueType::F64,
2251    },
2252    IndicatorOutputInfo {
2253        id: "last_max",
2254        label: "Last Max",
2255        value_type: IndicatorValueType::F64,
2256    },
2257];
2258const OUTPUTS_SINE_LEAD: &[IndicatorOutputInfo] = &[
2259    IndicatorOutputInfo {
2260        id: "sine",
2261        label: "Sine",
2262        value_type: IndicatorValueType::F64,
2263    },
2264    IndicatorOutputInfo {
2265        id: "lead",
2266        label: "Lead",
2267        value_type: IndicatorValueType::F64,
2268    },
2269];
2270const OUTPUTS_HOTT_LOTT: &[IndicatorOutputInfo] = &[
2271    IndicatorOutputInfo {
2272        id: "hott",
2273        label: "HOTT",
2274        value_type: IndicatorValueType::F64,
2275    },
2276    IndicatorOutputInfo {
2277        id: "lott",
2278        label: "LOTT",
2279        value_type: IndicatorValueType::F64,
2280    },
2281];
2282const OUTPUTS_PRB: &[IndicatorOutputInfo] = &[
2283    IndicatorOutputInfo {
2284        id: "values",
2285        label: "Value",
2286        value_type: IndicatorValueType::F64,
2287    },
2288    IndicatorOutputInfo {
2289        id: "upper_band",
2290        label: "Upper",
2291        value_type: IndicatorValueType::F64,
2292    },
2293    IndicatorOutputInfo {
2294        id: "lower_band",
2295        label: "Lower",
2296        value_type: IndicatorValueType::F64,
2297    },
2298];
2299const OUTPUTS_INDICATOR_SIGNAL: &[IndicatorOutputInfo] = &[
2300    IndicatorOutputInfo {
2301        id: "indicator",
2302        label: "Indicator",
2303        value_type: IndicatorValueType::F64,
2304    },
2305    OUTPUT_SIGNAL,
2306];
2307const OUTPUTS_OSCILLATOR_SIGNAL: &[IndicatorOutputInfo] = &[OUTPUT_OSCILLATOR, OUTPUT_SIGNAL];
2308const OUTPUTS_HULL_BUTTERFLY_OSCILLATOR: &[IndicatorOutputInfo] =
2309    &[OUTPUT_OSCILLATOR, OUTPUT_CUMULATIVE_MEAN, OUTPUT_SIGNAL];
2310const OUTPUTS_FIBONACCI_TRAILING_STOP: &[IndicatorOutputInfo] = &[
2311    OUTPUT_TRAILING_STOP,
2312    IndicatorOutputInfo {
2313        id: "long_stop",
2314        label: "Long Stop",
2315        value_type: IndicatorValueType::F64,
2316    },
2317    IndicatorOutputInfo {
2318        id: "short_stop",
2319        label: "Short Stop",
2320        value_type: IndicatorValueType::F64,
2321    },
2322    OUTPUT_DIRECTION,
2323];
2324const OUTPUTS_FIBONACCI_ENTRY_BANDS: &[IndicatorOutputInfo] = &[
2325    OUTPUT_MIDDLE,
2326    OUTPUT_TREND,
2327    IndicatorOutputInfo {
2328        id: "upper_0618",
2329        label: "Upper 0.618",
2330        value_type: IndicatorValueType::F64,
2331    },
2332    IndicatorOutputInfo {
2333        id: "upper_1000",
2334        label: "Upper 1.0",
2335        value_type: IndicatorValueType::F64,
2336    },
2337    IndicatorOutputInfo {
2338        id: "upper_1618",
2339        label: "Upper 1.618",
2340        value_type: IndicatorValueType::F64,
2341    },
2342    IndicatorOutputInfo {
2343        id: "upper_2618",
2344        label: "Upper 2.618",
2345        value_type: IndicatorValueType::F64,
2346    },
2347    IndicatorOutputInfo {
2348        id: "lower_0618",
2349        label: "Lower 0.618",
2350        value_type: IndicatorValueType::F64,
2351    },
2352    IndicatorOutputInfo {
2353        id: "lower_1000",
2354        label: "Lower 1.0",
2355        value_type: IndicatorValueType::F64,
2356    },
2357    IndicatorOutputInfo {
2358        id: "lower_1618",
2359        label: "Lower 1.618",
2360        value_type: IndicatorValueType::F64,
2361    },
2362    IndicatorOutputInfo {
2363        id: "lower_2618",
2364        label: "Lower 2.618",
2365        value_type: IndicatorValueType::F64,
2366    },
2367    IndicatorOutputInfo {
2368        id: "tp_long_band",
2369        label: "TP Long Band",
2370        value_type: IndicatorValueType::F64,
2371    },
2372    IndicatorOutputInfo {
2373        id: "tp_short_band",
2374        label: "TP Short Band",
2375        value_type: IndicatorValueType::F64,
2376    },
2377    OUTPUT_GO_LONG,
2378    OUTPUT_GO_SHORT,
2379    IndicatorOutputInfo {
2380        id: "rejection_long",
2381        label: "Rejection Long",
2382        value_type: IndicatorValueType::F64,
2383    },
2384    IndicatorOutputInfo {
2385        id: "rejection_short",
2386        label: "Rejection Short",
2387        value_type: IndicatorValueType::F64,
2388    },
2389    IndicatorOutputInfo {
2390        id: "long_bounce",
2391        label: "Long Bounce",
2392        value_type: IndicatorValueType::F64,
2393    },
2394    IndicatorOutputInfo {
2395        id: "short_bounce",
2396        label: "Short Bounce",
2397        value_type: IndicatorValueType::F64,
2398    },
2399];
2400const OUTPUTS_VOLUME_ENERGY_RESERVOIRS: &[IndicatorOutputInfo] = &[
2401    OUTPUT_MOMENTUM,
2402    OUTPUT_RESERVOIR,
2403    OUTPUT_SQUEEZE_ACTIVE,
2404    OUTPUT_SQUEEZE_START,
2405    OUTPUT_RANGE_HIGH,
2406    OUTPUT_RANGE_LOW,
2407];
2408const OUTPUTS_NEIGHBORING_TRAILING_STOP: &[IndicatorOutputInfo] = &[
2409    OUTPUT_TRAILING_STOP,
2410    IndicatorOutputInfo {
2411        id: "bullish_band",
2412        label: "Bullish Band",
2413        value_type: IndicatorValueType::F64,
2414    },
2415    IndicatorOutputInfo {
2416        id: "bearish_band",
2417        label: "Bearish Band",
2418        value_type: IndicatorValueType::F64,
2419    },
2420    OUTPUT_DIRECTION,
2421    IndicatorOutputInfo {
2422        id: "discovery_bull",
2423        label: "Discovery Bull",
2424        value_type: IndicatorValueType::F64,
2425    },
2426    IndicatorOutputInfo {
2427        id: "discovery_bear",
2428        label: "Discovery Bear",
2429        value_type: IndicatorValueType::F64,
2430    },
2431];
2432const OUTPUTS_MACD_WAVE_SIGNAL_PRO: &[IndicatorOutputInfo] = &[
2433    OUTPUT_DIFF,
2434    OUTPUT_DEA,
2435    IndicatorOutputInfo {
2436        id: "macd_histogram",
2437        label: "MACD Histogram",
2438        value_type: IndicatorValueType::F64,
2439    },
2440    OUTPUT_LINE_CONVERGENCE,
2441    OUTPUT_BUY_SIGNAL,
2442    OUTPUT_SELL_SIGNAL,
2443];
2444const OUTPUTS_HEMA_TREND_LEVELS: &[IndicatorOutputInfo] = &[
2445    IndicatorOutputInfo {
2446        id: "fast_hema",
2447        label: "Fast HEMA",
2448        value_type: IndicatorValueType::F64,
2449    },
2450    IndicatorOutputInfo {
2451        id: "slow_hema",
2452        label: "Slow HEMA",
2453        value_type: IndicatorValueType::F64,
2454    },
2455    IndicatorOutputInfo {
2456        id: "trend_direction",
2457        label: "Trend Direction",
2458        value_type: IndicatorValueType::F64,
2459    },
2460    IndicatorOutputInfo {
2461        id: "bar_state",
2462        label: "Bar State",
2463        value_type: IndicatorValueType::F64,
2464    },
2465    IndicatorOutputInfo {
2466        id: "bullish_crossover",
2467        label: "Bullish Crossover",
2468        value_type: IndicatorValueType::F64,
2469    },
2470    IndicatorOutputInfo {
2471        id: "bearish_crossunder",
2472        label: "Bearish Crossunder",
2473        value_type: IndicatorValueType::F64,
2474    },
2475    IndicatorOutputInfo {
2476        id: "box_offset",
2477        label: "Box Offset",
2478        value_type: IndicatorValueType::F64,
2479    },
2480    IndicatorOutputInfo {
2481        id: "bull_box_top",
2482        label: "Bull Box Top",
2483        value_type: IndicatorValueType::F64,
2484    },
2485    IndicatorOutputInfo {
2486        id: "bull_box_bottom",
2487        label: "Bull Box Bottom",
2488        value_type: IndicatorValueType::F64,
2489    },
2490    IndicatorOutputInfo {
2491        id: "bear_box_top",
2492        label: "Bear Box Top",
2493        value_type: IndicatorValueType::F64,
2494    },
2495    IndicatorOutputInfo {
2496        id: "bear_box_bottom",
2497        label: "Bear Box Bottom",
2498        value_type: IndicatorValueType::F64,
2499    },
2500    IndicatorOutputInfo {
2501        id: "bullish_test",
2502        label: "Bullish Test",
2503        value_type: IndicatorValueType::F64,
2504    },
2505    IndicatorOutputInfo {
2506        id: "bearish_test",
2507        label: "Bearish Test",
2508        value_type: IndicatorValueType::F64,
2509    },
2510    IndicatorOutputInfo {
2511        id: "bullish_test_level",
2512        label: "Bullish Test Level",
2513        value_type: IndicatorValueType::F64,
2514    },
2515    IndicatorOutputInfo {
2516        id: "bearish_test_level",
2517        label: "Bearish Test Level",
2518        value_type: IndicatorValueType::F64,
2519    },
2520];
2521const OUTPUTS_MONOTONICITY_INDEX: &[IndicatorOutputInfo] =
2522    &[OUTPUT_INDEX, OUTPUT_CUMULATIVE_MEAN, OUTPUT_UPPER_BOUND];
2523const OUTPUTS_IN_PHASE_LEAD: &[IndicatorOutputInfo] = &[OUTPUT_IN_PHASE, OUTPUT_LEAD_SERIES];
2524const OUTPUTS_OSCILLATOR_SIGNAL_HISTOGRAM: &[IndicatorOutputInfo] = &[
2525    IndicatorOutputInfo {
2526        id: "oscillator",
2527        label: "Oscillator",
2528        value_type: IndicatorValueType::F64,
2529    },
2530    OUTPUT_SIGNAL,
2531    OUTPUT_HISTOGRAM,
2532];
2533const OUTPUTS_VOSS: &[IndicatorOutputInfo] = &[
2534    IndicatorOutputInfo {
2535        id: "voss",
2536        label: "Voss",
2537        value_type: IndicatorValueType::F64,
2538    },
2539    IndicatorOutputInfo {
2540        id: "filt",
2541        label: "Filter",
2542        value_type: IndicatorValueType::F64,
2543    },
2544];
2545const OUTPUTS_PIVOT: &[IndicatorOutputInfo] = &[
2546    IndicatorOutputInfo {
2547        id: "pp",
2548        label: "PP",
2549        value_type: IndicatorValueType::F64,
2550    },
2551    IndicatorOutputInfo {
2552        id: "r1",
2553        label: "R1",
2554        value_type: IndicatorValueType::F64,
2555    },
2556    IndicatorOutputInfo {
2557        id: "r2",
2558        label: "R2",
2559        value_type: IndicatorValueType::F64,
2560    },
2561    IndicatorOutputInfo {
2562        id: "r3",
2563        label: "R3",
2564        value_type: IndicatorValueType::F64,
2565    },
2566    IndicatorOutputInfo {
2567        id: "r4",
2568        label: "R4",
2569        value_type: IndicatorValueType::F64,
2570    },
2571    IndicatorOutputInfo {
2572        id: "s1",
2573        label: "S1",
2574        value_type: IndicatorValueType::F64,
2575    },
2576    IndicatorOutputInfo {
2577        id: "s2",
2578        label: "S2",
2579        value_type: IndicatorValueType::F64,
2580    },
2581    IndicatorOutputInfo {
2582        id: "s3",
2583        label: "S3",
2584        value_type: IndicatorValueType::F64,
2585    },
2586    IndicatorOutputInfo {
2587        id: "s4",
2588        label: "S4",
2589        value_type: IndicatorValueType::F64,
2590    },
2591];
2592
2593const PARAM_PERIOD: IndicatorParamInfo = IndicatorParamInfo {
2594    key: "period",
2595    label: "Period",
2596    kind: IndicatorParamKind::Int,
2597    required: true,
2598    default: Some(ParamValueStatic::Int(14)),
2599    min: Some(1.0),
2600    max: None,
2601    step: Some(1.0),
2602    enum_values: EMPTY_ENUM_VALUES,
2603    notes: None,
2604};
2605
2606const PARAMS_PERIOD_ONLY: &[IndicatorParamInfo] = &[PARAM_PERIOD];
2607
2608const PARAM_OUTPUT_MAMA: IndicatorParamInfo = IndicatorParamInfo {
2609    key: "output",
2610    label: "Output",
2611    kind: IndicatorParamKind::EnumString,
2612    required: false,
2613    default: Some(ParamValueStatic::EnumString("mama")),
2614    min: None,
2615    max: None,
2616    step: None,
2617    enum_values: ENUM_VALUES_MA_OUTPUT,
2618    notes: None,
2619};
2620
2621const PARAM_OUTPUT_EHLERS_PMA: IndicatorParamInfo = IndicatorParamInfo {
2622    key: "output",
2623    label: "Output",
2624    kind: IndicatorParamKind::EnumString,
2625    required: false,
2626    default: Some(ParamValueStatic::EnumString("predict")),
2627    min: None,
2628    max: None,
2629    step: None,
2630    enum_values: ENUM_VALUES_PMA_OUTPUT,
2631    notes: None,
2632};
2633
2634const PARAM_OUTPUT_EHLERS_ADAPTIVE_CG: IndicatorParamInfo = IndicatorParamInfo {
2635    key: "output",
2636    label: "Output",
2637    kind: IndicatorParamKind::EnumString,
2638    required: false,
2639    default: Some(ParamValueStatic::EnumString("cg")),
2640    min: None,
2641    max: None,
2642    step: None,
2643    enum_values: ENUM_VALUES_EHLERS_ADAPTIVE_CG_OUTPUT,
2644    notes: None,
2645};
2646
2647const PARAM_OUTPUT_ADAPTIVE_MOMENTUM_OSCILLATOR: IndicatorParamInfo = IndicatorParamInfo {
2648    key: "output",
2649    label: "Output",
2650    kind: IndicatorParamKind::EnumString,
2651    required: false,
2652    default: Some(ParamValueStatic::EnumString("amo")),
2653    min: None,
2654    max: None,
2655    step: None,
2656    enum_values: ENUM_VALUES_ADAPTIVE_MOMENTUM_OSCILLATOR_OUTPUT,
2657    notes: None,
2658};
2659
2660const PARAM_OUTPUT_BUFF_AVERAGES: IndicatorParamInfo = IndicatorParamInfo {
2661    key: "output",
2662    label: "Output",
2663    kind: IndicatorParamKind::EnumString,
2664    required: false,
2665    default: Some(ParamValueStatic::EnumString("fast")),
2666    min: None,
2667    max: None,
2668    step: None,
2669    enum_values: ENUM_VALUES_BUFF_OUTPUT,
2670    notes: None,
2671};
2672
2673const PARAM_OUTPUT_EDCT3: IndicatorParamInfo = IndicatorParamInfo {
2674    key: "output",
2675    label: "Output",
2676    kind: IndicatorParamKind::EnumString,
2677    required: false,
2678    default: Some(ParamValueStatic::EnumString("corrected")),
2679    min: None,
2680    max: None,
2681    step: None,
2682    enum_values: ENUM_VALUES_EDCT3_OUTPUT,
2683    notes: None,
2684};
2685
2686const PARAM_OUTPUT_NORMALIZED_VOLUME_TRUE_RANGE: IndicatorParamInfo = IndicatorParamInfo {
2687    key: "output",
2688    label: "Output",
2689    kind: IndicatorParamKind::EnumString,
2690    required: false,
2691    default: Some(ParamValueStatic::EnumString("normalized_volume")),
2692    min: None,
2693    max: None,
2694    step: None,
2695    enum_values: ENUM_VALUES_NORMALIZED_VOLUME_TRUE_RANGE_OUTPUT,
2696    notes: None,
2697};
2698
2699const PARAM_ANCHOR: IndicatorParamInfo = IndicatorParamInfo {
2700    key: "anchor",
2701    label: "Anchor",
2702    kind: IndicatorParamKind::EnumString,
2703    required: false,
2704    default: Some(ParamValueStatic::EnumString("1d")),
2705    min: None,
2706    max: None,
2707    step: None,
2708    enum_values: EMPTY_ENUM_VALUES,
2709    notes: Some("Anchor string for session boundary"),
2710};
2711
2712const PARAM_STRICT: IndicatorParamInfo = IndicatorParamInfo {
2713    key: "strict",
2714    label: "Strict",
2715    kind: IndicatorParamKind::Bool,
2716    required: false,
2717    default: Some(ParamValueStatic::Bool(false)),
2718    min: None,
2719    max: None,
2720    step: None,
2721    enum_values: ENUM_VALUES_TRUE_FALSE,
2722    notes: None,
2723};
2724
2725const PARAM_NONE: &[IndicatorParamInfo] = &[];
2726
2727const PARAM_RSI_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2728    key: "period",
2729    label: "Period",
2730    kind: IndicatorParamKind::Int,
2731    required: false,
2732    default: Some(ParamValueStatic::Int(14)),
2733    min: Some(1.0),
2734    max: None,
2735    step: Some(1.0),
2736    enum_values: EMPTY_ENUM_VALUES,
2737    notes: None,
2738}];
2739
2740const PARAM_ROC_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2741    key: "period",
2742    label: "Period",
2743    kind: IndicatorParamKind::Int,
2744    required: false,
2745    default: Some(ParamValueStatic::Int(9)),
2746    min: Some(1.0),
2747    max: None,
2748    step: Some(1.0),
2749    enum_values: EMPTY_ENUM_VALUES,
2750    notes: None,
2751}];
2752
2753const PARAM_LINEAR_CORRELATION_OSCILLATOR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2754    key: "period",
2755    label: "Period",
2756    kind: IndicatorParamKind::Int,
2757    required: false,
2758    default: Some(ParamValueStatic::Int(14)),
2759    min: Some(1.0),
2760    max: None,
2761    step: Some(1.0),
2762    enum_values: EMPTY_ENUM_VALUES,
2763    notes: None,
2764}];
2765
2766const PARAM_EHLERS_FM_DEMODULATOR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2767    key: "period",
2768    label: "Period",
2769    kind: IndicatorParamKind::Int,
2770    required: false,
2771    default: Some(ParamValueStatic::Int(30)),
2772    min: Some(1.0),
2773    max: None,
2774    step: Some(1.0),
2775    enum_values: EMPTY_ENUM_VALUES,
2776    notes: Some("Published default is 30."),
2777}];
2778
2779const PARAM_ADOSC: &[IndicatorParamInfo] = &[
2780    IndicatorParamInfo {
2781        key: "short_period",
2782        label: "Short Period",
2783        kind: IndicatorParamKind::Int,
2784        required: false,
2785        default: Some(ParamValueStatic::Int(3)),
2786        min: Some(1.0),
2787        max: None,
2788        step: Some(1.0),
2789        enum_values: EMPTY_ENUM_VALUES,
2790        notes: None,
2791    },
2792    IndicatorParamInfo {
2793        key: "long_period",
2794        label: "Long Period",
2795        kind: IndicatorParamKind::Int,
2796        required: false,
2797        default: Some(ParamValueStatic::Int(10)),
2798        min: Some(1.0),
2799        max: None,
2800        step: Some(1.0),
2801        enum_values: EMPTY_ENUM_VALUES,
2802        notes: None,
2803    },
2804];
2805
2806const PARAM_AO: &[IndicatorParamInfo] = &[
2807    IndicatorParamInfo {
2808        key: "short_period",
2809        label: "Short Period",
2810        kind: IndicatorParamKind::Int,
2811        required: false,
2812        default: Some(ParamValueStatic::Int(5)),
2813        min: Some(1.0),
2814        max: None,
2815        step: Some(1.0),
2816        enum_values: EMPTY_ENUM_VALUES,
2817        notes: None,
2818    },
2819    IndicatorParamInfo {
2820        key: "long_period",
2821        label: "Long Period",
2822        kind: IndicatorParamKind::Int,
2823        required: false,
2824        default: Some(ParamValueStatic::Int(34)),
2825        min: Some(1.0),
2826        max: None,
2827        step: Some(1.0),
2828        enum_values: EMPTY_ENUM_VALUES,
2829        notes: None,
2830    },
2831];
2832
2833const PARAM_EFI_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2834    key: "period",
2835    label: "Period",
2836    kind: IndicatorParamKind::Int,
2837    required: false,
2838    default: Some(ParamValueStatic::Int(13)),
2839    min: Some(1.0),
2840    max: None,
2841    step: Some(1.0),
2842    enum_values: EMPTY_ENUM_VALUES,
2843    notes: None,
2844}];
2845
2846const PARAM_MFI_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2847    key: "period",
2848    label: "Period",
2849    kind: IndicatorParamKind::Int,
2850    required: false,
2851    default: Some(ParamValueStatic::Int(14)),
2852    min: Some(1.0),
2853    max: None,
2854    step: Some(1.0),
2855    enum_values: EMPTY_ENUM_VALUES,
2856    notes: None,
2857}];
2858
2859const PARAM_MASS_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2860    key: "period",
2861    label: "Period",
2862    kind: IndicatorParamKind::Int,
2863    required: false,
2864    default: Some(ParamValueStatic::Int(5)),
2865    min: Some(1.0),
2866    max: None,
2867    step: Some(1.0),
2868    enum_values: EMPTY_ENUM_VALUES,
2869    notes: None,
2870}];
2871
2872const PARAM_KVO: &[IndicatorParamInfo] = &[
2873    IndicatorParamInfo {
2874        key: "short_period",
2875        label: "Short Period",
2876        kind: IndicatorParamKind::Int,
2877        required: false,
2878        default: Some(ParamValueStatic::Int(2)),
2879        min: Some(1.0),
2880        max: None,
2881        step: Some(1.0),
2882        enum_values: EMPTY_ENUM_VALUES,
2883        notes: None,
2884    },
2885    IndicatorParamInfo {
2886        key: "long_period",
2887        label: "Long Period",
2888        kind: IndicatorParamKind::Int,
2889        required: false,
2890        default: Some(ParamValueStatic::Int(5)),
2891        min: Some(1.0),
2892        max: None,
2893        step: Some(1.0),
2894        enum_values: EMPTY_ENUM_VALUES,
2895        notes: None,
2896    },
2897];
2898
2899const PARAM_VOSC: &[IndicatorParamInfo] = &[
2900    IndicatorParamInfo {
2901        key: "short_period",
2902        label: "Short Period",
2903        kind: IndicatorParamKind::Int,
2904        required: false,
2905        default: Some(ParamValueStatic::Int(2)),
2906        min: Some(1.0),
2907        max: None,
2908        step: Some(1.0),
2909        enum_values: EMPTY_ENUM_VALUES,
2910        notes: None,
2911    },
2912    IndicatorParamInfo {
2913        key: "long_period",
2914        label: "Long Period",
2915        kind: IndicatorParamKind::Int,
2916        required: false,
2917        default: Some(ParamValueStatic::Int(5)),
2918        min: Some(1.0),
2919        max: None,
2920        step: Some(1.0),
2921        enum_values: EMPTY_ENUM_VALUES,
2922        notes: None,
2923    },
2924];
2925
2926const PARAM_MOM_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2927    key: "period",
2928    label: "Period",
2929    kind: IndicatorParamKind::Int,
2930    required: false,
2931    default: Some(ParamValueStatic::Int(10)),
2932    min: Some(1.0),
2933    max: None,
2934    step: Some(1.0),
2935    enum_values: EMPTY_ENUM_VALUES,
2936    notes: None,
2937}];
2938
2939const PARAM_CMO_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2940    key: "period",
2941    label: "Period",
2942    kind: IndicatorParamKind::Int,
2943    required: false,
2944    default: Some(ParamValueStatic::Int(14)),
2945    min: Some(1.0),
2946    max: None,
2947    step: Some(1.0),
2948    enum_values: EMPTY_ENUM_VALUES,
2949    notes: None,
2950}];
2951
2952const PARAM_ROCP_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2953    key: "period",
2954    label: "Period",
2955    kind: IndicatorParamKind::Int,
2956    required: false,
2957    default: Some(ParamValueStatic::Int(10)),
2958    min: Some(1.0),
2959    max: None,
2960    step: Some(1.0),
2961    enum_values: EMPTY_ENUM_VALUES,
2962    notes: None,
2963}];
2964
2965const PARAM_ROCR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2966    key: "period",
2967    label: "Period",
2968    kind: IndicatorParamKind::Int,
2969    required: false,
2970    default: Some(ParamValueStatic::Int(10)),
2971    min: Some(1.0),
2972    max: None,
2973    step: Some(1.0),
2974    enum_values: EMPTY_ENUM_VALUES,
2975    notes: None,
2976}];
2977
2978const PARAM_PPO: &[IndicatorParamInfo] = &[
2979    IndicatorParamInfo {
2980        key: "fast_period",
2981        label: "Fast Period",
2982        kind: IndicatorParamKind::Int,
2983        required: false,
2984        default: Some(ParamValueStatic::Int(12)),
2985        min: Some(1.0),
2986        max: None,
2987        step: Some(1.0),
2988        enum_values: EMPTY_ENUM_VALUES,
2989        notes: None,
2990    },
2991    IndicatorParamInfo {
2992        key: "slow_period",
2993        label: "Slow Period",
2994        kind: IndicatorParamKind::Int,
2995        required: false,
2996        default: Some(ParamValueStatic::Int(26)),
2997        min: Some(1.0),
2998        max: None,
2999        step: Some(1.0),
3000        enum_values: EMPTY_ENUM_VALUES,
3001        notes: None,
3002    },
3003    IndicatorParamInfo {
3004        key: "ma_type",
3005        label: "MA Type",
3006        kind: IndicatorParamKind::EnumString,
3007        required: false,
3008        default: Some(ParamValueStatic::EnumString("sma")),
3009        min: None,
3010        max: None,
3011        step: None,
3012        enum_values: EMPTY_ENUM_VALUES,
3013        notes: None,
3014    },
3015];
3016
3017const PARAM_TRIX_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3018    key: "period",
3019    label: "Period",
3020    kind: IndicatorParamKind::Int,
3021    required: false,
3022    default: Some(ParamValueStatic::Int(18)),
3023    min: Some(1.0),
3024    max: None,
3025    step: Some(1.0),
3026    enum_values: EMPTY_ENUM_VALUES,
3027    notes: None,
3028}];
3029
3030const PARAM_TSI: &[IndicatorParamInfo] = &[
3031    IndicatorParamInfo {
3032        key: "long_period",
3033        label: "Long Period",
3034        kind: IndicatorParamKind::Int,
3035        required: false,
3036        default: Some(ParamValueStatic::Int(25)),
3037        min: Some(1.0),
3038        max: None,
3039        step: Some(1.0),
3040        enum_values: EMPTY_ENUM_VALUES,
3041        notes: None,
3042    },
3043    IndicatorParamInfo {
3044        key: "short_period",
3045        label: "Short Period",
3046        kind: IndicatorParamKind::Int,
3047        required: false,
3048        default: Some(ParamValueStatic::Int(13)),
3049        min: Some(1.0),
3050        max: None,
3051        step: Some(1.0),
3052        enum_values: EMPTY_ENUM_VALUES,
3053        notes: None,
3054    },
3055];
3056
3057const PARAM_STDDEV: &[IndicatorParamInfo] = &[
3058    IndicatorParamInfo {
3059        key: "period",
3060        label: "Period",
3061        kind: IndicatorParamKind::Int,
3062        required: false,
3063        default: Some(ParamValueStatic::Int(5)),
3064        min: Some(1.0),
3065        max: None,
3066        step: Some(1.0),
3067        enum_values: EMPTY_ENUM_VALUES,
3068        notes: None,
3069    },
3070    IndicatorParamInfo {
3071        key: "nbdev",
3072        label: "NB Dev",
3073        kind: IndicatorParamKind::Float,
3074        required: false,
3075        default: Some(ParamValueStatic::Float(1.0)),
3076        min: None,
3077        max: None,
3078        step: None,
3079        enum_values: EMPTY_ENUM_VALUES,
3080        notes: None,
3081    },
3082];
3083
3084const PARAM_WILLR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3085    key: "period",
3086    label: "Period",
3087    kind: IndicatorParamKind::Int,
3088    required: false,
3089    default: Some(ParamValueStatic::Int(14)),
3090    min: Some(1.0),
3091    max: None,
3092    step: Some(1.0),
3093    enum_values: EMPTY_ENUM_VALUES,
3094    notes: None,
3095}];
3096
3097const PARAM_ULTOSC: &[IndicatorParamInfo] = &[
3098    IndicatorParamInfo {
3099        key: "timeperiod1",
3100        label: "Time Period 1",
3101        kind: IndicatorParamKind::Int,
3102        required: false,
3103        default: Some(ParamValueStatic::Int(7)),
3104        min: Some(1.0),
3105        max: None,
3106        step: Some(1.0),
3107        enum_values: EMPTY_ENUM_VALUES,
3108        notes: None,
3109    },
3110    IndicatorParamInfo {
3111        key: "timeperiod2",
3112        label: "Time Period 2",
3113        kind: IndicatorParamKind::Int,
3114        required: false,
3115        default: Some(ParamValueStatic::Int(14)),
3116        min: Some(1.0),
3117        max: None,
3118        step: Some(1.0),
3119        enum_values: EMPTY_ENUM_VALUES,
3120        notes: None,
3121    },
3122    IndicatorParamInfo {
3123        key: "timeperiod3",
3124        label: "Time Period 3",
3125        kind: IndicatorParamKind::Int,
3126        required: false,
3127        default: Some(ParamValueStatic::Int(28)),
3128        min: Some(1.0),
3129        max: None,
3130        step: Some(1.0),
3131        enum_values: EMPTY_ENUM_VALUES,
3132        notes: None,
3133    },
3134];
3135
3136const PARAM_RANGE_BREAKOUT_SIGNALS: &[IndicatorParamInfo] = &[
3137    IndicatorParamInfo {
3138        key: "range_length",
3139        label: "Range Length",
3140        kind: IndicatorParamKind::Int,
3141        required: false,
3142        default: Some(ParamValueStatic::Int(20)),
3143        min: Some(1.0),
3144        max: None,
3145        step: Some(1.0),
3146        enum_values: EMPTY_ENUM_VALUES,
3147        notes: None,
3148    },
3149    IndicatorParamInfo {
3150        key: "confirmation_length",
3151        label: "Confirmation Length",
3152        kind: IndicatorParamKind::Int,
3153        required: false,
3154        default: Some(ParamValueStatic::Int(5)),
3155        min: Some(1.0),
3156        max: None,
3157        step: Some(1.0),
3158        enum_values: EMPTY_ENUM_VALUES,
3159        notes: Some("Uses bar-direction volume as the up/down volume proxy because TradingView lower-timeframe volume requests are unavailable in vector-ta."),
3160    },
3161];
3162
3163const PARAM_EXPONENTIAL_TREND: &[IndicatorParamInfo] = &[
3164    IndicatorParamInfo {
3165        key: "exp_rate",
3166        label: "Exponential Rate",
3167        kind: IndicatorParamKind::Float,
3168        required: false,
3169        default: Some(ParamValueStatic::Float(0.00003)),
3170        min: Some(0.0),
3171        max: Some(0.5),
3172        step: Some(0.01),
3173        enum_values: EMPTY_ENUM_VALUES,
3174        notes: None,
3175    },
3176    IndicatorParamInfo {
3177        key: "initial_distance",
3178        label: "Initial Distance",
3179        kind: IndicatorParamKind::Float,
3180        required: false,
3181        default: Some(ParamValueStatic::Float(4.0)),
3182        min: Some(0.1),
3183        max: None,
3184        step: Some(0.1),
3185        enum_values: EMPTY_ENUM_VALUES,
3186        notes: Some("The supplied Pine source seeds trend state at bar index 100 after a fixed ATR(14)-based supertrend-style initialization."),
3187    },
3188    IndicatorParamInfo {
3189        key: "width_multiplier",
3190        label: "Width Multiplier",
3191        kind: IndicatorParamKind::Float,
3192        required: false,
3193        default: Some(ParamValueStatic::Float(1.0)),
3194        min: Some(0.1),
3195        max: None,
3196        step: Some(0.1),
3197        enum_values: EMPTY_ENUM_VALUES,
3198        notes: None,
3199    },
3200];
3201const PARAM_TREND_FLOW_TRAIL: &[IndicatorParamInfo] = &[
3202    IndicatorParamInfo {
3203        key: "alpha_length",
3204        label: "AlphaTrail Length",
3205        kind: IndicatorParamKind::Int,
3206        required: false,
3207        default: Some(ParamValueStatic::Int(33)),
3208        min: Some(1.0),
3209        max: None,
3210        step: Some(1.0),
3211        enum_values: &[],
3212        notes: None,
3213    },
3214    IndicatorParamInfo {
3215        key: "alpha_multiplier",
3216        label: "AlphaTrail Multiplier",
3217        kind: IndicatorParamKind::Float,
3218        required: false,
3219        default: Some(ParamValueStatic::Float(3.3)),
3220        min: Some(0.1),
3221        max: None,
3222        step: Some(0.1),
3223        enum_values: &[],
3224        notes: None,
3225    },
3226    IndicatorParamInfo {
3227        key: "mfi_length",
3228        label: "MFI Length",
3229        kind: IndicatorParamKind::Int,
3230        required: false,
3231        default: Some(ParamValueStatic::Int(14)),
3232        min: Some(1.0),
3233        max: Some(2000.0),
3234        step: Some(1.0),
3235        enum_values: &[],
3236        notes: None,
3237    },
3238];
3239
3240const PARAM_APO: &[IndicatorParamInfo] = &[
3241    IndicatorParamInfo {
3242        key: "short_period",
3243        label: "Short Period",
3244        kind: IndicatorParamKind::Int,
3245        required: false,
3246        default: Some(ParamValueStatic::Int(10)),
3247        min: Some(1.0),
3248        max: None,
3249        step: Some(1.0),
3250        enum_values: EMPTY_ENUM_VALUES,
3251        notes: None,
3252    },
3253    IndicatorParamInfo {
3254        key: "long_period",
3255        label: "Long Period",
3256        kind: IndicatorParamKind::Int,
3257        required: false,
3258        default: Some(ParamValueStatic::Int(20)),
3259        min: Some(1.0),
3260        max: None,
3261        step: Some(1.0),
3262        enum_values: EMPTY_ENUM_VALUES,
3263        notes: None,
3264    },
3265];
3266
3267const PARAM_CCI_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3268    key: "period",
3269    label: "Period",
3270    kind: IndicatorParamKind::Int,
3271    required: false,
3272    default: Some(ParamValueStatic::Int(14)),
3273    min: Some(1.0),
3274    max: None,
3275    step: Some(1.0),
3276    enum_values: EMPTY_ENUM_VALUES,
3277    notes: None,
3278}];
3279
3280const PARAM_CCI_CYCLE: &[IndicatorParamInfo] = &[
3281    IndicatorParamInfo {
3282        key: "length",
3283        label: "Length",
3284        kind: IndicatorParamKind::Int,
3285        required: false,
3286        default: Some(ParamValueStatic::Int(10)),
3287        min: Some(1.0),
3288        max: None,
3289        step: Some(1.0),
3290        enum_values: EMPTY_ENUM_VALUES,
3291        notes: None,
3292    },
3293    IndicatorParamInfo {
3294        key: "factor",
3295        label: "Factor",
3296        kind: IndicatorParamKind::Float,
3297        required: false,
3298        default: Some(ParamValueStatic::Float(0.5)),
3299        min: Some(0.0),
3300        max: Some(1.0),
3301        step: None,
3302        enum_values: EMPTY_ENUM_VALUES,
3303        notes: None,
3304    },
3305];
3306
3307const PARAM_CFO: &[IndicatorParamInfo] = &[
3308    IndicatorParamInfo {
3309        key: "period",
3310        label: "Period",
3311        kind: IndicatorParamKind::Int,
3312        required: false,
3313        default: Some(ParamValueStatic::Int(14)),
3314        min: Some(1.0),
3315        max: None,
3316        step: Some(1.0),
3317        enum_values: EMPTY_ENUM_VALUES,
3318        notes: None,
3319    },
3320    IndicatorParamInfo {
3321        key: "scalar",
3322        label: "Scalar",
3323        kind: IndicatorParamKind::Float,
3324        required: false,
3325        default: Some(ParamValueStatic::Float(100.0)),
3326        min: None,
3327        max: None,
3328        step: None,
3329        enum_values: EMPTY_ENUM_VALUES,
3330        notes: None,
3331    },
3332];
3333
3334const PARAM_ER_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3335    key: "period",
3336    label: "Period",
3337    kind: IndicatorParamKind::Int,
3338    required: false,
3339    default: Some(ParamValueStatic::Int(5)),
3340    min: Some(1.0),
3341    max: None,
3342    step: Some(1.0),
3343    enum_values: EMPTY_ENUM_VALUES,
3344    notes: None,
3345}];
3346
3347const PARAM_KURTOSIS_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3348    key: "period",
3349    label: "Period",
3350    kind: IndicatorParamKind::Int,
3351    required: false,
3352    default: Some(ParamValueStatic::Int(5)),
3353    min: Some(1.0),
3354    max: None,
3355    step: Some(1.0),
3356    enum_values: EMPTY_ENUM_VALUES,
3357    notes: None,
3358}];
3359
3360const PARAM_NATR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3361    key: "period",
3362    label: "Period",
3363    kind: IndicatorParamKind::Int,
3364    required: false,
3365    default: Some(ParamValueStatic::Int(14)),
3366    min: Some(1.0),
3367    max: None,
3368    step: Some(1.0),
3369    enum_values: EMPTY_ENUM_VALUES,
3370    notes: None,
3371}];
3372
3373const PARAM_REVERSE_RSI: &[IndicatorParamInfo] = &[
3374    IndicatorParamInfo {
3375        key: "rsi_length",
3376        label: "RSI Length",
3377        kind: IndicatorParamKind::Int,
3378        required: false,
3379        default: Some(ParamValueStatic::Int(14)),
3380        min: Some(1.0),
3381        max: None,
3382        step: Some(1.0),
3383        enum_values: EMPTY_ENUM_VALUES,
3384        notes: None,
3385    },
3386    IndicatorParamInfo {
3387        key: "rsi_level",
3388        label: "RSI Level",
3389        kind: IndicatorParamKind::Float,
3390        required: false,
3391        default: Some(ParamValueStatic::Float(50.0)),
3392        min: Some(0.0),
3393        max: Some(100.0),
3394        step: None,
3395        enum_values: EMPTY_ENUM_VALUES,
3396        notes: None,
3397    },
3398];
3399
3400const PARAM_QSTICK: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3401    key: "period",
3402    label: "Period",
3403    kind: IndicatorParamKind::Int,
3404    required: false,
3405    default: Some(ParamValueStatic::Int(5)),
3406    min: Some(1.0),
3407    max: None,
3408    step: Some(1.0),
3409    enum_values: EMPTY_ENUM_VALUES,
3410    notes: None,
3411}];
3412
3413const PARAM_MEAN_AD_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3414    key: "period",
3415    label: "Period",
3416    kind: IndicatorParamKind::Int,
3417    required: false,
3418    default: Some(ParamValueStatic::Int(5)),
3419    min: Some(1.0),
3420    max: None,
3421    step: Some(1.0),
3422    enum_values: EMPTY_ENUM_VALUES,
3423    notes: None,
3424}];
3425
3426const PARAM_MEDIUM_AD_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3427    key: "period",
3428    label: "Period",
3429    kind: IndicatorParamKind::Int,
3430    required: false,
3431    default: Some(ParamValueStatic::Int(5)),
3432    min: Some(1.0),
3433    max: None,
3434    step: Some(1.0),
3435    enum_values: EMPTY_ENUM_VALUES,
3436    notes: None,
3437}];
3438
3439const PARAM_DEVIATION: &[IndicatorParamInfo] = &[
3440    IndicatorParamInfo {
3441        key: "period",
3442        label: "Period",
3443        kind: IndicatorParamKind::Int,
3444        required: false,
3445        default: Some(ParamValueStatic::Int(9)),
3446        min: Some(1.0),
3447        max: None,
3448        step: Some(1.0),
3449        enum_values: EMPTY_ENUM_VALUES,
3450        notes: None,
3451    },
3452    IndicatorParamInfo {
3453        key: "devtype",
3454        label: "Dev Type",
3455        kind: IndicatorParamKind::Int,
3456        required: false,
3457        default: Some(ParamValueStatic::Int(0)),
3458        min: Some(0.0),
3459        max: Some(2.0),
3460        step: Some(1.0),
3461        enum_values: EMPTY_ENUM_VALUES,
3462        notes: None,
3463    },
3464];
3465
3466const PARAM_DPO_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3467    key: "period",
3468    label: "Period",
3469    kind: IndicatorParamKind::Int,
3470    required: false,
3471    default: Some(ParamValueStatic::Int(5)),
3472    min: Some(1.0),
3473    max: None,
3474    step: Some(1.0),
3475    enum_values: EMPTY_ENUM_VALUES,
3476    notes: None,
3477}];
3478
3479const PARAM_LRSI_ALPHA: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3480    key: "alpha",
3481    label: "Alpha",
3482    kind: IndicatorParamKind::Float,
3483    required: false,
3484    default: Some(ParamValueStatic::Float(0.2)),
3485    min: Some(0.0),
3486    max: Some(1.0),
3487    step: None,
3488    enum_values: EMPTY_ENUM_VALUES,
3489    notes: None,
3490}];
3491
3492const PARAM_VELOCITY: &[IndicatorParamInfo] = &[
3493    IndicatorParamInfo {
3494        key: "length",
3495        label: "Length",
3496        kind: IndicatorParamKind::Int,
3497        required: false,
3498        default: Some(ParamValueStatic::Int(21)),
3499        min: Some(2.0),
3500        max: Some(60.0),
3501        step: Some(1.0),
3502        enum_values: EMPTY_ENUM_VALUES,
3503        notes: Some("TradingView script default source is HLCC4."),
3504    },
3505    IndicatorParamInfo {
3506        key: "smooth_length",
3507        label: "Smoothing Length",
3508        kind: IndicatorParamKind::Int,
3509        required: false,
3510        default: Some(ParamValueStatic::Int(5)),
3511        min: Some(1.0),
3512        max: Some(9.0),
3513        step: Some(1.0),
3514        enum_values: EMPTY_ENUM_VALUES,
3515        notes: None,
3516    },
3517];
3518
3519const PARAM_ADAPTIVE_MOMENTUM_OSCILLATOR: &[IndicatorParamInfo] = &[
3520    IndicatorParamInfo {
3521        key: "length",
3522        label: "Data Length",
3523        kind: IndicatorParamKind::Int,
3524        required: false,
3525        default: Some(ParamValueStatic::Int(14)),
3526        min: Some(1.0),
3527        max: None,
3528        step: Some(1.0),
3529        enum_values: EMPTY_ENUM_VALUES,
3530        notes: None,
3531    },
3532    IndicatorParamInfo {
3533        key: "smoothing_length",
3534        label: "Smoothing Length",
3535        kind: IndicatorParamKind::Int,
3536        required: false,
3537        default: Some(ParamValueStatic::Int(9)),
3538        min: Some(1.0),
3539        max: None,
3540        step: Some(1.0),
3541        enum_values: EMPTY_ENUM_VALUES,
3542        notes: None,
3543    },
3544    PARAM_OUTPUT_ADAPTIVE_MOMENTUM_OSCILLATOR,
3545];
3546
3547const PARAM_NORMALIZED_VOLUME_TRUE_RANGE: &[IndicatorParamInfo] = &[
3548    IndicatorParamInfo {
3549        key: "true_range_style",
3550        label: "True Range Style",
3551        kind: IndicatorParamKind::EnumString,
3552        required: false,
3553        default: Some(ParamValueStatic::EnumString("body")),
3554        min: None,
3555        max: None,
3556        step: None,
3557        enum_values: &["body", "hl", "delta"],
3558        notes: None,
3559    },
3560    IndicatorParamInfo {
3561        key: "outlier_range",
3562        label: "Outlier Range",
3563        kind: IndicatorParamKind::Float,
3564        required: false,
3565        default: Some(ParamValueStatic::Float(5.0)),
3566        min: Some(0.5),
3567        max: None,
3568        step: Some(0.25),
3569        enum_values: EMPTY_ENUM_VALUES,
3570        notes: None,
3571    },
3572    IndicatorParamInfo {
3573        key: "atr_length",
3574        label: "ATR Length",
3575        kind: IndicatorParamKind::Int,
3576        required: false,
3577        default: Some(ParamValueStatic::Int(14)),
3578        min: Some(2.0),
3579        max: None,
3580        step: Some(1.0),
3581        enum_values: EMPTY_ENUM_VALUES,
3582        notes: None,
3583    },
3584    IndicatorParamInfo {
3585        key: "volume_length",
3586        label: "Average Volume Length",
3587        kind: IndicatorParamKind::Int,
3588        required: false,
3589        default: Some(ParamValueStatic::Int(14)),
3590        min: Some(2.0),
3591        max: None,
3592        step: Some(1.0),
3593        enum_values: EMPTY_ENUM_VALUES,
3594        notes: None,
3595    },
3596    PARAM_OUTPUT_NORMALIZED_VOLUME_TRUE_RANGE,
3597];
3598
3599const PARAM_PVI: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3600    key: "initial_value",
3601    label: "Initial Value",
3602    kind: IndicatorParamKind::Float,
3603    required: false,
3604    default: Some(ParamValueStatic::Float(1000.0)),
3605    min: None,
3606    max: None,
3607    step: None,
3608    enum_values: EMPTY_ENUM_VALUES,
3609    notes: None,
3610}];
3611
3612const PARAM_PFE: &[IndicatorParamInfo] = &[
3613    IndicatorParamInfo {
3614        key: "period",
3615        label: "Period",
3616        kind: IndicatorParamKind::Int,
3617        required: false,
3618        default: Some(ParamValueStatic::Int(10)),
3619        min: Some(1.0),
3620        max: None,
3621        step: Some(1.0),
3622        enum_values: EMPTY_ENUM_VALUES,
3623        notes: None,
3624    },
3625    IndicatorParamInfo {
3626        key: "smoothing",
3627        label: "Smoothing",
3628        kind: IndicatorParamKind::Int,
3629        required: false,
3630        default: Some(ParamValueStatic::Int(5)),
3631        min: Some(1.0),
3632        max: None,
3633        step: Some(1.0),
3634        enum_values: EMPTY_ENUM_VALUES,
3635        notes: None,
3636    },
3637];
3638
3639const PARAM_PERCENTILE_NEAREST_RANK: &[IndicatorParamInfo] = &[
3640    IndicatorParamInfo {
3641        key: "length",
3642        label: "Length",
3643        kind: IndicatorParamKind::Int,
3644        required: false,
3645        default: Some(ParamValueStatic::Int(15)),
3646        min: Some(1.0),
3647        max: None,
3648        step: Some(1.0),
3649        enum_values: EMPTY_ENUM_VALUES,
3650        notes: None,
3651    },
3652    IndicatorParamInfo {
3653        key: "percentage",
3654        label: "Percentage",
3655        kind: IndicatorParamKind::Float,
3656        required: false,
3657        default: Some(ParamValueStatic::Float(50.0)),
3658        min: Some(0.0),
3659        max: Some(100.0),
3660        step: None,
3661        enum_values: EMPTY_ENUM_VALUES,
3662        notes: None,
3663    },
3664];
3665
3666const PARAM_UI: &[IndicatorParamInfo] = &[
3667    IndicatorParamInfo {
3668        key: "period",
3669        label: "Period",
3670        kind: IndicatorParamKind::Int,
3671        required: false,
3672        default: Some(ParamValueStatic::Int(14)),
3673        min: Some(1.0),
3674        max: None,
3675        step: Some(1.0),
3676        enum_values: EMPTY_ENUM_VALUES,
3677        notes: None,
3678    },
3679    IndicatorParamInfo {
3680        key: "scalar",
3681        label: "Scalar",
3682        kind: IndicatorParamKind::Float,
3683        required: false,
3684        default: Some(ParamValueStatic::Float(100.0)),
3685        min: None,
3686        max: None,
3687        step: None,
3688        enum_values: EMPTY_ENUM_VALUES,
3689        notes: None,
3690    },
3691];
3692
3693const PARAM_ZSCORE: &[IndicatorParamInfo] = &[
3694    IndicatorParamInfo {
3695        key: "period",
3696        label: "Period",
3697        kind: IndicatorParamKind::Int,
3698        required: false,
3699        default: Some(ParamValueStatic::Int(14)),
3700        min: Some(1.0),
3701        max: None,
3702        step: Some(1.0),
3703        enum_values: EMPTY_ENUM_VALUES,
3704        notes: None,
3705    },
3706    IndicatorParamInfo {
3707        key: "ma_type",
3708        label: "MA Type",
3709        kind: IndicatorParamKind::EnumString,
3710        required: false,
3711        default: Some(ParamValueStatic::EnumString("sma")),
3712        min: None,
3713        max: None,
3714        step: None,
3715        enum_values: EMPTY_ENUM_VALUES,
3716        notes: None,
3717    },
3718    IndicatorParamInfo {
3719        key: "nbdev",
3720        label: "NB Dev",
3721        kind: IndicatorParamKind::Float,
3722        required: false,
3723        default: Some(ParamValueStatic::Float(1.0)),
3724        min: None,
3725        max: None,
3726        step: None,
3727        enum_values: EMPTY_ENUM_VALUES,
3728        notes: None,
3729    },
3730    IndicatorParamInfo {
3731        key: "devtype",
3732        label: "Dev Type",
3733        kind: IndicatorParamKind::Int,
3734        required: false,
3735        default: Some(ParamValueStatic::Int(0)),
3736        min: Some(0.0),
3737        max: Some(2.0),
3738        step: Some(1.0),
3739        enum_values: EMPTY_ENUM_VALUES,
3740        notes: None,
3741    },
3742];
3743
3744const PARAM_MIDPOINT_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3745    key: "period",
3746    label: "Period",
3747    kind: IndicatorParamKind::Int,
3748    required: false,
3749    default: Some(ParamValueStatic::Int(14)),
3750    min: Some(1.0),
3751    max: None,
3752    step: Some(1.0),
3753    enum_values: EMPTY_ENUM_VALUES,
3754    notes: None,
3755}];
3756
3757const PARAM_MIDPRICE_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3758    key: "period",
3759    label: "Period",
3760    kind: IndicatorParamKind::Int,
3761    required: false,
3762    default: Some(ParamValueStatic::Int(14)),
3763    min: Some(1.0),
3764    max: None,
3765    step: Some(1.0),
3766    enum_values: EMPTY_ENUM_VALUES,
3767    notes: None,
3768}];
3769
3770const PARAM_TSF_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3771    key: "period",
3772    label: "Period",
3773    kind: IndicatorParamKind::Int,
3774    required: false,
3775    default: Some(ParamValueStatic::Int(14)),
3776    min: Some(2.0),
3777    max: None,
3778    step: Some(1.0),
3779    enum_values: EMPTY_ENUM_VALUES,
3780    notes: None,
3781}];
3782
3783const PARAM_VAR: &[IndicatorParamInfo] = &[
3784    IndicatorParamInfo {
3785        key: "period",
3786        label: "Period",
3787        kind: IndicatorParamKind::Int,
3788        required: false,
3789        default: Some(ParamValueStatic::Int(14)),
3790        min: Some(1.0),
3791        max: None,
3792        step: Some(1.0),
3793        enum_values: EMPTY_ENUM_VALUES,
3794        notes: None,
3795    },
3796    IndicatorParamInfo {
3797        key: "nbdev",
3798        label: "NB Dev",
3799        kind: IndicatorParamKind::Float,
3800        required: false,
3801        default: Some(ParamValueStatic::Float(1.0)),
3802        min: None,
3803        max: None,
3804        step: None,
3805        enum_values: EMPTY_ENUM_VALUES,
3806        notes: None,
3807    },
3808];
3809
3810const PARAM_ADX_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3811    key: "period",
3812    label: "Period",
3813    kind: IndicatorParamKind::Int,
3814    required: false,
3815    default: Some(ParamValueStatic::Int(14)),
3816    min: Some(1.0),
3817    max: None,
3818    step: Some(1.0),
3819    enum_values: EMPTY_ENUM_VALUES,
3820    notes: None,
3821}];
3822
3823const PARAM_DX_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3824    key: "period",
3825    label: "Period",
3826    kind: IndicatorParamKind::Int,
3827    required: false,
3828    default: Some(ParamValueStatic::Int(14)),
3829    min: Some(1.0),
3830    max: None,
3831    step: Some(1.0),
3832    enum_values: EMPTY_ENUM_VALUES,
3833    notes: None,
3834}];
3835
3836const PARAM_ATR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3837    key: "length",
3838    label: "Length",
3839    kind: IndicatorParamKind::Int,
3840    required: false,
3841    default: Some(ParamValueStatic::Int(14)),
3842    min: Some(1.0),
3843    max: None,
3844    step: Some(1.0),
3845    enum_values: EMPTY_ENUM_VALUES,
3846    notes: None,
3847}];
3848
3849const PARAM_PSYCHOLOGICAL_LINE: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3850    key: "length",
3851    label: "Length",
3852    kind: IndicatorParamKind::Int,
3853    required: false,
3854    default: Some(ParamValueStatic::Int(20)),
3855    min: Some(1.0),
3856    max: None,
3857    step: Some(1.0),
3858    enum_values: EMPTY_ENUM_VALUES,
3859    notes: None,
3860}];
3861
3862const PARAM_RANK_CORRELATION_INDEX: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3863    key: "length",
3864    label: "Length",
3865    kind: IndicatorParamKind::Int,
3866    required: false,
3867    default: Some(ParamValueStatic::Int(12)),
3868    min: Some(2.0),
3869    max: None,
3870    step: Some(1.0),
3871    enum_values: EMPTY_ENUM_VALUES,
3872    notes: None,
3873}];
3874
3875const PARAM_LINEAR_REGRESSION_INTENSITY: &[IndicatorParamInfo] = &[
3876    IndicatorParamInfo {
3877        key: "lookback_period",
3878        label: "Lookback Period",
3879        kind: IndicatorParamKind::Int,
3880        required: false,
3881        default: Some(ParamValueStatic::Int(12)),
3882        min: Some(1.0),
3883        max: None,
3884        step: Some(1.0),
3885        enum_values: EMPTY_ENUM_VALUES,
3886        notes: None,
3887    },
3888    IndicatorParamInfo {
3889        key: "range_tolerance",
3890        label: "Range Tolerance",
3891        kind: IndicatorParamKind::Float,
3892        required: false,
3893        default: Some(ParamValueStatic::Float(90.0)),
3894        min: Some(0.0),
3895        max: Some(100.0),
3896        step: Some(1.0),
3897        enum_values: EMPTY_ENUM_VALUES,
3898        notes: None,
3899    },
3900    IndicatorParamInfo {
3901        key: "linreg_length",
3902        label: "Linear Regression Length",
3903        kind: IndicatorParamKind::Int,
3904        required: false,
3905        default: Some(ParamValueStatic::Int(90)),
3906        min: Some(1.0),
3907        max: None,
3908        step: Some(1.0),
3909        enum_values: EMPTY_ENUM_VALUES,
3910        notes: None,
3911    },
3912];
3913
3914const PARAM_TREND_FOLLOWER: &[IndicatorParamInfo] = &[
3915    IndicatorParamInfo {
3916        key: "matype",
3917        label: "MA Type",
3918        kind: IndicatorParamKind::EnumString,
3919        required: false,
3920        default: Some(ParamValueStatic::EnumString("ema")),
3921        min: None,
3922        max: None,
3923        step: None,
3924        enum_values: EMPTY_ENUM_VALUES,
3925        notes: None,
3926    },
3927    IndicatorParamInfo {
3928        key: "trend_period",
3929        label: "Trend Period",
3930        kind: IndicatorParamKind::Int,
3931        required: false,
3932        default: Some(ParamValueStatic::Int(20)),
3933        min: Some(1.0),
3934        max: None,
3935        step: Some(1.0),
3936        enum_values: EMPTY_ENUM_VALUES,
3937        notes: None,
3938    },
3939    IndicatorParamInfo {
3940        key: "ma_period",
3941        label: "MA Period",
3942        kind: IndicatorParamKind::Int,
3943        required: false,
3944        default: Some(ParamValueStatic::Int(20)),
3945        min: Some(1.0),
3946        max: None,
3947        step: Some(1.0),
3948        enum_values: EMPTY_ENUM_VALUES,
3949        notes: None,
3950    },
3951    IndicatorParamInfo {
3952        key: "channel_rate_percent",
3953        label: "Channel Rate %",
3954        kind: IndicatorParamKind::Float,
3955        required: false,
3956        default: Some(ParamValueStatic::Float(1.0)),
3957        min: Some(0.0000001),
3958        max: None,
3959        step: Some(0.1),
3960        enum_values: EMPTY_ENUM_VALUES,
3961        notes: None,
3962    },
3963    IndicatorParamInfo {
3964        key: "use_linear_regression",
3965        label: "Use Linear Regression",
3966        kind: IndicatorParamKind::Bool,
3967        required: false,
3968        default: Some(ParamValueStatic::Bool(true)),
3969        min: None,
3970        max: None,
3971        step: None,
3972        enum_values: ENUM_VALUES_TRUE_FALSE,
3973        notes: None,
3974    },
3975    IndicatorParamInfo {
3976        key: "linear_regression_period",
3977        label: "Linear Regression Period",
3978        kind: IndicatorParamKind::Int,
3979        required: false,
3980        default: Some(ParamValueStatic::Int(5)),
3981        min: Some(2.0),
3982        max: None,
3983        step: Some(1.0),
3984        enum_values: EMPTY_ENUM_VALUES,
3985        notes: None,
3986    },
3987];
3988
3989const PARAM_TREND_DIRECTION_FORCE_INDEX: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3990    key: "length",
3991    label: "Length",
3992    kind: IndicatorParamKind::Int,
3993    required: false,
3994    default: Some(ParamValueStatic::Int(10)),
3995    min: Some(1.0),
3996    max: None,
3997    step: Some(1.0),
3998    enum_values: EMPTY_ENUM_VALUES,
3999    notes: None,
4000}];
4001
4002const PARAM_TREND_CONTINUATION_FACTOR: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4003    key: "length",
4004    label: "Length",
4005    kind: IndicatorParamKind::Int,
4006    required: false,
4007    default: Some(ParamValueStatic::Int(35)),
4008    min: Some(1.0),
4009    max: None,
4010    step: Some(1.0),
4011    enum_values: EMPTY_ENUM_VALUES,
4012    notes: None,
4013}];
4014
4015const PARAM_EWMA_VOLATILITY: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4016    key: "lambda",
4017    label: "Lambda",
4018    kind: IndicatorParamKind::Float,
4019    required: false,
4020    default: Some(ParamValueStatic::Float(0.94)),
4021    min: Some(0.0),
4022    max: Some(0.999_999_999),
4023    step: Some(0.01),
4024    enum_values: EMPTY_ENUM_VALUES,
4025    notes: Some("Pine-faithful EMA mapping from lambda to rounded EMA length"),
4026}];
4027
4028const PARAM_ACCUMULATION_SWING_INDEX: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4029    key: "daily_limit",
4030    label: "Daily Limit",
4031    kind: IndicatorParamKind::Float,
4032    required: false,
4033    default: Some(ParamValueStatic::Float(10_000.0)),
4034    min: Some(0.000_000_001),
4035    max: None,
4036    step: Some(1.0),
4037    enum_values: EMPTY_ENUM_VALUES,
4038    notes: Some("Pine-faithful Wilder ASI daily limit divisor"),
4039}];
4040
4041const PARAM_DAILY_FACTOR: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4042    key: "threshold_level",
4043    label: "Threshold Level",
4044    kind: IndicatorParamKind::Float,
4045    required: false,
4046    default: Some(ParamValueStatic::Float(0.35)),
4047    min: Some(0.0),
4048    max: Some(1.0),
4049    step: Some(0.01),
4050    enum_values: EMPTY_ENUM_VALUES,
4051    notes: Some(
4052        "Daily Factor threshold used for the strong signal state; EMA length is fixed at 14",
4053    ),
4054}];
4055
4056const PARAM_MOVING_AVERAGE_CROSS_PROBABILITY: &[IndicatorParamInfo] = &[
4057    IndicatorParamInfo {
4058        key: "ma_type",
4059        label: "MA Type",
4060        kind: IndicatorParamKind::EnumString,
4061        required: false,
4062        default: Some(ParamValueStatic::EnumString("ema")),
4063        min: None,
4064        max: None,
4065        step: None,
4066        enum_values: ENUM_VALUES_MOVING_AVERAGE_CROSS_PROBABILITY_MA_TYPE,
4067        notes: Some("Moving-average mode used for the fast and slow baseline pair"),
4068    },
4069    IndicatorParamInfo {
4070        key: "smoothing_window",
4071        label: "Smoothing Window",
4072        kind: IndicatorParamKind::Int,
4073        required: false,
4074        default: Some(ParamValueStatic::Int(7)),
4075        min: Some(2.0),
4076        max: None,
4077        step: Some(1.0),
4078        enum_values: EMPTY_ENUM_VALUES,
4079        notes: Some(
4080            "Hull moving-average and standard-deviation lookback used for the forecast envelope",
4081        ),
4082    },
4083    IndicatorParamInfo {
4084        key: "slow_length",
4085        label: "Slow Length",
4086        kind: IndicatorParamKind::Int,
4087        required: false,
4088        default: Some(ParamValueStatic::Int(30)),
4089        min: Some(2.0),
4090        max: None,
4091        step: Some(1.0),
4092        enum_values: EMPTY_ENUM_VALUES,
4093        notes: Some("Slow moving-average length; must remain greater than fast_length"),
4094    },
4095    IndicatorParamInfo {
4096        key: "fast_length",
4097        label: "Fast Length",
4098        kind: IndicatorParamKind::Int,
4099        required: false,
4100        default: Some(ParamValueStatic::Int(14)),
4101        min: Some(1.0),
4102        max: None,
4103        step: Some(1.0),
4104        enum_values: EMPTY_ENUM_VALUES,
4105        notes: Some("Fast moving-average length used by the crossover simulation"),
4106    },
4107    IndicatorParamInfo {
4108        key: "resolution",
4109        label: "Resolution",
4110        kind: IndicatorParamKind::Int,
4111        required: false,
4112        default: Some(ParamValueStatic::Int(50)),
4113        min: Some(2.0),
4114        max: None,
4115        step: Some(1.0),
4116        enum_values: EMPTY_ENUM_VALUES,
4117        notes: Some("Number of simulated future prices sampled across the forecast envelope"),
4118    },
4119];
4120
4121const PARAM_BULLS_V_BEARS: &[IndicatorParamInfo] = &[
4122    IndicatorParamInfo {
4123        key: "period",
4124        label: "Period",
4125        kind: IndicatorParamKind::Int,
4126        required: false,
4127        default: Some(ParamValueStatic::Int(14)),
4128        min: Some(1.0),
4129        max: None,
4130        step: Some(1.0),
4131        enum_values: EMPTY_ENUM_VALUES,
4132        notes: Some("Moving average period used for the Bulls and Bears pressure baseline"),
4133    },
4134    IndicatorParamInfo {
4135        key: "ma_type",
4136        label: "MA Type",
4137        kind: IndicatorParamKind::EnumString,
4138        required: false,
4139        default: Some(ParamValueStatic::EnumString("ema")),
4140        min: None,
4141        max: None,
4142        step: None,
4143        enum_values: ENUM_VALUES_BULLS_V_BEARS_MA_TYPE,
4144        notes: Some("Moving average type used for the baseline"),
4145    },
4146    IndicatorParamInfo {
4147        key: "calculation_method",
4148        label: "Calculation Method",
4149        kind: IndicatorParamKind::EnumString,
4150        required: false,
4151        default: Some(ParamValueStatic::EnumString("normalized")),
4152        min: None,
4153        max: None,
4154        step: None,
4155        enum_values: ENUM_VALUES_BULLS_V_BEARS_CALCULATION_METHOD,
4156        notes: Some(
4157            "Normalized mode reproduces the v4-style scaling; raw mode uses rolling raw thresholds",
4158        ),
4159    },
4160    IndicatorParamInfo {
4161        key: "normalized_bars_back",
4162        label: "Normalized Bars Back",
4163        kind: IndicatorParamKind::Int,
4164        required: false,
4165        default: Some(ParamValueStatic::Int(120)),
4166        min: Some(1.0),
4167        max: None,
4168        step: Some(1.0),
4169        enum_values: EMPTY_ENUM_VALUES,
4170        notes: Some("Lookback window used for bull and bear normalization"),
4171    },
4172    IndicatorParamInfo {
4173        key: "raw_rolling_period",
4174        label: "Raw Rolling Period",
4175        kind: IndicatorParamKind::Int,
4176        required: false,
4177        default: Some(ParamValueStatic::Int(50)),
4178        min: Some(1.0),
4179        max: None,
4180        step: Some(1.0),
4181        enum_values: EMPTY_ENUM_VALUES,
4182        notes: Some("Rolling window used to derive raw mode dynamic thresholds"),
4183    },
4184    IndicatorParamInfo {
4185        key: "raw_threshold_percentile",
4186        label: "Raw Threshold Percentile",
4187        kind: IndicatorParamKind::Float,
4188        required: false,
4189        default: Some(ParamValueStatic::Float(95.0)),
4190        min: Some(80.0),
4191        max: Some(99.0),
4192        step: Some(0.5),
4193        enum_values: EMPTY_ENUM_VALUES,
4194        notes: Some("Percentile used to map the raw rolling range into upper and lower thresholds"),
4195    },
4196    IndicatorParamInfo {
4197        key: "threshold_level",
4198        label: "Threshold Level",
4199        kind: IndicatorParamKind::Float,
4200        required: false,
4201        default: Some(ParamValueStatic::Float(80.0)),
4202        min: Some(0.0),
4203        max: Some(100.0),
4204        step: Some(1.0),
4205        enum_values: EMPTY_ENUM_VALUES,
4206        notes: Some("Fixed normalized-mode threshold level"),
4207    },
4208];
4209
4210const PARAM_REGRESSION_SLOPE_OSCILLATOR: &[IndicatorParamInfo] = &[
4211    IndicatorParamInfo {
4212        key: "min_range",
4213        label: "Min Range",
4214        kind: IndicatorParamKind::Int,
4215        required: false,
4216        default: Some(ParamValueStatic::Int(10)),
4217        min: Some(2.0),
4218        max: None,
4219        step: Some(1.0),
4220        enum_values: EMPTY_ENUM_VALUES,
4221        notes: Some("Shortest regression lookback sampled by the oscillator"),
4222    },
4223    IndicatorParamInfo {
4224        key: "max_range",
4225        label: "Max Range",
4226        kind: IndicatorParamKind::Int,
4227        required: false,
4228        default: Some(ParamValueStatic::Int(100)),
4229        min: Some(2.0),
4230        max: None,
4231        step: Some(1.0),
4232        enum_values: EMPTY_ENUM_VALUES,
4233        notes: Some("Longest regression lookback sampled by the oscillator"),
4234    },
4235    IndicatorParamInfo {
4236        key: "step",
4237        label: "Step",
4238        kind: IndicatorParamKind::Int,
4239        required: false,
4240        default: Some(ParamValueStatic::Int(5)),
4241        min: Some(1.0),
4242        max: None,
4243        step: Some(1.0),
4244        enum_values: EMPTY_ENUM_VALUES,
4245        notes: Some("Increment between sampled regression lookbacks"),
4246    },
4247    IndicatorParamInfo {
4248        key: "signal_line",
4249        label: "Signal Line",
4250        kind: IndicatorParamKind::Int,
4251        required: false,
4252        default: Some(ParamValueStatic::Int(7)),
4253        min: Some(1.0),
4254        max: None,
4255        step: Some(1.0),
4256        enum_values: EMPTY_ENUM_VALUES,
4257        notes: Some("SMA length applied to the oscillator"),
4258    },
4259];
4260
4261const PARAM_SMOOTH_THEIL_SEN: &[IndicatorParamInfo] = &[
4262    IndicatorParamInfo {
4263        key: "source",
4264        label: "Source",
4265        kind: IndicatorParamKind::EnumString,
4266        required: false,
4267        default: Some(ParamValueStatic::EnumString("close")),
4268        min: None,
4269        max: None,
4270        step: None,
4271        enum_values: ENUM_VALUES_PRICE_SOURCE,
4272        notes: Some("Source series used by the Theil-Sen regression"),
4273    },
4274    IndicatorParamInfo {
4275        key: "length",
4276        label: "Length",
4277        kind: IndicatorParamKind::Int,
4278        required: false,
4279        default: Some(ParamValueStatic::Int(25)),
4280        min: Some(2.0),
4281        max: None,
4282        step: Some(1.0),
4283        enum_values: EMPTY_ENUM_VALUES,
4284        notes: Some("Regression window length"),
4285    },
4286    IndicatorParamInfo {
4287        key: "offset",
4288        label: "Offset",
4289        kind: IndicatorParamKind::Int,
4290        required: false,
4291        default: Some(ParamValueStatic::Int(0)),
4292        min: Some(0.0),
4293        max: None,
4294        step: Some(1.0),
4295        enum_values: EMPTY_ENUM_VALUES,
4296        notes: Some("Lookback offset used for the regression anchor"),
4297    },
4298    IndicatorParamInfo {
4299        key: "multiplier",
4300        label: "Multiplier",
4301        kind: IndicatorParamKind::Float,
4302        required: false,
4303        default: Some(ParamValueStatic::Float(2.0)),
4304        min: Some(0.0),
4305        max: None,
4306        step: Some(0.125),
4307        enum_values: EMPTY_ENUM_VALUES,
4308        notes: Some("Deviation-band scale factor"),
4309    },
4310    IndicatorParamInfo {
4311        key: "slope_style",
4312        label: "Slope Style",
4313        kind: IndicatorParamKind::EnumString,
4314        required: false,
4315        default: Some(ParamValueStatic::EnumString("smooth_median")),
4316        min: None,
4317        max: None,
4318        step: None,
4319        enum_values: ENUM_VALUES_SMOOTH_THEIL_SEN_STAT_STYLE,
4320        notes: Some("Estimator used for pairwise slope aggregation"),
4321    },
4322    IndicatorParamInfo {
4323        key: "residual_style",
4324        label: "Residual Style",
4325        kind: IndicatorParamKind::EnumString,
4326        required: false,
4327        default: Some(ParamValueStatic::EnumString("smooth_median")),
4328        min: None,
4329        max: None,
4330        step: None,
4331        enum_values: ENUM_VALUES_SMOOTH_THEIL_SEN_STAT_STYLE,
4332        notes: Some("Estimator used for intercept aggregation"),
4333    },
4334    IndicatorParamInfo {
4335        key: "deviation_style",
4336        label: "Deviation Style",
4337        kind: IndicatorParamKind::EnumString,
4338        required: false,
4339        default: Some(ParamValueStatic::EnumString("mad")),
4340        min: None,
4341        max: None,
4342        step: None,
4343        enum_values: ENUM_VALUES_SMOOTH_THEIL_SEN_DEVIATION_STYLE,
4344        notes: Some("Deviation method used for the bands"),
4345    },
4346    IndicatorParamInfo {
4347        key: "mad_style",
4348        label: "MAD Style",
4349        kind: IndicatorParamKind::EnumString,
4350        required: false,
4351        default: Some(ParamValueStatic::EnumString("smooth_median")),
4352        min: None,
4353        max: None,
4354        step: None,
4355        enum_values: ENUM_VALUES_SMOOTH_THEIL_SEN_STAT_STYLE,
4356        notes: Some("Estimator used when deviation_style is mad"),
4357    },
4358    IndicatorParamInfo {
4359        key: "include_prediction_in_deviation",
4360        label: "Include Prediction In Deviation",
4361        kind: IndicatorParamKind::Bool,
4362        required: false,
4363        default: Some(ParamValueStatic::Bool(false)),
4364        min: None,
4365        max: None,
4366        step: None,
4367        enum_values: ENUM_VALUES_TRUE_FALSE,
4368        notes: Some("Include the extrapolated offset region in deviation estimation"),
4369    },
4370];
4371
4372const PARAM_L2_EHLERS_SIGNAL_TO_NOISE: &[IndicatorParamInfo] = &[
4373    IndicatorParamInfo {
4374        key: "source",
4375        label: "Source",
4376        kind: IndicatorParamKind::EnumString,
4377        required: false,
4378        default: Some(ParamValueStatic::EnumString("hl2")),
4379        min: None,
4380        max: None,
4381        step: None,
4382        enum_values: ENUM_VALUES_PRICE_SOURCE,
4383        notes: Some("Source used for the Hilbert-transform signal component"),
4384    },
4385    IndicatorParamInfo {
4386        key: "smooth_period",
4387        label: "Smooth Period",
4388        kind: IndicatorParamKind::Int,
4389        required: false,
4390        default: Some(ParamValueStatic::Int(10)),
4391        min: Some(1.0),
4392        max: None,
4393        step: Some(1.0),
4394        enum_values: EMPTY_ENUM_VALUES,
4395        notes: Some("Hilbert-transform scaling period used by the Ehlers SNR calculation"),
4396    },
4397];
4398
4399const PARAM_EHLERS_SMOOTHED_ADAPTIVE_MOMENTUM: &[IndicatorParamInfo] = &[
4400    IndicatorParamInfo {
4401        key: "source",
4402        label: "Source",
4403        kind: IndicatorParamKind::EnumString,
4404        required: false,
4405        default: Some(ParamValueStatic::EnumString("hl2")),
4406        min: None,
4407        max: None,
4408        step: None,
4409        enum_values: ENUM_VALUES_PRICE_SOURCE,
4410        notes: Some("Price source used by the Pine-faithful ESAM core"),
4411    },
4412    IndicatorParamInfo {
4413        key: "alpha",
4414        label: "Alpha",
4415        kind: IndicatorParamKind::Float,
4416        required: false,
4417        default: Some(ParamValueStatic::Float(0.07)),
4418        min: Some(0.0),
4419        max: None,
4420        step: Some(0.01),
4421        enum_values: EMPTY_ENUM_VALUES,
4422        notes: Some("Pine-faithful high-pass alpha term"),
4423    },
4424    IndicatorParamInfo {
4425        key: "cutoff",
4426        label: "Cutoff",
4427        kind: IndicatorParamKind::Float,
4428        required: false,
4429        default: Some(ParamValueStatic::Float(8.0)),
4430        min: Some(0.000_000_001),
4431        max: None,
4432        step: Some(0.1),
4433        enum_values: EMPTY_ENUM_VALUES,
4434        notes: Some("Pine-faithful smoothing cutoff used by the final 3-pole filter"),
4435    },
4436];
4437
4438const PARAM_EHLERS_ADAPTIVE_CYBER_CYCLE: &[IndicatorParamInfo] = &[
4439    IndicatorParamInfo {
4440        key: "source",
4441        label: "Source",
4442        kind: IndicatorParamKind::EnumString,
4443        required: false,
4444        default: Some(ParamValueStatic::EnumString("hl2")),
4445        min: None,
4446        max: None,
4447        step: None,
4448        enum_values: ENUM_VALUES_PRICE_SOURCE,
4449        notes: Some("Price source used by the Adaptive Cyber Cycle core"),
4450    },
4451    IndicatorParamInfo {
4452        key: "alpha",
4453        label: "Alpha",
4454        kind: IndicatorParamKind::Float,
4455        required: false,
4456        default: Some(ParamValueStatic::Float(0.07)),
4457        min: Some(0.0),
4458        max: Some(1.0),
4459        step: Some(0.01),
4460        enum_values: EMPTY_ENUM_VALUES,
4461        notes: Some("Fixed alpha term used by the recursive cycle-estimation stage"),
4462    },
4463];
4464
4465const PARAM_EHLERS_SIMPLE_CYCLE_INDICATOR: &[IndicatorParamInfo] = &[
4466    IndicatorParamInfo {
4467        key: "source",
4468        label: "Source",
4469        kind: IndicatorParamKind::EnumString,
4470        required: false,
4471        default: Some(ParamValueStatic::EnumString("hl2")),
4472        min: None,
4473        max: None,
4474        step: None,
4475        enum_values: ENUM_VALUES_PRICE_SOURCE,
4476        notes: Some("Price source used by the Pine-faithful simple cycle core"),
4477    },
4478    IndicatorParamInfo {
4479        key: "alpha",
4480        label: "Alpha",
4481        kind: IndicatorParamKind::Float,
4482        required: false,
4483        default: Some(ParamValueStatic::Float(0.07)),
4484        min: Some(0.0),
4485        max: Some(1.0),
4486        step: Some(0.01),
4487        enum_values: EMPTY_ENUM_VALUES,
4488        notes: Some("Pine-faithful recursive alpha term used by the cycle filter"),
4489    },
4490];
4491
4492const PARAM_L1_EHLERS_PHASOR: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4493    key: "domestic_cycle_length",
4494    label: "Domestic Cycle Length",
4495    kind: IndicatorParamKind::Int,
4496    required: false,
4497    default: Some(ParamValueStatic::Int(15)),
4498    min: Some(1.0),
4499    max: None,
4500    step: Some(1.0),
4501    enum_values: EMPTY_ENUM_VALUES,
4502    notes: Some("Sliding phasor window length used by the Pine-faithful blackcat phase-angle core"),
4503}];
4504
4505const PARAM_ANDEAN_OSCILLATOR: &[IndicatorParamInfo] = &[
4506    IndicatorParamInfo {
4507        key: "length",
4508        label: "Length",
4509        kind: IndicatorParamKind::Int,
4510        required: false,
4511        default: Some(ParamValueStatic::Int(50)),
4512        min: Some(1.0),
4513        max: None,
4514        step: Some(1.0),
4515        enum_values: EMPTY_ENUM_VALUES,
4516        notes: Some("Envelope EMA length used by the Pine-faithful Andean core"),
4517    },
4518    IndicatorParamInfo {
4519        key: "signal_length",
4520        label: "Signal Length",
4521        kind: IndicatorParamKind::Int,
4522        required: false,
4523        default: Some(ParamValueStatic::Int(9)),
4524        min: Some(1.0),
4525        max: None,
4526        step: Some(1.0),
4527        enum_values: EMPTY_ENUM_VALUES,
4528        notes: Some("EMA length applied to max(bull, bear) for the Pine-faithful signal line"),
4529    },
4530];
4531
4532const PARAM_RANDOM_WALK_INDEX: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4533    key: "length",
4534    label: "Length",
4535    kind: IndicatorParamKind::Int,
4536    required: false,
4537    default: Some(ParamValueStatic::Int(14)),
4538    min: Some(1.0),
4539    max: None,
4540    step: Some(1.0),
4541    enum_values: EMPTY_ENUM_VALUES,
4542    notes: Some("Pine-faithful single ATR/history length used by the everget script"),
4543}];
4544
4545const PARAM_PRICE_MOVING_AVERAGE_RATIO_PERCENTILE: &[IndicatorParamInfo] = &[
4546    IndicatorParamInfo {
4547        key: "source",
4548        label: "Source",
4549        kind: IndicatorParamKind::EnumString,
4550        required: false,
4551        default: Some(ParamValueStatic::EnumString("close")),
4552        min: None,
4553        max: None,
4554        step: None,
4555        enum_values: ENUM_VALUES_PRICE_SOURCE,
4556        notes: Some("Price source used for PMAR and PMARP"),
4557    },
4558    IndicatorParamInfo {
4559        key: "ma_length",
4560        label: "PMAR Length",
4561        kind: IndicatorParamKind::Int,
4562        required: false,
4563        default: Some(ParamValueStatic::Int(20)),
4564        min: Some(1.0),
4565        max: None,
4566        step: Some(1.0),
4567        enum_values: EMPTY_ENUM_VALUES,
4568        notes: Some("Moving average length used for PMAR"),
4569    },
4570    IndicatorParamInfo {
4571        key: "ma_type",
4572        label: "PMAR MA Type",
4573        kind: IndicatorParamKind::EnumString,
4574        required: false,
4575        default: Some(ParamValueStatic::EnumString("vwma")),
4576        min: None,
4577        max: None,
4578        step: None,
4579        enum_values: ENUM_VALUES_PMARP_MA_TYPE,
4580        notes: Some("Moving average type used for PMAR"),
4581    },
4582    IndicatorParamInfo {
4583        key: "pmarp_lookback",
4584        label: "PMARP Lookback",
4585        kind: IndicatorParamKind::Int,
4586        required: false,
4587        default: Some(ParamValueStatic::Int(350)),
4588        min: Some(1.0),
4589        max: Some(1900.0),
4590        step: Some(1.0),
4591        enum_values: EMPTY_ENUM_VALUES,
4592        notes: Some("Lookback used by the PMARP percentile count"),
4593    },
4594    IndicatorParamInfo {
4595        key: "signal_ma_length",
4596        label: "Signal MA Length",
4597        kind: IndicatorParamKind::Int,
4598        required: false,
4599        default: Some(ParamValueStatic::Int(20)),
4600        min: Some(1.0),
4601        max: None,
4602        step: Some(1.0),
4603        enum_values: EMPTY_ENUM_VALUES,
4604        notes: Some("Signal moving average length"),
4605    },
4606    IndicatorParamInfo {
4607        key: "signal_ma_type",
4608        label: "Signal MA Type",
4609        kind: IndicatorParamKind::EnumString,
4610        required: false,
4611        default: Some(ParamValueStatic::EnumString("sma")),
4612        min: None,
4613        max: None,
4614        step: None,
4615        enum_values: ENUM_VALUES_PMARP_MA_TYPE,
4616        notes: Some("Moving average type used for the signal line"),
4617    },
4618    IndicatorParamInfo {
4619        key: "line_mode",
4620        label: "Line Mode",
4621        kind: IndicatorParamKind::EnumString,
4622        required: false,
4623        default: Some(ParamValueStatic::EnumString("pmarp")),
4624        min: None,
4625        max: None,
4626        step: None,
4627        enum_values: ENUM_VALUES_PMARP_LINE_MODE,
4628        notes: Some("Main plotted line: raw PMAR or PMARP percentile"),
4629    },
4630];
4631
4632const PARAM_RELATIVE_STRENGTH_INDEX_WAVE_INDICATOR: &[IndicatorParamInfo] = &[
4633    IndicatorParamInfo {
4634        key: "source",
4635        label: "Source",
4636        kind: IndicatorParamKind::EnumString,
4637        required: false,
4638        default: Some(ParamValueStatic::EnumString("hlcc4")),
4639        min: None,
4640        max: None,
4641        step: None,
4642        enum_values: ENUM_VALUES_PRICE_SOURCE,
4643        notes: Some("Price source used for the custom RSI leg"),
4644    },
4645    IndicatorParamInfo {
4646        key: "rsi_length",
4647        label: "RSI Length",
4648        kind: IndicatorParamKind::Int,
4649        required: false,
4650        default: Some(ParamValueStatic::Int(14)),
4651        min: Some(1.0),
4652        max: None,
4653        step: Some(1.0),
4654        enum_values: EMPTY_ENUM_VALUES,
4655        notes: Some("RSI length used for source, high, and low RSI series"),
4656    },
4657    IndicatorParamInfo {
4658        key: "length1",
4659        label: "Length 1",
4660        kind: IndicatorParamKind::Int,
4661        required: false,
4662        default: Some(ParamValueStatic::Int(2)),
4663        min: Some(1.0),
4664        max: None,
4665        step: Some(1.0),
4666        enum_values: EMPTY_ENUM_VALUES,
4667        notes: Some("WMA length used for the first RSI wave line"),
4668    },
4669    IndicatorParamInfo {
4670        key: "length2",
4671        label: "Length 2",
4672        kind: IndicatorParamKind::Int,
4673        required: false,
4674        default: Some(ParamValueStatic::Int(5)),
4675        min: Some(1.0),
4676        max: None,
4677        step: Some(1.0),
4678        enum_values: EMPTY_ENUM_VALUES,
4679        notes: Some("WMA length used for the second RSI wave line"),
4680    },
4681    IndicatorParamInfo {
4682        key: "length3",
4683        label: "Length 3",
4684        kind: IndicatorParamKind::Int,
4685        required: false,
4686        default: Some(ParamValueStatic::Int(9)),
4687        min: Some(1.0),
4688        max: None,
4689        step: Some(1.0),
4690        enum_values: EMPTY_ENUM_VALUES,
4691        notes: Some("WMA length used for the third RSI wave line"),
4692    },
4693    IndicatorParamInfo {
4694        key: "length4",
4695        label: "Length 4",
4696        kind: IndicatorParamKind::Int,
4697        required: false,
4698        default: Some(ParamValueStatic::Int(13)),
4699        min: Some(1.0),
4700        max: None,
4701        step: Some(1.0),
4702        enum_values: EMPTY_ENUM_VALUES,
4703        notes: Some("WMA length used for the fourth RSI wave line"),
4704    },
4705];
4706
4707const PARAM_MESA_STOCHASTIC_MULTI_LENGTH: &[IndicatorParamInfo] = &[
4708    IndicatorParamInfo {
4709        key: "source",
4710        label: "Source",
4711        kind: IndicatorParamKind::EnumString,
4712        required: false,
4713        default: Some(ParamValueStatic::EnumString("close")),
4714        min: None,
4715        max: None,
4716        step: None,
4717        enum_values: ENUM_VALUES_PRICE_SOURCE,
4718        notes: Some("Price source used by the shared MESA filter stage"),
4719    },
4720    IndicatorParamInfo {
4721        key: "length_1",
4722        label: "Length 1",
4723        kind: IndicatorParamKind::Int,
4724        required: false,
4725        default: Some(ParamValueStatic::Int(48)),
4726        min: Some(1.0),
4727        max: None,
4728        step: Some(1.0),
4729        enum_values: EMPTY_ENUM_VALUES,
4730        notes: Some("First Pine-faithful MESA stochastic lookback"),
4731    },
4732    IndicatorParamInfo {
4733        key: "length_2",
4734        label: "Length 2",
4735        kind: IndicatorParamKind::Int,
4736        required: false,
4737        default: Some(ParamValueStatic::Int(21)),
4738        min: Some(1.0),
4739        max: None,
4740        step: Some(1.0),
4741        enum_values: EMPTY_ENUM_VALUES,
4742        notes: Some("Second Pine-faithful MESA stochastic lookback"),
4743    },
4744    IndicatorParamInfo {
4745        key: "length_3",
4746        label: "Length 3",
4747        kind: IndicatorParamKind::Int,
4748        required: false,
4749        default: Some(ParamValueStatic::Int(9)),
4750        min: Some(1.0),
4751        max: None,
4752        step: Some(1.0),
4753        enum_values: EMPTY_ENUM_VALUES,
4754        notes: Some("Third Pine-faithful MESA stochastic lookback"),
4755    },
4756    IndicatorParamInfo {
4757        key: "length_4",
4758        label: "Length 4",
4759        kind: IndicatorParamKind::Int,
4760        required: false,
4761        default: Some(ParamValueStatic::Int(6)),
4762        min: Some(1.0),
4763        max: None,
4764        step: Some(1.0),
4765        enum_values: EMPTY_ENUM_VALUES,
4766        notes: Some("Fourth Pine-faithful MESA stochastic lookback"),
4767    },
4768    IndicatorParamInfo {
4769        key: "trigger_length",
4770        label: "Trigger Length",
4771        kind: IndicatorParamKind::Int,
4772        required: false,
4773        default: Some(ParamValueStatic::Int(2)),
4774        min: Some(1.0),
4775        max: None,
4776        step: Some(1.0),
4777        enum_values: EMPTY_ENUM_VALUES,
4778        notes: Some("SMA length used for all four trigger lines"),
4779    },
4780];
4781
4782const PARAM_SPEARMAN_CORRELATION: &[IndicatorParamInfo] = &[
4783    IndicatorParamInfo {
4784        key: "source",
4785        label: "Source",
4786        kind: IndicatorParamKind::EnumString,
4787        required: false,
4788        default: Some(ParamValueStatic::EnumString("close")),
4789        min: None,
4790        max: None,
4791        step: None,
4792        enum_values: ENUM_VALUES_PRICE_SOURCE,
4793        notes: Some("Primary candle source used for the return series"),
4794    },
4795    IndicatorParamInfo {
4796        key: "comparison_source",
4797        label: "Comparison Source",
4798        kind: IndicatorParamKind::EnumString,
4799        required: false,
4800        default: Some(ParamValueStatic::EnumString("open")),
4801        min: None,
4802        max: None,
4803        step: None,
4804        enum_values: ENUM_VALUES_PRICE_SOURCE,
4805        notes: Some("Secondary candle source used for the comparison return series"),
4806    },
4807    IndicatorParamInfo {
4808        key: "lookback",
4809        label: "Lookback",
4810        kind: IndicatorParamKind::Int,
4811        required: false,
4812        default: Some(ParamValueStatic::Int(30)),
4813        min: Some(1.0),
4814        max: None,
4815        step: Some(1.0),
4816        enum_values: EMPTY_ENUM_VALUES,
4817        notes: Some("Return-window length used for the Spearman rank correlation"),
4818    },
4819    IndicatorParamInfo {
4820        key: "smoothing_length",
4821        label: "Smoothing Length",
4822        kind: IndicatorParamKind::Int,
4823        required: false,
4824        default: Some(ParamValueStatic::Int(3)),
4825        min: Some(1.0),
4826        max: None,
4827        step: Some(1.0),
4828        enum_values: EMPTY_ENUM_VALUES,
4829        notes: Some("Simple moving average length applied to the raw Spearman series"),
4830    },
4831];
4832
4833const PARAM_TREND_TRIGGER_FACTOR: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4834    key: "length",
4835    label: "Length",
4836    kind: IndicatorParamKind::Int,
4837    required: false,
4838    default: Some(ParamValueStatic::Int(15)),
4839    min: Some(1.0),
4840    max: None,
4841    step: Some(1.0),
4842    enum_values: EMPTY_ENUM_VALUES,
4843    notes: Some("Pine-faithful lookback length; the source input in the script is unused"),
4844}];
4845
4846const PARAM_CYCLE_CHANNEL_OSCILLATOR: &[IndicatorParamInfo] = &[
4847    IndicatorParamInfo {
4848        key: "source",
4849        label: "Source",
4850        kind: IndicatorParamKind::EnumString,
4851        required: false,
4852        default: Some(ParamValueStatic::EnumString("close")),
4853        min: None,
4854        max: None,
4855        step: None,
4856        enum_values: ENUM_VALUES_PRICE_SOURCE,
4857        notes: Some("Candle source used for the short and medium RMA center lines"),
4858    },
4859    IndicatorParamInfo {
4860        key: "short_cycle_length",
4861        label: "Short Cycle Length",
4862        kind: IndicatorParamKind::Int,
4863        required: false,
4864        default: Some(ParamValueStatic::Int(10)),
4865        min: Some(2.0),
4866        max: None,
4867        step: Some(1.0),
4868        enum_values: EMPTY_ENUM_VALUES,
4869        notes: Some("Pine-faithful raw short cycle length; the internal RMA period is floor(length / 2)"),
4870    },
4871    IndicatorParamInfo {
4872        key: "medium_cycle_length",
4873        label: "Medium Cycle Length",
4874        kind: IndicatorParamKind::Int,
4875        required: false,
4876        default: Some(ParamValueStatic::Int(30)),
4877        min: Some(2.0),
4878        max: None,
4879        step: Some(1.0),
4880        enum_values: EMPTY_ENUM_VALUES,
4881        notes: Some("Pine-faithful raw medium cycle length; the internal ATR and RMA period is floor(length / 2)"),
4882    },
4883    IndicatorParamInfo {
4884        key: "short_multiplier",
4885        label: "Short Multiplier",
4886        kind: IndicatorParamKind::Float,
4887        required: false,
4888        default: Some(ParamValueStatic::Float(1.0)),
4889        min: Some(0.0),
4890        max: None,
4891        step: Some(0.1),
4892        enum_values: EMPTY_ENUM_VALUES,
4893        notes: Some("Preserved for Pine parity; in the published oscillator script this multiplier cancels out of the fast/slow outputs"),
4894    },
4895    IndicatorParamInfo {
4896        key: "medium_multiplier",
4897        label: "Medium Multiplier",
4898        kind: IndicatorParamKind::Float,
4899        required: false,
4900        default: Some(ParamValueStatic::Float(3.0)),
4901        min: Some(0.0),
4902        max: None,
4903        step: Some(0.1),
4904        enum_values: EMPTY_ENUM_VALUES,
4905        notes: Some("ATR channel multiplier used by the medium cycle oscillator denominator"),
4906    },
4907];
4908
4909const PARAM_VOLATILITY_QUALITY_INDEX: &[IndicatorParamInfo] = &[
4910    IndicatorParamInfo {
4911        key: "fast_length",
4912        label: "Fast Length",
4913        kind: IndicatorParamKind::Int,
4914        required: false,
4915        default: Some(ParamValueStatic::Int(9)),
4916        min: Some(1.0),
4917        max: None,
4918        step: Some(1.0),
4919        enum_values: EMPTY_ENUM_VALUES,
4920        notes: Some("Pine-faithful fast SMA length over cumulative VQI"),
4921    },
4922    IndicatorParamInfo {
4923        key: "slow_length",
4924        label: "Slow Length",
4925        kind: IndicatorParamKind::Int,
4926        required: false,
4927        default: Some(ParamValueStatic::Int(200)),
4928        min: Some(1.0),
4929        max: None,
4930        step: Some(1.0),
4931        enum_values: EMPTY_ENUM_VALUES,
4932        notes: Some("Pine-faithful slow SMA length over cumulative VQI"),
4933    },
4934];
4935
4936const PARAM_VOLUME_ZONE_OSCILLATOR: &[IndicatorParamInfo] = &[
4937    IndicatorParamInfo {
4938        key: "length",
4939        label: "Length",
4940        kind: IndicatorParamKind::Int,
4941        required: false,
4942        default: Some(ParamValueStatic::Int(14)),
4943        min: Some(2.0),
4944        max: None,
4945        step: Some(1.0),
4946        enum_values: EMPTY_ENUM_VALUES,
4947        notes: Some("Pine-faithful EMA length for signed and total volume"),
4948    },
4949    IndicatorParamInfo {
4950        key: "intraday_smoothing",
4951        label: "Intraday Smoothing",
4952        kind: IndicatorParamKind::Bool,
4953        required: false,
4954        default: Some(ParamValueStatic::Bool(true)),
4955        min: None,
4956        max: None,
4957        step: None,
4958        enum_values: ENUM_VALUES_TRUE_FALSE,
4959        notes: Some("Applies the optional Pine intraday EMA smoothing pass"),
4960    },
4961    IndicatorParamInfo {
4962        key: "noise_filter",
4963        label: "Noise Filter",
4964        kind: IndicatorParamKind::Int,
4965        required: false,
4966        default: Some(ParamValueStatic::Int(4)),
4967        min: Some(2.0),
4968        max: None,
4969        step: Some(1.0),
4970        enum_values: EMPTY_ENUM_VALUES,
4971        notes: Some("EMA length used by the optional intraday smoothing pass"),
4972    },
4973];
4974
4975const PARAM_VWAP_DEVIATION_OSCILLATOR: &[IndicatorParamInfo] = &[
4976    IndicatorParamInfo {
4977        key: "session_mode",
4978        label: "Session Mode",
4979        kind: IndicatorParamKind::EnumString,
4980        required: false,
4981        default: Some(ParamValueStatic::EnumString("rolling_bars")),
4982        min: None,
4983        max: None,
4984        step: None,
4985        enum_values: ENUM_VALUES_VDO_SESSION_MODE,
4986        notes: None,
4987    },
4988    IndicatorParamInfo {
4989        key: "rolling_period",
4990        label: "Rolling Period",
4991        kind: IndicatorParamKind::Int,
4992        required: false,
4993        default: Some(ParamValueStatic::Int(20)),
4994        min: Some(1.0),
4995        max: None,
4996        step: Some(1.0),
4997        enum_values: EMPTY_ENUM_VALUES,
4998        notes: None,
4999    },
5000    IndicatorParamInfo {
5001        key: "rolling_days",
5002        label: "Rolling Days",
5003        kind: IndicatorParamKind::Int,
5004        required: false,
5005        default: Some(ParamValueStatic::Int(30)),
5006        min: Some(1.0),
5007        max: None,
5008        step: Some(1.0),
5009        enum_values: EMPTY_ENUM_VALUES,
5010        notes: None,
5011    },
5012    IndicatorParamInfo {
5013        key: "use_close",
5014        label: "Use Close",
5015        kind: IndicatorParamKind::Bool,
5016        required: false,
5017        default: Some(ParamValueStatic::Bool(false)),
5018        min: None,
5019        max: None,
5020        step: None,
5021        enum_values: ENUM_VALUES_TRUE_FALSE,
5022        notes: None,
5023    },
5024    IndicatorParamInfo {
5025        key: "deviation_mode",
5026        label: "Deviation Mode",
5027        kind: IndicatorParamKind::EnumString,
5028        required: false,
5029        default: Some(ParamValueStatic::EnumString("absolute")),
5030        min: None,
5031        max: None,
5032        step: None,
5033        enum_values: ENUM_VALUES_VDO_DEVIATION_MODE,
5034        notes: None,
5035    },
5036    IndicatorParamInfo {
5037        key: "z_window",
5038        label: "Z Window",
5039        kind: IndicatorParamKind::Int,
5040        required: false,
5041        default: Some(ParamValueStatic::Int(50)),
5042        min: Some(5.0),
5043        max: None,
5044        step: Some(1.0),
5045        enum_values: EMPTY_ENUM_VALUES,
5046        notes: None,
5047    },
5048    IndicatorParamInfo {
5049        key: "pct_vol_lookback",
5050        label: "Percent Volatility Lookback",
5051        kind: IndicatorParamKind::Int,
5052        required: false,
5053        default: Some(ParamValueStatic::Int(100)),
5054        min: Some(10.0),
5055        max: None,
5056        step: Some(1.0),
5057        enum_values: EMPTY_ENUM_VALUES,
5058        notes: None,
5059    },
5060    IndicatorParamInfo {
5061        key: "pct_min_sigma",
5062        label: "Percent Minimum Sigma",
5063        kind: IndicatorParamKind::Float,
5064        required: false,
5065        default: Some(ParamValueStatic::Float(0.1)),
5066        min: Some(0.01),
5067        max: None,
5068        step: Some(0.01),
5069        enum_values: EMPTY_ENUM_VALUES,
5070        notes: None,
5071    },
5072    IndicatorParamInfo {
5073        key: "abs_vol_lookback",
5074        label: "Absolute Volatility Lookback",
5075        kind: IndicatorParamKind::Int,
5076        required: false,
5077        default: Some(ParamValueStatic::Int(100)),
5078        min: Some(10.0),
5079        max: None,
5080        step: Some(1.0),
5081        enum_values: EMPTY_ENUM_VALUES,
5082        notes: None,
5083    },
5084];
5085
5086const PARAM_ICHIMOKU_OSCILLATOR: &[IndicatorParamInfo] = &[
5087    IndicatorParamInfo {
5088        key: "source",
5089        label: "Source",
5090        kind: IndicatorParamKind::EnumString,
5091        required: false,
5092        default: Some(ParamValueStatic::EnumString("close")),
5093        min: None,
5094        max: None,
5095        step: None,
5096        enum_values: EMPTY_ENUM_VALUES,
5097        notes: Some("Signal source used for the oscillator signal and chikou inputs"),
5098    },
5099    IndicatorParamInfo {
5100        key: "conversion_periods",
5101        label: "Conversion Length",
5102        kind: IndicatorParamKind::Int,
5103        required: false,
5104        default: Some(ParamValueStatic::Int(9)),
5105        min: Some(1.0),
5106        max: None,
5107        step: Some(1.0),
5108        enum_values: EMPTY_ENUM_VALUES,
5109        notes: None,
5110    },
5111    IndicatorParamInfo {
5112        key: "base_periods",
5113        label: "Base Length",
5114        kind: IndicatorParamKind::Int,
5115        required: false,
5116        default: Some(ParamValueStatic::Int(26)),
5117        min: Some(1.0),
5118        max: None,
5119        step: Some(1.0),
5120        enum_values: EMPTY_ENUM_VALUES,
5121        notes: None,
5122    },
5123    IndicatorParamInfo {
5124        key: "lagging_span_periods",
5125        label: "Leading Span B Length",
5126        kind: IndicatorParamKind::Int,
5127        required: false,
5128        default: Some(ParamValueStatic::Int(52)),
5129        min: Some(1.0),
5130        max: None,
5131        step: Some(1.0),
5132        enum_values: EMPTY_ENUM_VALUES,
5133        notes: None,
5134    },
5135    IndicatorParamInfo {
5136        key: "displacement",
5137        label: "Displacement",
5138        kind: IndicatorParamKind::Int,
5139        required: false,
5140        default: Some(ParamValueStatic::Int(26)),
5141        min: Some(1.0),
5142        max: None,
5143        step: Some(1.0),
5144        enum_values: EMPTY_ENUM_VALUES,
5145        notes: None,
5146    },
5147    IndicatorParamInfo {
5148        key: "ma_length",
5149        label: "MA Length",
5150        kind: IndicatorParamKind::Int,
5151        required: false,
5152        default: Some(ParamValueStatic::Int(12)),
5153        min: Some(1.0),
5154        max: None,
5155        step: Some(1.0),
5156        enum_values: EMPTY_ENUM_VALUES,
5157        notes: None,
5158    },
5159    IndicatorParamInfo {
5160        key: "smoothing_length",
5161        label: "Smoothing Length",
5162        kind: IndicatorParamKind::Int,
5163        required: false,
5164        default: Some(ParamValueStatic::Int(3)),
5165        min: Some(1.0),
5166        max: None,
5167        step: Some(1.0),
5168        enum_values: EMPTY_ENUM_VALUES,
5169        notes: None,
5170    },
5171    IndicatorParamInfo {
5172        key: "extra_smoothing",
5173        label: "Extra Smoothing",
5174        kind: IndicatorParamKind::Bool,
5175        required: false,
5176        default: Some(ParamValueStatic::Bool(true)),
5177        min: None,
5178        max: None,
5179        step: None,
5180        enum_values: ENUM_VALUES_TRUE_FALSE,
5181        notes: None,
5182    },
5183    IndicatorParamInfo {
5184        key: "normalize",
5185        label: "Normalize",
5186        kind: IndicatorParamKind::EnumString,
5187        required: false,
5188        default: Some(ParamValueStatic::EnumString("window")),
5189        min: None,
5190        max: None,
5191        step: None,
5192        enum_values: ENUM_VALUES_ICHI_NORMALIZE_MODE,
5193        notes: None,
5194    },
5195    IndicatorParamInfo {
5196        key: "window_size",
5197        label: "Window Size",
5198        kind: IndicatorParamKind::Int,
5199        required: false,
5200        default: Some(ParamValueStatic::Int(20)),
5201        min: Some(5.0),
5202        max: None,
5203        step: Some(1.0),
5204        enum_values: EMPTY_ENUM_VALUES,
5205        notes: None,
5206    },
5207    IndicatorParamInfo {
5208        key: "clamp",
5209        label: "Clamp",
5210        kind: IndicatorParamKind::Bool,
5211        required: false,
5212        default: Some(ParamValueStatic::Bool(true)),
5213        min: None,
5214        max: None,
5215        step: None,
5216        enum_values: ENUM_VALUES_TRUE_FALSE,
5217        notes: None,
5218    },
5219    IndicatorParamInfo {
5220        key: "top_band",
5221        label: "Top Band",
5222        kind: IndicatorParamKind::Float,
5223        required: false,
5224        default: Some(ParamValueStatic::Float(2.0)),
5225        min: Some(0.0),
5226        max: None,
5227        step: Some(0.25),
5228        enum_values: EMPTY_ENUM_VALUES,
5229        notes: None,
5230    },
5231    IndicatorParamInfo {
5232        key: "mid_band",
5233        label: "Mid Band",
5234        kind: IndicatorParamKind::Float,
5235        required: false,
5236        default: Some(ParamValueStatic::Float(1.5)),
5237        min: Some(0.0),
5238        max: None,
5239        step: Some(0.25),
5240        enum_values: EMPTY_ENUM_VALUES,
5241        notes: None,
5242    },
5243];
5244
5245const PARAM_FOSC_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
5246    key: "period",
5247    label: "Period",
5248    kind: IndicatorParamKind::Int,
5249    required: false,
5250    default: Some(ParamValueStatic::Int(5)),
5251    min: Some(1.0),
5252    max: None,
5253    step: Some(1.0),
5254    enum_values: EMPTY_ENUM_VALUES,
5255    notes: None,
5256}];
5257
5258const PARAM_IFT_RSI: &[IndicatorParamInfo] = &[
5259    IndicatorParamInfo {
5260        key: "rsi_period",
5261        label: "RSI Period",
5262        kind: IndicatorParamKind::Int,
5263        required: false,
5264        default: Some(ParamValueStatic::Int(5)),
5265        min: Some(1.0),
5266        max: None,
5267        step: Some(1.0),
5268        enum_values: EMPTY_ENUM_VALUES,
5269        notes: None,
5270    },
5271    IndicatorParamInfo {
5272        key: "wma_period",
5273        label: "WMA Period",
5274        kind: IndicatorParamKind::Int,
5275        required: false,
5276        default: Some(ParamValueStatic::Int(9)),
5277        min: Some(1.0),
5278        max: None,
5279        step: Some(1.0),
5280        enum_values: EMPTY_ENUM_VALUES,
5281        notes: None,
5282    },
5283];
5284
5285const PARAM_DEC_OSC: &[IndicatorParamInfo] = &[
5286    IndicatorParamInfo {
5287        key: "hp_period",
5288        label: "HP Period",
5289        kind: IndicatorParamKind::Int,
5290        required: false,
5291        default: Some(ParamValueStatic::Int(125)),
5292        min: Some(3.0),
5293        max: None,
5294        step: Some(1.0),
5295        enum_values: EMPTY_ENUM_VALUES,
5296        notes: None,
5297    },
5298    IndicatorParamInfo {
5299        key: "k",
5300        label: "K",
5301        kind: IndicatorParamKind::Float,
5302        required: false,
5303        default: Some(ParamValueStatic::Float(1.0)),
5304        min: Some(0.0),
5305        max: None,
5306        step: None,
5307        enum_values: EMPTY_ENUM_VALUES,
5308        notes: Some("Must be positive"),
5309    },
5310];
5311
5312const PARAM_DECYCLER: &[IndicatorParamInfo] = &[
5313    IndicatorParamInfo {
5314        key: "hp_period",
5315        label: "HP Period",
5316        kind: IndicatorParamKind::Int,
5317        required: false,
5318        default: Some(ParamValueStatic::Int(125)),
5319        min: Some(2.0),
5320        max: None,
5321        step: Some(1.0),
5322        enum_values: EMPTY_ENUM_VALUES,
5323        notes: None,
5324    },
5325    IndicatorParamInfo {
5326        key: "k",
5327        label: "K",
5328        kind: IndicatorParamKind::Float,
5329        required: false,
5330        default: Some(ParamValueStatic::Float(0.707)),
5331        min: Some(0.0),
5332        max: None,
5333        step: None,
5334        enum_values: EMPTY_ENUM_VALUES,
5335        notes: Some("Must be positive"),
5336    },
5337];
5338
5339const PARAM_VIDYA: &[IndicatorParamInfo] = &[
5340    IndicatorParamInfo {
5341        key: "short_period",
5342        label: "Short Period",
5343        kind: IndicatorParamKind::Int,
5344        required: false,
5345        default: Some(ParamValueStatic::Int(2)),
5346        min: Some(2.0),
5347        max: None,
5348        step: Some(1.0),
5349        enum_values: EMPTY_ENUM_VALUES,
5350        notes: None,
5351    },
5352    IndicatorParamInfo {
5353        key: "long_period",
5354        label: "Long Period",
5355        kind: IndicatorParamKind::Int,
5356        required: false,
5357        default: Some(ParamValueStatic::Int(5)),
5358        min: Some(2.0),
5359        max: None,
5360        step: Some(1.0),
5361        enum_values: EMPTY_ENUM_VALUES,
5362        notes: None,
5363    },
5364    IndicatorParamInfo {
5365        key: "alpha",
5366        label: "Alpha",
5367        kind: IndicatorParamKind::Float,
5368        required: false,
5369        default: Some(ParamValueStatic::Float(0.2)),
5370        min: Some(0.0),
5371        max: Some(1.0),
5372        step: None,
5373        enum_values: EMPTY_ENUM_VALUES,
5374        notes: None,
5375    },
5376];
5377
5378const PARAM_VLMA: &[IndicatorParamInfo] = &[
5379    IndicatorParamInfo {
5380        key: "min_period",
5381        label: "Min Period",
5382        kind: IndicatorParamKind::Int,
5383        required: false,
5384        default: Some(ParamValueStatic::Int(5)),
5385        min: Some(1.0),
5386        max: None,
5387        step: Some(1.0),
5388        enum_values: EMPTY_ENUM_VALUES,
5389        notes: None,
5390    },
5391    IndicatorParamInfo {
5392        key: "max_period",
5393        label: "Max Period",
5394        kind: IndicatorParamKind::Int,
5395        required: false,
5396        default: Some(ParamValueStatic::Int(50)),
5397        min: Some(1.0),
5398        max: None,
5399        step: Some(1.0),
5400        enum_values: EMPTY_ENUM_VALUES,
5401        notes: None,
5402    },
5403    IndicatorParamInfo {
5404        key: "matype",
5405        label: "MA Type",
5406        kind: IndicatorParamKind::EnumString,
5407        required: false,
5408        default: Some(ParamValueStatic::EnumString("sma")),
5409        min: None,
5410        max: None,
5411        step: None,
5412        enum_values: EMPTY_ENUM_VALUES,
5413        notes: None,
5414    },
5415    IndicatorParamInfo {
5416        key: "devtype",
5417        label: "Deviation Type",
5418        kind: IndicatorParamKind::Int,
5419        required: false,
5420        default: Some(ParamValueStatic::Int(0)),
5421        min: Some(0.0),
5422        max: None,
5423        step: Some(1.0),
5424        enum_values: EMPTY_ENUM_VALUES,
5425        notes: None,
5426    },
5427];
5428
5429const PARAM_LINEARREG_ANGLE_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
5430    key: "period",
5431    label: "Period",
5432    kind: IndicatorParamKind::Int,
5433    required: false,
5434    default: Some(ParamValueStatic::Int(14)),
5435    min: Some(2.0),
5436    max: None,
5437    step: Some(1.0),
5438    enum_values: EMPTY_ENUM_VALUES,
5439    notes: None,
5440}];
5441
5442const PARAM_LINEARREG_INTERCEPT_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
5443    key: "period",
5444    label: "Period",
5445    kind: IndicatorParamKind::Int,
5446    required: false,
5447    default: Some(ParamValueStatic::Int(14)),
5448    min: Some(1.0),
5449    max: None,
5450    step: Some(1.0),
5451    enum_values: EMPTY_ENUM_VALUES,
5452    notes: None,
5453}];
5454
5455const PARAM_LINEARREG_SLOPE_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
5456    key: "period",
5457    label: "Period",
5458    kind: IndicatorParamKind::Int,
5459    required: false,
5460    default: Some(ParamValueStatic::Int(14)),
5461    min: Some(2.0),
5462    max: None,
5463    step: Some(1.0),
5464    enum_values: EMPTY_ENUM_VALUES,
5465    notes: None,
5466}];
5467
5468const PARAM_CG_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
5469    key: "period",
5470    label: "Period",
5471    kind: IndicatorParamKind::Int,
5472    required: false,
5473    default: Some(ParamValueStatic::Int(10)),
5474    min: Some(1.0),
5475    max: None,
5476    step: Some(1.0),
5477    enum_values: EMPTY_ENUM_VALUES,
5478    notes: None,
5479}];
5480
5481const PARAM_MACD: &[IndicatorParamInfo] = &[
5482    IndicatorParamInfo {
5483        key: "fast_period",
5484        label: "Fast Period",
5485        kind: IndicatorParamKind::Int,
5486        required: false,
5487        default: Some(ParamValueStatic::Int(12)),
5488        min: Some(1.0),
5489        max: None,
5490        step: Some(1.0),
5491        enum_values: EMPTY_ENUM_VALUES,
5492        notes: None,
5493    },
5494    IndicatorParamInfo {
5495        key: "slow_period",
5496        label: "Slow Period",
5497        kind: IndicatorParamKind::Int,
5498        required: false,
5499        default: Some(ParamValueStatic::Int(26)),
5500        min: Some(1.0),
5501        max: None,
5502        step: Some(1.0),
5503        enum_values: EMPTY_ENUM_VALUES,
5504        notes: None,
5505    },
5506    IndicatorParamInfo {
5507        key: "signal_period",
5508        label: "Signal Period",
5509        kind: IndicatorParamKind::Int,
5510        required: false,
5511        default: Some(ParamValueStatic::Int(9)),
5512        min: Some(1.0),
5513        max: None,
5514        step: Some(1.0),
5515        enum_values: EMPTY_ENUM_VALUES,
5516        notes: None,
5517    },
5518];
5519
5520const PARAM_ADAPTIVE_MACD: &[IndicatorParamInfo] = &[
5521    IndicatorParamInfo {
5522        key: "length",
5523        label: "R2 Period",
5524        kind: IndicatorParamKind::Int,
5525        required: false,
5526        default: Some(ParamValueStatic::Int(20)),
5527        min: Some(2.0),
5528        max: None,
5529        step: Some(1.0),
5530        enum_values: EMPTY_ENUM_VALUES,
5531        notes: None,
5532    },
5533    IndicatorParamInfo {
5534        key: "fast_period",
5535        label: "Fast Period",
5536        kind: IndicatorParamKind::Int,
5537        required: false,
5538        default: Some(ParamValueStatic::Int(10)),
5539        min: Some(2.0),
5540        max: None,
5541        step: Some(1.0),
5542        enum_values: EMPTY_ENUM_VALUES,
5543        notes: None,
5544    },
5545    IndicatorParamInfo {
5546        key: "slow_period",
5547        label: "Slow Period",
5548        kind: IndicatorParamKind::Int,
5549        required: false,
5550        default: Some(ParamValueStatic::Int(20)),
5551        min: Some(2.0),
5552        max: None,
5553        step: Some(1.0),
5554        enum_values: EMPTY_ENUM_VALUES,
5555        notes: None,
5556    },
5557    IndicatorParamInfo {
5558        key: "signal_period",
5559        label: "Signal Period",
5560        kind: IndicatorParamKind::Int,
5561        required: false,
5562        default: Some(ParamValueStatic::Int(9)),
5563        min: Some(2.0),
5564        max: None,
5565        step: Some(1.0),
5566        enum_values: EMPTY_ENUM_VALUES,
5567        notes: None,
5568    },
5569];
5570
5571const PARAM_BOLLINGER: &[IndicatorParamInfo] = &[
5572    IndicatorParamInfo {
5573        key: "period",
5574        label: "Period",
5575        kind: IndicatorParamKind::Int,
5576        required: false,
5577        default: Some(ParamValueStatic::Int(20)),
5578        min: Some(1.0),
5579        max: None,
5580        step: Some(1.0),
5581        enum_values: EMPTY_ENUM_VALUES,
5582        notes: None,
5583    },
5584    IndicatorParamInfo {
5585        key: "devup",
5586        label: "Dev Up",
5587        kind: IndicatorParamKind::Float,
5588        required: false,
5589        default: Some(ParamValueStatic::Float(2.0)),
5590        min: None,
5591        max: None,
5592        step: None,
5593        enum_values: EMPTY_ENUM_VALUES,
5594        notes: None,
5595    },
5596    IndicatorParamInfo {
5597        key: "devdn",
5598        label: "Dev Down",
5599        kind: IndicatorParamKind::Float,
5600        required: false,
5601        default: Some(ParamValueStatic::Float(2.0)),
5602        min: None,
5603        max: None,
5604        step: None,
5605        enum_values: EMPTY_ENUM_VALUES,
5606        notes: None,
5607    },
5608];
5609
5610const PARAM_STOCH: &[IndicatorParamInfo] = &[
5611    IndicatorParamInfo {
5612        key: "fastk_period",
5613        label: "Fast K Period",
5614        kind: IndicatorParamKind::Int,
5615        required: false,
5616        default: Some(ParamValueStatic::Int(14)),
5617        min: Some(1.0),
5618        max: None,
5619        step: Some(1.0),
5620        enum_values: EMPTY_ENUM_VALUES,
5621        notes: None,
5622    },
5623    IndicatorParamInfo {
5624        key: "slowk_period",
5625        label: "Slow K Period",
5626        kind: IndicatorParamKind::Int,
5627        required: false,
5628        default: Some(ParamValueStatic::Int(3)),
5629        min: Some(1.0),
5630        max: None,
5631        step: Some(1.0),
5632        enum_values: EMPTY_ENUM_VALUES,
5633        notes: None,
5634    },
5635    IndicatorParamInfo {
5636        key: "slowd_period",
5637        label: "Slow D Period",
5638        kind: IndicatorParamKind::Int,
5639        required: false,
5640        default: Some(ParamValueStatic::Int(3)),
5641        min: Some(1.0),
5642        max: None,
5643        step: Some(1.0),
5644        enum_values: EMPTY_ENUM_VALUES,
5645        notes: None,
5646    },
5647];
5648
5649const PARAM_STOCHF: &[IndicatorParamInfo] = &[
5650    IndicatorParamInfo {
5651        key: "fastk_period",
5652        label: "Fast K Period",
5653        kind: IndicatorParamKind::Int,
5654        required: false,
5655        default: Some(ParamValueStatic::Int(5)),
5656        min: Some(1.0),
5657        max: None,
5658        step: Some(1.0),
5659        enum_values: EMPTY_ENUM_VALUES,
5660        notes: None,
5661    },
5662    IndicatorParamInfo {
5663        key: "fastd_period",
5664        label: "Fast D Period",
5665        kind: IndicatorParamKind::Int,
5666        required: false,
5667        default: Some(ParamValueStatic::Int(3)),
5668        min: Some(1.0),
5669        max: None,
5670        step: Some(1.0),
5671        enum_values: EMPTY_ENUM_VALUES,
5672        notes: None,
5673    },
5674];
5675
5676const PARAM_VW_MACD: &[IndicatorParamInfo] = &[
5677    IndicatorParamInfo {
5678        key: "fast",
5679        label: "Fast",
5680        kind: IndicatorParamKind::Int,
5681        required: false,
5682        default: Some(ParamValueStatic::Int(12)),
5683        min: Some(1.0),
5684        max: None,
5685        step: Some(1.0),
5686        enum_values: EMPTY_ENUM_VALUES,
5687        notes: None,
5688    },
5689    IndicatorParamInfo {
5690        key: "slow",
5691        label: "Slow",
5692        kind: IndicatorParamKind::Int,
5693        required: false,
5694        default: Some(ParamValueStatic::Int(26)),
5695        min: Some(1.0),
5696        max: None,
5697        step: Some(1.0),
5698        enum_values: EMPTY_ENUM_VALUES,
5699        notes: None,
5700    },
5701    IndicatorParamInfo {
5702        key: "signal",
5703        label: "Signal",
5704        kind: IndicatorParamKind::Int,
5705        required: false,
5706        default: Some(ParamValueStatic::Int(9)),
5707        min: Some(1.0),
5708        max: None,
5709        step: Some(1.0),
5710        enum_values: EMPTY_ENUM_VALUES,
5711        notes: None,
5712    },
5713];
5714
5715const PARAM_VPCI: &[IndicatorParamInfo] = &[
5716    IndicatorParamInfo {
5717        key: "short_range",
5718        label: "Short Range",
5719        kind: IndicatorParamKind::Int,
5720        required: false,
5721        default: Some(ParamValueStatic::Int(5)),
5722        min: Some(1.0),
5723        max: None,
5724        step: Some(1.0),
5725        enum_values: EMPTY_ENUM_VALUES,
5726        notes: None,
5727    },
5728    IndicatorParamInfo {
5729        key: "long_range",
5730        label: "Long Range",
5731        kind: IndicatorParamKind::Int,
5732        required: false,
5733        default: Some(ParamValueStatic::Int(20)),
5734        min: Some(1.0),
5735        max: None,
5736        step: Some(1.0),
5737        enum_values: EMPTY_ENUM_VALUES,
5738        notes: None,
5739    },
5740];
5741
5742const PARAM_TTM_TREND: &[IndicatorParamInfo] = &[IndicatorParamInfo {
5743    key: "period",
5744    label: "Period",
5745    kind: IndicatorParamKind::Int,
5746    required: false,
5747    default: Some(ParamValueStatic::Int(6)),
5748    min: Some(1.0),
5749    max: None,
5750    step: Some(1.0),
5751    enum_values: EMPTY_ENUM_VALUES,
5752    notes: None,
5753}];
5754
5755const PARAM_TTM_SQUEEZE: &[IndicatorParamInfo] = &[
5756    IndicatorParamInfo {
5757        key: "length",
5758        label: "Length",
5759        kind: IndicatorParamKind::Int,
5760        required: false,
5761        default: Some(ParamValueStatic::Int(20)),
5762        min: Some(1.0),
5763        max: None,
5764        step: Some(1.0),
5765        enum_values: EMPTY_ENUM_VALUES,
5766        notes: None,
5767    },
5768    IndicatorParamInfo {
5769        key: "bb_mult",
5770        label: "BB Mult",
5771        kind: IndicatorParamKind::Float,
5772        required: false,
5773        default: Some(ParamValueStatic::Float(2.0)),
5774        min: None,
5775        max: None,
5776        step: None,
5777        enum_values: EMPTY_ENUM_VALUES,
5778        notes: None,
5779    },
5780    IndicatorParamInfo {
5781        key: "kc_high",
5782        label: "KC High",
5783        kind: IndicatorParamKind::Float,
5784        required: false,
5785        default: Some(ParamValueStatic::Float(1.0)),
5786        min: None,
5787        max: None,
5788        step: None,
5789        enum_values: EMPTY_ENUM_VALUES,
5790        notes: None,
5791    },
5792    IndicatorParamInfo {
5793        key: "kc_mid",
5794        label: "KC Mid",
5795        kind: IndicatorParamKind::Float,
5796        required: false,
5797        default: Some(ParamValueStatic::Float(1.5)),
5798        min: None,
5799        max: None,
5800        step: None,
5801        enum_values: EMPTY_ENUM_VALUES,
5802        notes: None,
5803    },
5804    IndicatorParamInfo {
5805        key: "kc_low",
5806        label: "KC Low",
5807        kind: IndicatorParamKind::Float,
5808        required: false,
5809        default: Some(ParamValueStatic::Float(2.0)),
5810        min: None,
5811        max: None,
5812        step: None,
5813        enum_values: EMPTY_ENUM_VALUES,
5814        notes: None,
5815    },
5816];
5817
5818const PARAM_DI: &[IndicatorParamInfo] = &[IndicatorParamInfo {
5819    key: "period",
5820    label: "Period",
5821    kind: IndicatorParamKind::Int,
5822    required: false,
5823    default: Some(ParamValueStatic::Int(14)),
5824    min: Some(1.0),
5825    max: None,
5826    step: Some(1.0),
5827    enum_values: EMPTY_ENUM_VALUES,
5828    notes: None,
5829}];
5830
5831const PARAM_DTI: &[IndicatorParamInfo] = &[
5832    IndicatorParamInfo {
5833        key: "r",
5834        label: "R",
5835        kind: IndicatorParamKind::Int,
5836        required: false,
5837        default: Some(ParamValueStatic::Int(14)),
5838        min: Some(1.0),
5839        max: None,
5840        step: Some(1.0),
5841        enum_values: EMPTY_ENUM_VALUES,
5842        notes: None,
5843    },
5844    IndicatorParamInfo {
5845        key: "s",
5846        label: "S",
5847        kind: IndicatorParamKind::Int,
5848        required: false,
5849        default: Some(ParamValueStatic::Int(10)),
5850        min: Some(1.0),
5851        max: None,
5852        step: Some(1.0),
5853        enum_values: EMPTY_ENUM_VALUES,
5854        notes: None,
5855    },
5856    IndicatorParamInfo {
5857        key: "u",
5858        label: "U",
5859        kind: IndicatorParamKind::Int,
5860        required: false,
5861        default: Some(ParamValueStatic::Int(5)),
5862        min: Some(1.0),
5863        max: None,
5864        step: Some(1.0),
5865        enum_values: EMPTY_ENUM_VALUES,
5866        notes: None,
5867    },
5868];
5869
5870const PARAM_DM: &[IndicatorParamInfo] = &[IndicatorParamInfo {
5871    key: "period",
5872    label: "Period",
5873    kind: IndicatorParamKind::Int,
5874    required: false,
5875    default: Some(ParamValueStatic::Int(14)),
5876    min: Some(1.0),
5877    max: None,
5878    step: Some(1.0),
5879    enum_values: EMPTY_ENUM_VALUES,
5880    notes: None,
5881}];
5882
5883const PARAM_DONCHIAN: &[IndicatorParamInfo] = &[IndicatorParamInfo {
5884    key: "period",
5885    label: "Period",
5886    kind: IndicatorParamKind::Int,
5887    required: false,
5888    default: Some(ParamValueStatic::Int(20)),
5889    min: Some(1.0),
5890    max: None,
5891    step: Some(1.0),
5892    enum_values: EMPTY_ENUM_VALUES,
5893    notes: None,
5894}];
5895
5896const PARAM_SUPERTREND: &[IndicatorParamInfo] = &[
5897    IndicatorParamInfo {
5898        key: "period",
5899        label: "Period",
5900        kind: IndicatorParamKind::Int,
5901        required: false,
5902        default: Some(ParamValueStatic::Int(10)),
5903        min: Some(1.0),
5904        max: None,
5905        step: Some(1.0),
5906        enum_values: EMPTY_ENUM_VALUES,
5907        notes: None,
5908    },
5909    IndicatorParamInfo {
5910        key: "factor",
5911        label: "Factor",
5912        kind: IndicatorParamKind::Float,
5913        required: false,
5914        default: Some(ParamValueStatic::Float(3.0)),
5915        min: Some(0.0),
5916        max: None,
5917        step: None,
5918        enum_values: EMPTY_ENUM_VALUES,
5919        notes: None,
5920    },
5921];
5922
5923const PARAM_ADJUSTABLE_MA_ALTERNATING_EXTREMITIES: &[IndicatorParamInfo] = &[
5924    IndicatorParamInfo {
5925        key: "length",
5926        label: "Length",
5927        kind: IndicatorParamKind::Int,
5928        required: false,
5929        default: Some(ParamValueStatic::Int(50)),
5930        min: Some(2.0),
5931        max: None,
5932        step: Some(1.0),
5933        enum_values: EMPTY_ENUM_VALUES,
5934        notes: None,
5935    },
5936    IndicatorParamInfo {
5937        key: "mult",
5938        label: "Multiplier",
5939        kind: IndicatorParamKind::Float,
5940        required: false,
5941        default: Some(ParamValueStatic::Float(2.0)),
5942        min: Some(1.0),
5943        max: None,
5944        step: Some(0.1),
5945        enum_values: EMPTY_ENUM_VALUES,
5946        notes: None,
5947    },
5948    IndicatorParamInfo {
5949        key: "alpha",
5950        label: "Lag",
5951        kind: IndicatorParamKind::Float,
5952        required: false,
5953        default: Some(ParamValueStatic::Float(1.0)),
5954        min: Some(0.0),
5955        max: None,
5956        step: Some(0.1),
5957        enum_values: EMPTY_ENUM_VALUES,
5958        notes: None,
5959    },
5960    IndicatorParamInfo {
5961        key: "beta",
5962        label: "Overshoot",
5963        kind: IndicatorParamKind::Float,
5964        required: false,
5965        default: Some(ParamValueStatic::Float(0.5)),
5966        min: Some(0.0),
5967        max: None,
5968        step: Some(0.1),
5969        enum_values: EMPTY_ENUM_VALUES,
5970        notes: None,
5971    },
5972];
5973
5974const PARAM_SUPERTREND_RECOVERY: &[IndicatorParamInfo] = &[
5975    IndicatorParamInfo {
5976        key: "atr_length",
5977        label: "ATR Length",
5978        kind: IndicatorParamKind::Int,
5979        required: false,
5980        default: Some(ParamValueStatic::Int(10)),
5981        min: Some(1.0),
5982        max: None,
5983        step: Some(1.0),
5984        enum_values: EMPTY_ENUM_VALUES,
5985        notes: None,
5986    },
5987    IndicatorParamInfo {
5988        key: "multiplier",
5989        label: "Base Multiplier",
5990        kind: IndicatorParamKind::Float,
5991        required: false,
5992        default: Some(ParamValueStatic::Float(3.0)),
5993        min: Some(0.1),
5994        max: None,
5995        step: Some(0.1),
5996        enum_values: EMPTY_ENUM_VALUES,
5997        notes: None,
5998    },
5999    IndicatorParamInfo {
6000        key: "alpha_percent",
6001        label: "Recovery Alpha (%)",
6002        kind: IndicatorParamKind::Float,
6003        required: false,
6004        default: Some(ParamValueStatic::Float(5.0)),
6005        min: Some(0.1),
6006        max: Some(100.0),
6007        step: Some(0.1),
6008        enum_values: EMPTY_ENUM_VALUES,
6009        notes: Some("Percentage weight applied to price when the active trend is at a loss relative to the latest switch price"),
6010    },
6011    IndicatorParamInfo {
6012        key: "threshold_atr",
6013        label: "Recovery Threshold (xATR)",
6014        kind: IndicatorParamKind::Float,
6015        required: false,
6016        default: Some(ParamValueStatic::Float(1.0)),
6017        min: Some(0.0),
6018        max: None,
6019        step: Some(0.1),
6020        enum_values: EMPTY_ENUM_VALUES,
6021        notes: Some("Recovery logic activates only when the loss exceeds this many ATRs from the switch price"),
6022    },
6023];
6024
6025const PARAM_STANDARDIZED_PSAR_OSCILLATOR: &[IndicatorParamInfo] = &[
6026    IndicatorParamInfo {
6027        key: "start",
6028        label: "Start",
6029        kind: IndicatorParamKind::Float,
6030        required: false,
6031        default: Some(ParamValueStatic::Float(0.02)),
6032        min: Some(0.0),
6033        max: None,
6034        step: Some(0.0001),
6035        enum_values: EMPTY_ENUM_VALUES,
6036        notes: None,
6037    },
6038    IndicatorParamInfo {
6039        key: "increment",
6040        label: "Increment",
6041        kind: IndicatorParamKind::Float,
6042        required: false,
6043        default: Some(ParamValueStatic::Float(0.0005)),
6044        min: Some(0.0),
6045        max: None,
6046        step: Some(0.0001),
6047        enum_values: EMPTY_ENUM_VALUES,
6048        notes: None,
6049    },
6050    IndicatorParamInfo {
6051        key: "maximum",
6052        label: "Max Value",
6053        kind: IndicatorParamKind::Float,
6054        required: false,
6055        default: Some(ParamValueStatic::Float(0.2)),
6056        min: Some(0.0),
6057        max: None,
6058        step: Some(0.0001),
6059        enum_values: EMPTY_ENUM_VALUES,
6060        notes: None,
6061    },
6062    IndicatorParamInfo {
6063        key: "standardization_length",
6064        label: "Standardization Length",
6065        kind: IndicatorParamKind::Int,
6066        required: false,
6067        default: Some(ParamValueStatic::Int(21)),
6068        min: Some(1.0),
6069        max: None,
6070        step: Some(1.0),
6071        enum_values: EMPTY_ENUM_VALUES,
6072        notes: None,
6073    },
6074    IndicatorParamInfo {
6075        key: "wma_length",
6076        label: "WMA Length",
6077        kind: IndicatorParamKind::Int,
6078        required: false,
6079        default: Some(ParamValueStatic::Int(40)),
6080        min: Some(1.0),
6081        max: None,
6082        step: Some(1.0),
6083        enum_values: EMPTY_ENUM_VALUES,
6084        notes: None,
6085    },
6086    IndicatorParamInfo {
6087        key: "wma_lag",
6088        label: "WMA Lag Length",
6089        kind: IndicatorParamKind::Int,
6090        required: false,
6091        default: Some(ParamValueStatic::Int(3)),
6092        min: Some(0.0),
6093        max: None,
6094        step: Some(1.0),
6095        enum_values: EMPTY_ENUM_VALUES,
6096        notes: None,
6097    },
6098    IndicatorParamInfo {
6099        key: "pivot_left",
6100        label: "Divergence Pivot Detection Length",
6101        kind: IndicatorParamKind::Int,
6102        required: false,
6103        default: Some(ParamValueStatic::Int(15)),
6104        min: Some(1.0),
6105        max: None,
6106        step: Some(1.0),
6107        enum_values: EMPTY_ENUM_VALUES,
6108        notes: None,
6109    },
6110    IndicatorParamInfo {
6111        key: "pivot_right",
6112        label: "Divergence Pivot Confirmation Length",
6113        kind: IndicatorParamKind::Int,
6114        required: false,
6115        default: Some(ParamValueStatic::Int(1)),
6116        min: Some(0.0),
6117        max: None,
6118        step: Some(1.0),
6119        enum_values: EMPTY_ENUM_VALUES,
6120        notes: None,
6121    },
6122    IndicatorParamInfo {
6123        key: "plot_bullish",
6124        label: "Plot Bullish Divergences",
6125        kind: IndicatorParamKind::Bool,
6126        required: false,
6127        default: Some(ParamValueStatic::Bool(true)),
6128        min: None,
6129        max: None,
6130        step: None,
6131        enum_values: ENUM_VALUES_TRUE_FALSE,
6132        notes: None,
6133    },
6134    IndicatorParamInfo {
6135        key: "plot_bearish",
6136        label: "Plot Bearish Divergences",
6137        kind: IndicatorParamKind::Bool,
6138        required: false,
6139        default: Some(ParamValueStatic::Bool(true)),
6140        min: None,
6141        max: None,
6142        step: None,
6143        enum_values: ENUM_VALUES_TRUE_FALSE,
6144        notes: None,
6145    },
6146];
6147
6148const PARAM_KELTNER: &[IndicatorParamInfo] = &[
6149    IndicatorParamInfo {
6150        key: "period",
6151        label: "Period",
6152        kind: IndicatorParamKind::Int,
6153        required: false,
6154        default: Some(ParamValueStatic::Int(20)),
6155        min: Some(1.0),
6156        max: None,
6157        step: Some(1.0),
6158        enum_values: EMPTY_ENUM_VALUES,
6159        notes: None,
6160    },
6161    IndicatorParamInfo {
6162        key: "multiplier",
6163        label: "Multiplier",
6164        kind: IndicatorParamKind::Float,
6165        required: false,
6166        default: Some(ParamValueStatic::Float(2.0)),
6167        min: Some(0.0),
6168        max: None,
6169        step: None,
6170        enum_values: EMPTY_ENUM_VALUES,
6171        notes: None,
6172    },
6173    IndicatorParamInfo {
6174        key: "ma_type",
6175        label: "MA Type",
6176        kind: IndicatorParamKind::EnumString,
6177        required: false,
6178        default: Some(ParamValueStatic::EnumString("ema")),
6179        min: None,
6180        max: None,
6181        step: None,
6182        enum_values: EMPTY_ENUM_VALUES,
6183        notes: None,
6184    },
6185];
6186
6187const PARAM_AROON: &[IndicatorParamInfo] = &[IndicatorParamInfo {
6188    key: "length",
6189    label: "Length",
6190    kind: IndicatorParamKind::Int,
6191    required: false,
6192    default: Some(ParamValueStatic::Int(14)),
6193    min: Some(1.0),
6194    max: None,
6195    step: Some(1.0),
6196    enum_values: EMPTY_ENUM_VALUES,
6197    notes: None,
6198}];
6199
6200const PARAM_SRSI: &[IndicatorParamInfo] = &[
6201    IndicatorParamInfo {
6202        key: "rsi_period",
6203        label: "RSI Period",
6204        kind: IndicatorParamKind::Int,
6205        required: false,
6206        default: Some(ParamValueStatic::Int(14)),
6207        min: Some(1.0),
6208        max: None,
6209        step: Some(1.0),
6210        enum_values: EMPTY_ENUM_VALUES,
6211        notes: None,
6212    },
6213    IndicatorParamInfo {
6214        key: "stoch_period",
6215        label: "Stoch Period",
6216        kind: IndicatorParamKind::Int,
6217        required: false,
6218        default: Some(ParamValueStatic::Int(14)),
6219        min: Some(1.0),
6220        max: None,
6221        step: Some(1.0),
6222        enum_values: EMPTY_ENUM_VALUES,
6223        notes: None,
6224    },
6225    IndicatorParamInfo {
6226        key: "k",
6227        label: "K",
6228        kind: IndicatorParamKind::Int,
6229        required: false,
6230        default: Some(ParamValueStatic::Int(3)),
6231        min: Some(1.0),
6232        max: None,
6233        step: Some(1.0),
6234        enum_values: EMPTY_ENUM_VALUES,
6235        notes: None,
6236    },
6237    IndicatorParamInfo {
6238        key: "d",
6239        label: "D",
6240        kind: IndicatorParamKind::Int,
6241        required: false,
6242        default: Some(ParamValueStatic::Int(3)),
6243        min: Some(1.0),
6244        max: None,
6245        step: Some(1.0),
6246        enum_values: EMPTY_ENUM_VALUES,
6247        notes: None,
6248    },
6249    IndicatorParamInfo {
6250        key: "source",
6251        label: "Source",
6252        kind: IndicatorParamKind::EnumString,
6253        required: false,
6254        default: Some(ParamValueStatic::EnumString("close")),
6255        min: None,
6256        max: None,
6257        step: None,
6258        enum_values: EMPTY_ENUM_VALUES,
6259        notes: None,
6260    },
6261];
6262
6263const PARAM_STOCHASTIC_CONNORS_RSI: &[IndicatorParamInfo] = &[
6264    IndicatorParamInfo {
6265        key: "stoch_length",
6266        label: "Stochastic Length",
6267        kind: IndicatorParamKind::Int,
6268        required: false,
6269        default: Some(ParamValueStatic::Int(3)),
6270        min: Some(1.0),
6271        max: None,
6272        step: Some(1.0),
6273        enum_values: EMPTY_ENUM_VALUES,
6274        notes: None,
6275    },
6276    IndicatorParamInfo {
6277        key: "smooth_k",
6278        label: "K",
6279        kind: IndicatorParamKind::Int,
6280        required: false,
6281        default: Some(ParamValueStatic::Int(3)),
6282        min: Some(1.0),
6283        max: None,
6284        step: Some(1.0),
6285        enum_values: EMPTY_ENUM_VALUES,
6286        notes: None,
6287    },
6288    IndicatorParamInfo {
6289        key: "smooth_d",
6290        label: "D",
6291        kind: IndicatorParamKind::Int,
6292        required: false,
6293        default: Some(ParamValueStatic::Int(3)),
6294        min: Some(1.0),
6295        max: None,
6296        step: Some(1.0),
6297        enum_values: EMPTY_ENUM_VALUES,
6298        notes: None,
6299    },
6300    IndicatorParamInfo {
6301        key: "rsi_length",
6302        label: "RSI Length",
6303        kind: IndicatorParamKind::Int,
6304        required: false,
6305        default: Some(ParamValueStatic::Int(3)),
6306        min: Some(1.0),
6307        max: None,
6308        step: Some(1.0),
6309        enum_values: EMPTY_ENUM_VALUES,
6310        notes: None,
6311    },
6312    IndicatorParamInfo {
6313        key: "updown_length",
6314        label: "Updown RSI Length",
6315        kind: IndicatorParamKind::Int,
6316        required: false,
6317        default: Some(ParamValueStatic::Int(2)),
6318        min: Some(1.0),
6319        max: None,
6320        step: Some(1.0),
6321        enum_values: EMPTY_ENUM_VALUES,
6322        notes: None,
6323    },
6324    IndicatorParamInfo {
6325        key: "roc_length",
6326        label: "ROC Length",
6327        kind: IndicatorParamKind::Int,
6328        required: false,
6329        default: Some(ParamValueStatic::Int(100)),
6330        min: Some(1.0),
6331        max: None,
6332        step: Some(1.0),
6333        enum_values: EMPTY_ENUM_VALUES,
6334        notes: None,
6335    },
6336];
6337
6338const PARAM_CHOP: &[IndicatorParamInfo] = &[
6339    IndicatorParamInfo {
6340        key: "period",
6341        label: "Period",
6342        kind: IndicatorParamKind::Int,
6343        required: false,
6344        default: Some(ParamValueStatic::Int(14)),
6345        min: Some(1.0),
6346        max: None,
6347        step: Some(1.0),
6348        enum_values: EMPTY_ENUM_VALUES,
6349        notes: None,
6350    },
6351    IndicatorParamInfo {
6352        key: "scalar",
6353        label: "Scalar",
6354        kind: IndicatorParamKind::Float,
6355        required: false,
6356        default: Some(ParamValueStatic::Float(100.0)),
6357        min: Some(0.0),
6358        max: None,
6359        step: None,
6360        enum_values: EMPTY_ENUM_VALUES,
6361        notes: None,
6362    },
6363    IndicatorParamInfo {
6364        key: "drift",
6365        label: "Drift",
6366        kind: IndicatorParamKind::Int,
6367        required: false,
6368        default: Some(ParamValueStatic::Int(1)),
6369        min: Some(1.0),
6370        max: None,
6371        step: Some(1.0),
6372        enum_values: EMPTY_ENUM_VALUES,
6373        notes: None,
6374    },
6375];
6376
6377const PARAM_SQUEEZE_MOMENTUM: &[IndicatorParamInfo] = &[
6378    IndicatorParamInfo {
6379        key: "length_bb",
6380        label: "BB Length",
6381        kind: IndicatorParamKind::Int,
6382        required: false,
6383        default: Some(ParamValueStatic::Int(20)),
6384        min: Some(1.0),
6385        max: None,
6386        step: Some(1.0),
6387        enum_values: EMPTY_ENUM_VALUES,
6388        notes: None,
6389    },
6390    IndicatorParamInfo {
6391        key: "mult_bb",
6392        label: "BB Mult",
6393        kind: IndicatorParamKind::Float,
6394        required: false,
6395        default: Some(ParamValueStatic::Float(2.0)),
6396        min: Some(0.0),
6397        max: None,
6398        step: None,
6399        enum_values: EMPTY_ENUM_VALUES,
6400        notes: None,
6401    },
6402    IndicatorParamInfo {
6403        key: "length_kc",
6404        label: "KC Length",
6405        kind: IndicatorParamKind::Int,
6406        required: false,
6407        default: Some(ParamValueStatic::Int(20)),
6408        min: Some(1.0),
6409        max: None,
6410        step: Some(1.0),
6411        enum_values: EMPTY_ENUM_VALUES,
6412        notes: None,
6413    },
6414    IndicatorParamInfo {
6415        key: "mult_kc",
6416        label: "KC Mult",
6417        kind: IndicatorParamKind::Float,
6418        required: false,
6419        default: Some(ParamValueStatic::Float(1.5)),
6420        min: Some(0.0),
6421        max: None,
6422        step: None,
6423        enum_values: EMPTY_ENUM_VALUES,
6424        notes: None,
6425    },
6426];
6427
6428const PARAM_WTO: &[IndicatorParamInfo] = &[
6429    IndicatorParamInfo {
6430        key: "channel_length",
6431        label: "Channel Length",
6432        kind: IndicatorParamKind::Int,
6433        required: false,
6434        default: Some(ParamValueStatic::Int(10)),
6435        min: Some(1.0),
6436        max: None,
6437        step: Some(1.0),
6438        enum_values: EMPTY_ENUM_VALUES,
6439        notes: None,
6440    },
6441    IndicatorParamInfo {
6442        key: "average_length",
6443        label: "Average Length",
6444        kind: IndicatorParamKind::Int,
6445        required: false,
6446        default: Some(ParamValueStatic::Int(21)),
6447        min: Some(1.0),
6448        max: None,
6449        step: Some(1.0),
6450        enum_values: EMPTY_ENUM_VALUES,
6451        notes: None,
6452    },
6453];
6454
6455const PARAM_WAVETREND: &[IndicatorParamInfo] = &[
6456    IndicatorParamInfo {
6457        key: "channel_length",
6458        label: "Channel Length",
6459        kind: IndicatorParamKind::Int,
6460        required: false,
6461        default: Some(ParamValueStatic::Int(9)),
6462        min: Some(1.0),
6463        max: None,
6464        step: Some(1.0),
6465        enum_values: EMPTY_ENUM_VALUES,
6466        notes: None,
6467    },
6468    IndicatorParamInfo {
6469        key: "average_length",
6470        label: "Average Length",
6471        kind: IndicatorParamKind::Int,
6472        required: false,
6473        default: Some(ParamValueStatic::Int(12)),
6474        min: Some(1.0),
6475        max: None,
6476        step: Some(1.0),
6477        enum_values: EMPTY_ENUM_VALUES,
6478        notes: None,
6479    },
6480    IndicatorParamInfo {
6481        key: "ma_length",
6482        label: "MA Length",
6483        kind: IndicatorParamKind::Int,
6484        required: false,
6485        default: Some(ParamValueStatic::Int(3)),
6486        min: Some(1.0),
6487        max: None,
6488        step: Some(1.0),
6489        enum_values: EMPTY_ENUM_VALUES,
6490        notes: None,
6491    },
6492    IndicatorParamInfo {
6493        key: "factor",
6494        label: "Factor",
6495        kind: IndicatorParamKind::Float,
6496        required: false,
6497        default: Some(ParamValueStatic::Float(0.015)),
6498        min: Some(0.0),
6499        max: None,
6500        step: None,
6501        enum_values: EMPTY_ENUM_VALUES,
6502        notes: None,
6503    },
6504];
6505
6506const PARAM_YANG_ZHANG: &[IndicatorParamInfo] = &[
6507    IndicatorParamInfo {
6508        key: "lookback",
6509        label: "Lookback",
6510        kind: IndicatorParamKind::Int,
6511        required: false,
6512        default: Some(ParamValueStatic::Int(14)),
6513        min: Some(1.0),
6514        max: None,
6515        step: Some(1.0),
6516        enum_values: EMPTY_ENUM_VALUES,
6517        notes: None,
6518    },
6519    IndicatorParamInfo {
6520        key: "k_override",
6521        label: "K Override",
6522        kind: IndicatorParamKind::Bool,
6523        required: false,
6524        default: Some(ParamValueStatic::Bool(false)),
6525        min: None,
6526        max: None,
6527        step: None,
6528        enum_values: ENUM_VALUES_TRUE_FALSE,
6529        notes: None,
6530    },
6531    IndicatorParamInfo {
6532        key: "k",
6533        label: "K",
6534        kind: IndicatorParamKind::Float,
6535        required: false,
6536        default: Some(ParamValueStatic::Float(0.34)),
6537        min: Some(0.0),
6538        max: None,
6539        step: None,
6540        enum_values: EMPTY_ENUM_VALUES,
6541        notes: None,
6542    },
6543];
6544
6545const PARAM_GARMAN_KLASS: &[IndicatorParamInfo] = &[IndicatorParamInfo {
6546    key: "lookback",
6547    label: "Lookback",
6548    kind: IndicatorParamKind::Int,
6549    required: false,
6550    default: Some(ParamValueStatic::Int(14)),
6551    min: Some(1.0),
6552    max: None,
6553    step: Some(1.0),
6554    enum_values: EMPTY_ENUM_VALUES,
6555    notes: None,
6556}];
6557
6558const PARAM_PARKINSON: &[IndicatorParamInfo] = &[IndicatorParamInfo {
6559    key: "period",
6560    label: "Period",
6561    kind: IndicatorParamKind::Int,
6562    required: false,
6563    default: Some(ParamValueStatic::Int(8)),
6564    min: Some(1.0),
6565    max: None,
6566    step: Some(1.0),
6567    enum_values: EMPTY_ENUM_VALUES,
6568    notes: None,
6569}];
6570
6571const PARAM_GOPALAKRISHNAN_RANGE_INDEX: &[IndicatorParamInfo] = &[IndicatorParamInfo {
6572    key: "length",
6573    label: "Length",
6574    kind: IndicatorParamKind::Int,
6575    required: false,
6576    default: Some(ParamValueStatic::Int(5)),
6577    min: Some(2.0),
6578    max: None,
6579    step: Some(1.0),
6580    enum_values: EMPTY_ENUM_VALUES,
6581    notes: None,
6582}];
6583
6584const PARAM_ATR_PERCENTILE: &[IndicatorParamInfo] = &[
6585    IndicatorParamInfo {
6586        key: "atr_length",
6587        label: "ATR Length",
6588        kind: IndicatorParamKind::Int,
6589        required: false,
6590        default: Some(ParamValueStatic::Int(10)),
6591        min: Some(1.0),
6592        max: None,
6593        step: Some(1.0),
6594        enum_values: EMPTY_ENUM_VALUES,
6595        notes: None,
6596    },
6597    IndicatorParamInfo {
6598        key: "percentile_length",
6599        label: "Percentile Length",
6600        kind: IndicatorParamKind::Int,
6601        required: false,
6602        default: Some(ParamValueStatic::Int(50)),
6603        min: Some(1.0),
6604        max: None,
6605        step: Some(1.0),
6606        enum_values: EMPTY_ENUM_VALUES,
6607        notes: None,
6608    },
6609];
6610
6611const PARAM_HISTORICAL_VOLATILITY: &[IndicatorParamInfo] = &[
6612    IndicatorParamInfo {
6613        key: "lookback",
6614        label: "Lookback",
6615        kind: IndicatorParamKind::Int,
6616        required: false,
6617        default: Some(ParamValueStatic::Int(20)),
6618        min: Some(1.0),
6619        max: None,
6620        step: Some(1.0),
6621        enum_values: EMPTY_ENUM_VALUES,
6622        notes: None,
6623    },
6624    IndicatorParamInfo {
6625        key: "annualization_days",
6626        label: "Annualization Days",
6627        kind: IndicatorParamKind::Float,
6628        required: false,
6629        default: Some(ParamValueStatic::Float(250.0)),
6630        min: Some(0.0),
6631        max: None,
6632        step: None,
6633        enum_values: EMPTY_ENUM_VALUES,
6634        notes: None,
6635    },
6636];
6637
6638const PARAM_VELOCITY_ACCELERATION_INDICATOR: &[IndicatorParamInfo] = &[
6639    IndicatorParamInfo {
6640        key: "length",
6641        label: "Length",
6642        kind: IndicatorParamKind::Int,
6643        required: false,
6644        default: Some(ParamValueStatic::Int(21)),
6645        min: Some(2.0),
6646        max: None,
6647        step: Some(1.0),
6648        enum_values: EMPTY_ENUM_VALUES,
6649        notes: None,
6650    },
6651    IndicatorParamInfo {
6652        key: "smooth_length",
6653        label: "Smooth Length",
6654        kind: IndicatorParamKind::Int,
6655        required: false,
6656        default: Some(ParamValueStatic::Int(5)),
6657        min: Some(1.0),
6658        max: None,
6659        step: Some(1.0),
6660        enum_values: EMPTY_ENUM_VALUES,
6661        notes: None,
6662    },
6663    IndicatorParamInfo {
6664        key: "source",
6665        label: "Source",
6666        kind: IndicatorParamKind::EnumString,
6667        required: false,
6668        default: Some(ParamValueStatic::EnumString("hlcc4")),
6669        min: None,
6670        max: None,
6671        step: None,
6672        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
6673        notes: None,
6674    },
6675];
6676
6677const PARAM_NORMALIZED_RESONATOR: &[IndicatorParamInfo] = &[
6678    IndicatorParamInfo {
6679        key: "period",
6680        label: "Period",
6681        kind: IndicatorParamKind::Int,
6682        required: false,
6683        default: Some(ParamValueStatic::Int(100)),
6684        min: Some(2.0),
6685        max: None,
6686        step: Some(1.0),
6687        enum_values: EMPTY_ENUM_VALUES,
6688        notes: None,
6689    },
6690    IndicatorParamInfo {
6691        key: "delta",
6692        label: "Delta",
6693        kind: IndicatorParamKind::Float,
6694        required: false,
6695        default: Some(ParamValueStatic::Float(0.5)),
6696        min: Some(0.01),
6697        max: Some(1.0),
6698        step: Some(0.05),
6699        enum_values: EMPTY_ENUM_VALUES,
6700        notes: None,
6701    },
6702    IndicatorParamInfo {
6703        key: "lookback_mult",
6704        label: "Lookback Multiplier",
6705        kind: IndicatorParamKind::Float,
6706        required: false,
6707        default: Some(ParamValueStatic::Float(1.0)),
6708        min: Some(0.1),
6709        max: None,
6710        step: Some(0.1),
6711        enum_values: EMPTY_ENUM_VALUES,
6712        notes: None,
6713    },
6714    IndicatorParamInfo {
6715        key: "signal_length",
6716        label: "Signal Length",
6717        kind: IndicatorParamKind::Int,
6718        required: false,
6719        default: Some(ParamValueStatic::Int(9)),
6720        min: Some(1.0),
6721        max: None,
6722        step: Some(1.0),
6723        enum_values: EMPTY_ENUM_VALUES,
6724        notes: None,
6725    },
6726    IndicatorParamInfo {
6727        key: "source",
6728        label: "Source",
6729        kind: IndicatorParamKind::EnumString,
6730        required: false,
6731        default: Some(ParamValueStatic::EnumString("hl2")),
6732        min: None,
6733        max: None,
6734        step: None,
6735        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
6736        notes: None,
6737    },
6738];
6739
6740const PARAM_MONOTONICITY_INDEX: &[IndicatorParamInfo] = &[
6741    IndicatorParamInfo {
6742        key: "length",
6743        label: "Period",
6744        kind: IndicatorParamKind::Int,
6745        required: false,
6746        default: Some(ParamValueStatic::Int(20)),
6747        min: Some(2.0),
6748        max: None,
6749        step: Some(1.0),
6750        enum_values: EMPTY_ENUM_VALUES,
6751        notes: None,
6752    },
6753    IndicatorParamInfo {
6754        key: "mode",
6755        label: "Mode",
6756        kind: IndicatorParamKind::EnumString,
6757        required: false,
6758        default: Some(ParamValueStatic::EnumString("efficiency")),
6759        min: None,
6760        max: None,
6761        step: None,
6762        enum_values: ENUM_VALUES_MONOTONICITY_INDEX_MODE,
6763        notes: None,
6764    },
6765    IndicatorParamInfo {
6766        key: "index_smooth",
6767        label: "Index Smoothing",
6768        kind: IndicatorParamKind::Int,
6769        required: false,
6770        default: Some(ParamValueStatic::Int(5)),
6771        min: Some(1.0),
6772        max: None,
6773        step: Some(1.0),
6774        enum_values: EMPTY_ENUM_VALUES,
6775        notes: None,
6776    },
6777    IndicatorParamInfo {
6778        key: "source",
6779        label: "Source",
6780        kind: IndicatorParamKind::EnumString,
6781        required: false,
6782        default: Some(ParamValueStatic::EnumString("close")),
6783        min: None,
6784        max: None,
6785        step: None,
6786        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
6787        notes: None,
6788    },
6789];
6790
6791const PARAM_HALF_CAUSAL_ESTIMATOR: &[IndicatorParamInfo] = &[
6792    IndicatorParamInfo {
6793        key: "slots_per_day",
6794        label: "Slots Per Day",
6795        kind: IndicatorParamKind::Int,
6796        required: false,
6797        default: None,
6798        min: Some(2.0),
6799        max: None,
6800        step: Some(1.0),
6801        enum_values: EMPTY_ENUM_VALUES,
6802        notes: Some("Required for raw-slice dispatch; candle dispatch infers this when omitted."),
6803    },
6804    IndicatorParamInfo {
6805        key: "data_period",
6806        label: "Data Period",
6807        kind: IndicatorParamKind::Int,
6808        required: false,
6809        default: Some(ParamValueStatic::Int(5)),
6810        min: Some(0.0),
6811        max: None,
6812        step: Some(1.0),
6813        enum_values: EMPTY_ENUM_VALUES,
6814        notes: None,
6815    },
6816    IndicatorParamInfo {
6817        key: "filter_length",
6818        label: "Filter Length",
6819        kind: IndicatorParamKind::Int,
6820        required: false,
6821        default: Some(ParamValueStatic::Int(20)),
6822        min: Some(2.0),
6823        max: None,
6824        step: Some(1.0),
6825        enum_values: EMPTY_ENUM_VALUES,
6826        notes: None,
6827    },
6828    IndicatorParamInfo {
6829        key: "kernel_width",
6830        label: "Kernel Width",
6831        kind: IndicatorParamKind::Float,
6832        required: false,
6833        default: Some(ParamValueStatic::Float(20.0)),
6834        min: Some(0.125),
6835        max: None,
6836        step: Some(0.125),
6837        enum_values: EMPTY_ENUM_VALUES,
6838        notes: None,
6839    },
6840    IndicatorParamInfo {
6841        key: "kernel_type",
6842        label: "Kernel Type",
6843        kind: IndicatorParamKind::EnumString,
6844        required: false,
6845        default: Some(ParamValueStatic::EnumString("epanechnikov")),
6846        min: None,
6847        max: None,
6848        step: None,
6849        enum_values: ENUM_VALUES_HALF_CAUSAL_ESTIMATOR_KERNEL_TYPE,
6850        notes: None,
6851    },
6852    IndicatorParamInfo {
6853        key: "confidence_adjust",
6854        label: "Confidence Adjust",
6855        kind: IndicatorParamKind::EnumString,
6856        required: false,
6857        default: Some(ParamValueStatic::EnumString("symmetric")),
6858        min: None,
6859        max: None,
6860        step: None,
6861        enum_values: ENUM_VALUES_HALF_CAUSAL_ESTIMATOR_CONFIDENCE_ADJUST,
6862        notes: None,
6863    },
6864    IndicatorParamInfo {
6865        key: "maximum_confidence_adjust",
6866        label: "Maximum Confidence Adjust",
6867        kind: IndicatorParamKind::Float,
6868        required: false,
6869        default: Some(ParamValueStatic::Float(100.0)),
6870        min: Some(0.0),
6871        max: Some(100.0),
6872        step: Some(1.0),
6873        enum_values: EMPTY_ENUM_VALUES,
6874        notes: None,
6875    },
6876    IndicatorParamInfo {
6877        key: "enable_expected_value",
6878        label: "Enable Expected Value",
6879        kind: IndicatorParamKind::Bool,
6880        required: false,
6881        default: Some(ParamValueStatic::Bool(false)),
6882        min: None,
6883        max: None,
6884        step: None,
6885        enum_values: ENUM_VALUES_TRUE_FALSE,
6886        notes: None,
6887    },
6888    IndicatorParamInfo {
6889        key: "extra_smoothing",
6890        label: "Extra Smoothing",
6891        kind: IndicatorParamKind::Int,
6892        required: false,
6893        default: Some(ParamValueStatic::Int(0)),
6894        min: Some(0.0),
6895        max: None,
6896        step: Some(1.0),
6897        enum_values: EMPTY_ENUM_VALUES,
6898        notes: None,
6899    },
6900    IndicatorParamInfo {
6901        key: "source",
6902        label: "Source",
6903        kind: IndicatorParamKind::EnumString,
6904        required: false,
6905        default: Some(ParamValueStatic::EnumString("volume")),
6906        min: None,
6907        max: None,
6908        step: None,
6909        enum_values: ENUM_VALUES_HALF_CAUSAL_ESTIMATOR_SOURCE,
6910        notes: None,
6911    },
6912];
6913
6914const PARAM_ABSOLUTE_STRENGTH_INDEX_OSCILLATOR: &[IndicatorParamInfo] = &[
6915    IndicatorParamInfo {
6916        key: "ema_length",
6917        label: "EMA Length",
6918        kind: IndicatorParamKind::Int,
6919        required: false,
6920        default: Some(ParamValueStatic::Int(21)),
6921        min: Some(1.0),
6922        max: None,
6923        step: Some(1.0),
6924        enum_values: EMPTY_ENUM_VALUES,
6925        notes: None,
6926    },
6927    IndicatorParamInfo {
6928        key: "signal_length",
6929        label: "Signal Length",
6930        kind: IndicatorParamKind::Int,
6931        required: false,
6932        default: Some(ParamValueStatic::Int(34)),
6933        min: Some(2.0),
6934        max: None,
6935        step: Some(1.0),
6936        enum_values: EMPTY_ENUM_VALUES,
6937        notes: None,
6938    },
6939];
6940
6941const PARAM_PREMIER_RSI_OSCILLATOR: &[IndicatorParamInfo] = &[
6942    IndicatorParamInfo {
6943        key: "rsi_length",
6944        label: "RSI Length",
6945        kind: IndicatorParamKind::Int,
6946        required: false,
6947        default: Some(ParamValueStatic::Int(14)),
6948        min: Some(1.0),
6949        max: None,
6950        step: Some(1.0),
6951        enum_values: EMPTY_ENUM_VALUES,
6952        notes: None,
6953    },
6954    IndicatorParamInfo {
6955        key: "stoch_length",
6956        label: "Stoch Length",
6957        kind: IndicatorParamKind::Int,
6958        required: false,
6959        default: Some(ParamValueStatic::Int(8)),
6960        min: Some(1.0),
6961        max: None,
6962        step: Some(1.0),
6963        enum_values: EMPTY_ENUM_VALUES,
6964        notes: None,
6965    },
6966    IndicatorParamInfo {
6967        key: "smooth_length",
6968        label: "Smooth Length",
6969        kind: IndicatorParamKind::Int,
6970        required: false,
6971        default: Some(ParamValueStatic::Int(25)),
6972        min: Some(1.0),
6973        max: None,
6974        step: Some(1.0),
6975        enum_values: EMPTY_ENUM_VALUES,
6976        notes: None,
6977    },
6978];
6979
6980const PARAM_MULTI_LENGTH_STOCHASTIC_AVERAGE: &[IndicatorParamInfo] = &[
6981    IndicatorParamInfo {
6982        key: "length",
6983        label: "Length",
6984        kind: IndicatorParamKind::Int,
6985        required: false,
6986        default: Some(ParamValueStatic::Int(14)),
6987        min: Some(4.0),
6988        max: None,
6989        step: Some(1.0),
6990        enum_values: EMPTY_ENUM_VALUES,
6991        notes: None,
6992    },
6993    IndicatorParamInfo {
6994        key: "presmooth",
6995        label: "Pre-Smoothing",
6996        kind: IndicatorParamKind::Int,
6997        required: false,
6998        default: Some(ParamValueStatic::Int(10)),
6999        min: Some(1.0),
7000        max: None,
7001        step: Some(1.0),
7002        enum_values: EMPTY_ENUM_VALUES,
7003        notes: None,
7004    },
7005    IndicatorParamInfo {
7006        key: "premethod",
7007        label: "Pre-Smoothing Method",
7008        kind: IndicatorParamKind::EnumString,
7009        required: false,
7010        default: Some(ParamValueStatic::EnumString("sma")),
7011        min: None,
7012        max: None,
7013        step: None,
7014        enum_values: ENUM_VALUES_MULTI_LENGTH_STOCHASTIC_AVERAGE_METHOD,
7015        notes: None,
7016    },
7017    IndicatorParamInfo {
7018        key: "postsmooth",
7019        label: "Post-Smoothing",
7020        kind: IndicatorParamKind::Int,
7021        required: false,
7022        default: Some(ParamValueStatic::Int(10)),
7023        min: Some(1.0),
7024        max: None,
7025        step: Some(1.0),
7026        enum_values: EMPTY_ENUM_VALUES,
7027        notes: None,
7028    },
7029    IndicatorParamInfo {
7030        key: "postmethod",
7031        label: "Post-Smoothing Method",
7032        kind: IndicatorParamKind::EnumString,
7033        required: false,
7034        default: Some(ParamValueStatic::EnumString("sma")),
7035        min: None,
7036        max: None,
7037        step: None,
7038        enum_values: ENUM_VALUES_MULTI_LENGTH_STOCHASTIC_AVERAGE_METHOD,
7039        notes: None,
7040    },
7041    IndicatorParamInfo {
7042        key: "source",
7043        label: "Source",
7044        kind: IndicatorParamKind::EnumString,
7045        required: false,
7046        default: Some(ParamValueStatic::EnumString("close")),
7047        min: None,
7048        max: None,
7049        step: None,
7050        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
7051        notes: None,
7052    },
7053];
7054
7055const PARAM_HULL_BUTTERFLY_OSCILLATOR: &[IndicatorParamInfo] = &[
7056    IndicatorParamInfo {
7057        key: "length",
7058        label: "Length",
7059        kind: IndicatorParamKind::Int,
7060        required: false,
7061        default: Some(ParamValueStatic::Int(14)),
7062        min: Some(2.0),
7063        max: None,
7064        step: Some(1.0),
7065        enum_values: EMPTY_ENUM_VALUES,
7066        notes: None,
7067    },
7068    IndicatorParamInfo {
7069        key: "mult",
7070        label: "Levels Multiplier",
7071        kind: IndicatorParamKind::Float,
7072        required: false,
7073        default: Some(ParamValueStatic::Float(2.0)),
7074        min: None,
7075        max: None,
7076        step: Some(0.1),
7077        enum_values: EMPTY_ENUM_VALUES,
7078        notes: None,
7079    },
7080    IndicatorParamInfo {
7081        key: "source",
7082        label: "Source",
7083        kind: IndicatorParamKind::EnumString,
7084        required: false,
7085        default: Some(ParamValueStatic::EnumString("close")),
7086        min: None,
7087        max: None,
7088        step: None,
7089        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
7090        notes: None,
7091    },
7092];
7093
7094const PARAM_FIBONACCI_TRAILING_STOP: &[IndicatorParamInfo] = &[
7095    IndicatorParamInfo {
7096        key: "left_bars",
7097        label: "Left Bars",
7098        kind: IndicatorParamKind::Int,
7099        required: false,
7100        default: Some(ParamValueStatic::Int(20)),
7101        min: Some(1.0),
7102        max: None,
7103        step: Some(1.0),
7104        enum_values: EMPTY_ENUM_VALUES,
7105        notes: None,
7106    },
7107    IndicatorParamInfo {
7108        key: "right_bars",
7109        label: "Right Bars",
7110        kind: IndicatorParamKind::Int,
7111        required: false,
7112        default: Some(ParamValueStatic::Int(1)),
7113        min: Some(1.0),
7114        max: None,
7115        step: Some(1.0),
7116        enum_values: EMPTY_ENUM_VALUES,
7117        notes: None,
7118    },
7119    IndicatorParamInfo {
7120        key: "level",
7121        label: "Level",
7122        kind: IndicatorParamKind::Float,
7123        required: false,
7124        default: Some(ParamValueStatic::Float(-0.382)),
7125        min: None,
7126        max: None,
7127        step: Some(0.001),
7128        enum_values: EMPTY_ENUM_VALUES,
7129        notes: Some("Finite Fibonacci extension/retracement factor"),
7130    },
7131    IndicatorParamInfo {
7132        key: "trigger",
7133        label: "Trigger",
7134        kind: IndicatorParamKind::EnumString,
7135        required: false,
7136        default: Some(ParamValueStatic::EnumString("close")),
7137        min: None,
7138        max: None,
7139        step: None,
7140        enum_values: ENUM_VALUES_FIBONACCI_TRAILING_STOP_TRIGGER,
7141        notes: None,
7142    },
7143];
7144const PARAM_FIBONACCI_ENTRY_BANDS: &[IndicatorParamInfo] = &[
7145    IndicatorParamInfo {
7146        key: "source",
7147        label: "Source",
7148        kind: IndicatorParamKind::EnumString,
7149        required: false,
7150        default: Some(ParamValueStatic::EnumString("hlc3")),
7151        min: None,
7152        max: None,
7153        step: None,
7154        enum_values: ENUM_VALUES_FIBONACCI_ENTRY_BANDS_SOURCE,
7155        notes: None,
7156    },
7157    IndicatorParamInfo {
7158        key: "length",
7159        label: "Length",
7160        kind: IndicatorParamKind::Int,
7161        required: false,
7162        default: Some(ParamValueStatic::Int(21)),
7163        min: Some(1.0),
7164        max: None,
7165        step: Some(1.0),
7166        enum_values: EMPTY_ENUM_VALUES,
7167        notes: None,
7168    },
7169    IndicatorParamInfo {
7170        key: "atr_length",
7171        label: "ATR Length",
7172        kind: IndicatorParamKind::Int,
7173        required: false,
7174        default: Some(ParamValueStatic::Int(14)),
7175        min: Some(1.0),
7176        max: None,
7177        step: Some(1.0),
7178        enum_values: EMPTY_ENUM_VALUES,
7179        notes: None,
7180    },
7181    IndicatorParamInfo {
7182        key: "use_atr",
7183        label: "Use ATR",
7184        kind: IndicatorParamKind::Bool,
7185        required: false,
7186        default: Some(ParamValueStatic::Bool(true)),
7187        min: None,
7188        max: None,
7189        step: None,
7190        enum_values: ENUM_VALUES_TRUE_FALSE,
7191        notes: None,
7192    },
7193    IndicatorParamInfo {
7194        key: "tp_aggressiveness",
7195        label: "TP Aggressiveness",
7196        kind: IndicatorParamKind::EnumString,
7197        required: false,
7198        default: Some(ParamValueStatic::EnumString("low")),
7199        min: None,
7200        max: None,
7201        step: None,
7202        enum_values: ENUM_VALUES_FIBONACCI_ENTRY_BANDS_TP_AGGRESSIVENESS,
7203        notes: None,
7204    },
7205];
7206
7207const PARAM_VOLUME_ENERGY_RESERVOIRS: &[IndicatorParamInfo] = &[
7208    IndicatorParamInfo {
7209        key: "length",
7210        label: "Energy Horizon",
7211        kind: IndicatorParamKind::Int,
7212        required: false,
7213        default: Some(ParamValueStatic::Int(20)),
7214        min: Some(5.0),
7215        max: None,
7216        step: Some(1.0),
7217        enum_values: EMPTY_ENUM_VALUES,
7218        notes: Some("Lookback for price stability and midpoint range."),
7219    },
7220    IndicatorParamInfo {
7221        key: "sensitivity",
7222        label: "Energy Sensitivity",
7223        kind: IndicatorParamKind::Float,
7224        required: false,
7225        default: Some(ParamValueStatic::Float(1.5)),
7226        min: Some(0.5),
7227        max: None,
7228        step: Some(0.1),
7229        enum_values: EMPTY_ENUM_VALUES,
7230        notes: Some("Controls how quickly reservoir energy is released on volume spikes."),
7231    },
7232];
7233
7234const PARAM_NEIGHBORING_TRAILING_STOP: &[IndicatorParamInfo] = &[
7235    IndicatorParamInfo {
7236        key: "buffer_size",
7237        label: "Historical Buffer",
7238        kind: IndicatorParamKind::Int,
7239        required: false,
7240        default: Some(ParamValueStatic::Int(200)),
7241        min: Some(100.0),
7242        max: Some(20000.0),
7243        step: Some(1.0),
7244        enum_values: EMPTY_ENUM_VALUES,
7245        notes: Some("Number of historical closes retained in the sorted neighborhood buffer."),
7246    },
7247    IndicatorParamInfo {
7248        key: "k",
7249        label: "Neighboring Range",
7250        kind: IndicatorParamKind::Int,
7251        required: false,
7252        default: Some(ParamValueStatic::Int(50)),
7253        min: Some(5.0),
7254        max: None,
7255        step: Some(1.0),
7256        enum_values: EMPTY_ENUM_VALUES,
7257        notes: Some("Number of neighboring closes examined on each side of the insertion point."),
7258    },
7259    IndicatorParamInfo {
7260        key: "percentile",
7261        label: "Percentile",
7262        kind: IndicatorParamKind::Float,
7263        required: false,
7264        default: Some(ParamValueStatic::Float(90.0)),
7265        min: Some(1.0),
7266        max: Some(99.0),
7267        step: Some(1.0),
7268        enum_values: EMPTY_ENUM_VALUES,
7269        notes: Some("Percentile rank used for the lower and upper neighborhood bands."),
7270    },
7271    IndicatorParamInfo {
7272        key: "smooth",
7273        label: "Smoothing",
7274        kind: IndicatorParamKind::Int,
7275        required: false,
7276        default: Some(ParamValueStatic::Int(5)),
7277        min: Some(1.0),
7278        max: None,
7279        step: Some(1.0),
7280        enum_values: EMPTY_ENUM_VALUES,
7281        notes: Some("SMA smoothing applied to the neighborhood bands before stop updates."),
7282    },
7283];
7284
7285const PARAM_GROVER_LLORENS_CYCLE_OSCILLATOR: &[IndicatorParamInfo] = &[
7286    IndicatorParamInfo {
7287        key: "length",
7288        label: "Length",
7289        kind: IndicatorParamKind::Int,
7290        required: false,
7291        default: Some(ParamValueStatic::Int(100)),
7292        min: Some(1.0),
7293        max: None,
7294        step: Some(1.0),
7295        enum_values: EMPTY_ENUM_VALUES,
7296        notes: None,
7297    },
7298    IndicatorParamInfo {
7299        key: "mult",
7300        label: "Multiplier",
7301        kind: IndicatorParamKind::Float,
7302        required: false,
7303        default: Some(ParamValueStatic::Float(10.0)),
7304        min: None,
7305        max: None,
7306        step: None,
7307        enum_values: EMPTY_ENUM_VALUES,
7308        notes: None,
7309    },
7310    IndicatorParamInfo {
7311        key: "source",
7312        label: "Source",
7313        kind: IndicatorParamKind::EnumString,
7314        required: false,
7315        default: Some(ParamValueStatic::EnumString("close")),
7316        min: None,
7317        max: None,
7318        step: None,
7319        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
7320        notes: None,
7321    },
7322    IndicatorParamInfo {
7323        key: "smooth",
7324        label: "Smooth",
7325        kind: IndicatorParamKind::Bool,
7326        required: false,
7327        default: Some(ParamValueStatic::Bool(true)),
7328        min: None,
7329        max: None,
7330        step: None,
7331        enum_values: ENUM_VALUES_TRUE_FALSE,
7332        notes: None,
7333    },
7334    IndicatorParamInfo {
7335        key: "rsi_period",
7336        label: "RSI Period",
7337        kind: IndicatorParamKind::Int,
7338        required: false,
7339        default: Some(ParamValueStatic::Int(20)),
7340        min: Some(1.0),
7341        max: None,
7342        step: Some(1.0),
7343        enum_values: EMPTY_ENUM_VALUES,
7344        notes: None,
7345    },
7346];
7347
7348const PARAM_EHLERS_LINEAR_EXTRAPOLATION_PREDICTOR: &[IndicatorParamInfo] = &[
7349    IndicatorParamInfo {
7350        key: "high_pass_length",
7351        label: "High-Pass Length",
7352        kind: IndicatorParamKind::Int,
7353        required: false,
7354        default: Some(ParamValueStatic::Int(125)),
7355        min: Some(1.0),
7356        max: None,
7357        step: Some(1.0),
7358        enum_values: EMPTY_ENUM_VALUES,
7359        notes: None,
7360    },
7361    IndicatorParamInfo {
7362        key: "low_pass_length",
7363        label: "Low-Pass Length",
7364        kind: IndicatorParamKind::Int,
7365        required: false,
7366        default: Some(ParamValueStatic::Int(12)),
7367        min: Some(1.0),
7368        max: None,
7369        step: Some(1.0),
7370        enum_values: EMPTY_ENUM_VALUES,
7371        notes: None,
7372    },
7373    IndicatorParamInfo {
7374        key: "gain",
7375        label: "Gain",
7376        kind: IndicatorParamKind::Float,
7377        required: false,
7378        default: Some(ParamValueStatic::Float(0.7)),
7379        min: None,
7380        max: None,
7381        step: None,
7382        enum_values: EMPTY_ENUM_VALUES,
7383        notes: None,
7384    },
7385    IndicatorParamInfo {
7386        key: "bars_forward",
7387        label: "Bars Forward",
7388        kind: IndicatorParamKind::Int,
7389        required: false,
7390        default: Some(ParamValueStatic::Int(5)),
7391        min: Some(0.0),
7392        max: Some(10.0),
7393        step: Some(1.0),
7394        enum_values: EMPTY_ENUM_VALUES,
7395        notes: Some("Faithful core supports 0..10 forward bars."),
7396    },
7397    IndicatorParamInfo {
7398        key: "signal_mode",
7399        label: "Signal Mode",
7400        kind: IndicatorParamKind::EnumString,
7401        required: false,
7402        default: Some(ParamValueStatic::EnumString("predict_filter_crosses")),
7403        min: None,
7404        max: None,
7405        step: None,
7406        enum_values: ENUM_VALUES_EHLERS_LINEAR_EXTRAPOLATION_SIGNAL_MODE,
7407        notes: None,
7408    },
7409];
7410
7411const PARAM_BULL_POWER_VS_BEAR_POWER: &[IndicatorParamInfo] = &[IndicatorParamInfo {
7412    key: "period",
7413    label: "Period",
7414    kind: IndicatorParamKind::Int,
7415    required: false,
7416    default: Some(ParamValueStatic::Int(5)),
7417    min: Some(1.0),
7418    max: None,
7419    step: Some(1.0),
7420    enum_values: EMPTY_ENUM_VALUES,
7421    notes: None,
7422}];
7423
7424const PARAM_VERTICAL_HORIZONTAL_FILTER: &[IndicatorParamInfo] = &[IndicatorParamInfo {
7425    key: "length",
7426    label: "Length",
7427    kind: IndicatorParamKind::Int,
7428    required: false,
7429    default: Some(ParamValueStatic::Int(28)),
7430    min: Some(1.0),
7431    max: None,
7432    step: Some(1.0),
7433    enum_values: EMPTY_ENUM_VALUES,
7434    notes: None,
7435}];
7436
7437const PARAM_SQUEEZE_INDEX: &[IndicatorParamInfo] = &[
7438    IndicatorParamInfo {
7439        key: "conv",
7440        label: "Convergence Factor",
7441        kind: IndicatorParamKind::Float,
7442        required: false,
7443        default: Some(ParamValueStatic::Float(50.0)),
7444        min: Some(1.0),
7445        max: None,
7446        step: Some(1.0),
7447        enum_values: EMPTY_ENUM_VALUES,
7448        notes: None,
7449    },
7450    IndicatorParamInfo {
7451        key: "length",
7452        label: "Length",
7453        kind: IndicatorParamKind::Int,
7454        required: false,
7455        default: Some(ParamValueStatic::Int(20)),
7456        min: Some(1.0),
7457        max: None,
7458        step: Some(1.0),
7459        enum_values: EMPTY_ENUM_VALUES,
7460        notes: None,
7461    },
7462];
7463
7464const PARAM_STOCHASTIC_DISTANCE: &[IndicatorParamInfo] = &[
7465    IndicatorParamInfo {
7466        key: "lookback_length",
7467        label: "Lookback Length",
7468        kind: IndicatorParamKind::Int,
7469        required: false,
7470        default: Some(ParamValueStatic::Int(200)),
7471        min: Some(1.0),
7472        max: None,
7473        step: Some(1.0),
7474        enum_values: EMPTY_ENUM_VALUES,
7475        notes: None,
7476    },
7477    IndicatorParamInfo {
7478        key: "length1",
7479        label: "Length 1",
7480        kind: IndicatorParamKind::Int,
7481        required: false,
7482        default: Some(ParamValueStatic::Int(12)),
7483        min: Some(1.0),
7484        max: None,
7485        step: Some(1.0),
7486        enum_values: EMPTY_ENUM_VALUES,
7487        notes: None,
7488    },
7489    IndicatorParamInfo {
7490        key: "length2",
7491        label: "Length 2",
7492        kind: IndicatorParamKind::Int,
7493        required: false,
7494        default: Some(ParamValueStatic::Int(3)),
7495        min: Some(1.0),
7496        max: None,
7497        step: Some(1.0),
7498        enum_values: EMPTY_ENUM_VALUES,
7499        notes: None,
7500    },
7501    IndicatorParamInfo {
7502        key: "ob_level",
7503        label: "Overbought Level",
7504        kind: IndicatorParamKind::Int,
7505        required: false,
7506        default: Some(ParamValueStatic::Int(40)),
7507        min: Some(0.0),
7508        max: Some(100.0),
7509        step: Some(1.0),
7510        enum_values: EMPTY_ENUM_VALUES,
7511        notes: None,
7512    },
7513    IndicatorParamInfo {
7514        key: "os_level",
7515        label: "Oversold Level",
7516        kind: IndicatorParamKind::Int,
7517        required: false,
7518        default: Some(ParamValueStatic::Int(-40)),
7519        min: Some(-100.0),
7520        max: Some(0.0),
7521        step: Some(1.0),
7522        enum_values: EMPTY_ENUM_VALUES,
7523        notes: None,
7524    },
7525];
7526
7527const PARAM_ADAPTIVE_BANDPASS_TRIGGER_OSCILLATOR: &[IndicatorParamInfo] = &[
7528    IndicatorParamInfo {
7529        key: "delta",
7530        label: "Delta",
7531        kind: IndicatorParamKind::Float,
7532        required: false,
7533        default: Some(ParamValueStatic::Float(0.1)),
7534        min: Some(0.0000001),
7535        max: Some(0.9999999),
7536        step: Some(0.01),
7537        enum_values: EMPTY_ENUM_VALUES,
7538        notes: None,
7539    },
7540    IndicatorParamInfo {
7541        key: "alpha",
7542        label: "Alpha",
7543        kind: IndicatorParamKind::Float,
7544        required: false,
7545        default: Some(ParamValueStatic::Float(0.07)),
7546        min: Some(0.0000001),
7547        max: Some(0.9999999),
7548        step: Some(0.01),
7549        enum_values: EMPTY_ENUM_VALUES,
7550        notes: None,
7551    },
7552];
7553
7554const PARAM_DIDI_INDEX: &[IndicatorParamInfo] = &[
7555    IndicatorParamInfo {
7556        key: "short_length",
7557        label: "Short Length",
7558        kind: IndicatorParamKind::Int,
7559        required: false,
7560        default: Some(ParamValueStatic::Int(3)),
7561        min: Some(1.0),
7562        max: None,
7563        step: Some(1.0),
7564        enum_values: EMPTY_ENUM_VALUES,
7565        notes: None,
7566    },
7567    IndicatorParamInfo {
7568        key: "medium_length",
7569        label: "Medium Length",
7570        kind: IndicatorParamKind::Int,
7571        required: false,
7572        default: Some(ParamValueStatic::Int(8)),
7573        min: Some(1.0),
7574        max: None,
7575        step: Some(1.0),
7576        enum_values: EMPTY_ENUM_VALUES,
7577        notes: None,
7578    },
7579    IndicatorParamInfo {
7580        key: "long_length",
7581        label: "Long Length",
7582        kind: IndicatorParamKind::Int,
7583        required: false,
7584        default: Some(ParamValueStatic::Int(20)),
7585        min: Some(1.0),
7586        max: None,
7587        step: Some(1.0),
7588        enum_values: EMPTY_ENUM_VALUES,
7589        notes: None,
7590    },
7591];
7592
7593const PARAM_EHLERS_AUTOCORRELATION_PERIODOGRAM: &[IndicatorParamInfo] = &[
7594    IndicatorParamInfo {
7595        key: "min_period",
7596        label: "Min Period",
7597        kind: IndicatorParamKind::Int,
7598        required: false,
7599        default: Some(ParamValueStatic::Int(8)),
7600        min: Some(3.0),
7601        max: None,
7602        step: Some(1.0),
7603        enum_values: EMPTY_ENUM_VALUES,
7604        notes: None,
7605    },
7606    IndicatorParamInfo {
7607        key: "max_period",
7608        label: "Max Period",
7609        kind: IndicatorParamKind::Int,
7610        required: false,
7611        default: Some(ParamValueStatic::Int(48)),
7612        min: Some(4.0),
7613        max: None,
7614        step: Some(1.0),
7615        enum_values: EMPTY_ENUM_VALUES,
7616        notes: None,
7617    },
7618    IndicatorParamInfo {
7619        key: "avg_length",
7620        label: "Autocorrelation Length",
7621        kind: IndicatorParamKind::Int,
7622        required: false,
7623        default: Some(ParamValueStatic::Int(3)),
7624        min: Some(0.0),
7625        max: None,
7626        step: Some(1.0),
7627        enum_values: EMPTY_ENUM_VALUES,
7628        notes: None,
7629    },
7630    IndicatorParamInfo {
7631        key: "enhance",
7632        label: "Enhance Resolution",
7633        kind: IndicatorParamKind::Bool,
7634        required: false,
7635        default: Some(ParamValueStatic::Bool(true)),
7636        min: None,
7637        max: None,
7638        step: None,
7639        enum_values: ENUM_VALUES_TRUE_FALSE,
7640        notes: None,
7641    },
7642];
7643
7644const PARAM_KASE_PEAK_OSCILLATOR_WITH_DIVERGENCES: &[IndicatorParamInfo] = &[
7645    IndicatorParamInfo {
7646        key: "deviations",
7647        label: "Deviations",
7648        kind: IndicatorParamKind::Float,
7649        required: false,
7650        default: Some(ParamValueStatic::Float(2.0)),
7651        min: Some(0.0),
7652        max: None,
7653        step: None,
7654        enum_values: EMPTY_ENUM_VALUES,
7655        notes: None,
7656    },
7657    IndicatorParamInfo {
7658        key: "short_cycle",
7659        label: "Short Cycle",
7660        kind: IndicatorParamKind::Int,
7661        required: false,
7662        default: Some(ParamValueStatic::Int(8)),
7663        min: Some(1.0),
7664        max: None,
7665        step: Some(1.0),
7666        enum_values: EMPTY_ENUM_VALUES,
7667        notes: None,
7668    },
7669    IndicatorParamInfo {
7670        key: "long_cycle",
7671        label: "Long Cycle",
7672        kind: IndicatorParamKind::Int,
7673        required: false,
7674        default: Some(ParamValueStatic::Int(65)),
7675        min: Some(2.0),
7676        max: None,
7677        step: Some(1.0),
7678        enum_values: EMPTY_ENUM_VALUES,
7679        notes: None,
7680    },
7681    IndicatorParamInfo {
7682        key: "sensitivity",
7683        label: "Sensitivity",
7684        kind: IndicatorParamKind::Float,
7685        required: false,
7686        default: Some(ParamValueStatic::Float(40.0)),
7687        min: None,
7688        max: None,
7689        step: None,
7690        enum_values: EMPTY_ENUM_VALUES,
7691        notes: None,
7692    },
7693    IndicatorParamInfo {
7694        key: "all_peaks_mode",
7695        label: "All Peaks Mode",
7696        kind: IndicatorParamKind::Bool,
7697        required: false,
7698        default: Some(ParamValueStatic::Bool(true)),
7699        min: None,
7700        max: None,
7701        step: None,
7702        enum_values: ENUM_VALUES_TRUE_FALSE,
7703        notes: None,
7704    },
7705    IndicatorParamInfo {
7706        key: "lb_r",
7707        label: "Pivot Right",
7708        kind: IndicatorParamKind::Int,
7709        required: false,
7710        default: Some(ParamValueStatic::Int(5)),
7711        min: Some(1.0),
7712        max: None,
7713        step: Some(1.0),
7714        enum_values: EMPTY_ENUM_VALUES,
7715        notes: None,
7716    },
7717    IndicatorParamInfo {
7718        key: "lb_l",
7719        label: "Pivot Left",
7720        kind: IndicatorParamKind::Int,
7721        required: false,
7722        default: Some(ParamValueStatic::Int(5)),
7723        min: Some(1.0),
7724        max: None,
7725        step: Some(1.0),
7726        enum_values: EMPTY_ENUM_VALUES,
7727        notes: None,
7728    },
7729    IndicatorParamInfo {
7730        key: "range_upper",
7731        label: "Range Upper",
7732        kind: IndicatorParamKind::Int,
7733        required: false,
7734        default: Some(ParamValueStatic::Int(60)),
7735        min: Some(1.0),
7736        max: None,
7737        step: Some(1.0),
7738        enum_values: EMPTY_ENUM_VALUES,
7739        notes: None,
7740    },
7741    IndicatorParamInfo {
7742        key: "range_lower",
7743        label: "Range Lower",
7744        kind: IndicatorParamKind::Int,
7745        required: false,
7746        default: Some(ParamValueStatic::Int(5)),
7747        min: Some(1.0),
7748        max: None,
7749        step: Some(1.0),
7750        enum_values: EMPTY_ENUM_VALUES,
7751        notes: None,
7752    },
7753    IndicatorParamInfo {
7754        key: "plot_bull",
7755        label: "Plot Bull",
7756        kind: IndicatorParamKind::Bool,
7757        required: false,
7758        default: Some(ParamValueStatic::Bool(true)),
7759        min: None,
7760        max: None,
7761        step: None,
7762        enum_values: ENUM_VALUES_TRUE_FALSE,
7763        notes: None,
7764    },
7765    IndicatorParamInfo {
7766        key: "plot_hidden_bull",
7767        label: "Plot Hidden Bull",
7768        kind: IndicatorParamKind::Bool,
7769        required: false,
7770        default: Some(ParamValueStatic::Bool(false)),
7771        min: None,
7772        max: None,
7773        step: None,
7774        enum_values: ENUM_VALUES_TRUE_FALSE,
7775        notes: None,
7776    },
7777    IndicatorParamInfo {
7778        key: "plot_bear",
7779        label: "Plot Bear",
7780        kind: IndicatorParamKind::Bool,
7781        required: false,
7782        default: Some(ParamValueStatic::Bool(true)),
7783        min: None,
7784        max: None,
7785        step: None,
7786        enum_values: ENUM_VALUES_TRUE_FALSE,
7787        notes: None,
7788    },
7789    IndicatorParamInfo {
7790        key: "plot_hidden_bear",
7791        label: "Plot Hidden Bear",
7792        kind: IndicatorParamKind::Bool,
7793        required: false,
7794        default: Some(ParamValueStatic::Bool(false)),
7795        min: None,
7796        max: None,
7797        step: None,
7798        enum_values: ENUM_VALUES_TRUE_FALSE,
7799        notes: None,
7800    },
7801];
7802
7803const PARAM_INTRADAY_MOMENTUM_INDEX: &[IndicatorParamInfo] = &[
7804    IndicatorParamInfo {
7805        key: "length",
7806        label: "IMI Length",
7807        kind: IndicatorParamKind::Int,
7808        required: false,
7809        default: Some(ParamValueStatic::Int(14)),
7810        min: Some(1.0),
7811        max: None,
7812        step: Some(1.0),
7813        enum_values: EMPTY_ENUM_VALUES,
7814        notes: None,
7815    },
7816    IndicatorParamInfo {
7817        key: "length_ma",
7818        label: "Signal Length",
7819        kind: IndicatorParamKind::Int,
7820        required: false,
7821        default: Some(ParamValueStatic::Int(6)),
7822        min: Some(1.0),
7823        max: None,
7824        step: Some(1.0),
7825        enum_values: EMPTY_ENUM_VALUES,
7826        notes: None,
7827    },
7828    IndicatorParamInfo {
7829        key: "mult",
7830        label: "Band StdDev Mult",
7831        kind: IndicatorParamKind::Float,
7832        required: false,
7833        default: Some(ParamValueStatic::Float(2.0)),
7834        min: Some(0.0),
7835        max: None,
7836        step: None,
7837        enum_values: EMPTY_ENUM_VALUES,
7838        notes: None,
7839    },
7840    IndicatorParamInfo {
7841        key: "length_bb",
7842        label: "Band Length",
7843        kind: IndicatorParamKind::Int,
7844        required: false,
7845        default: Some(ParamValueStatic::Int(20)),
7846        min: Some(1.0),
7847        max: None,
7848        step: Some(1.0),
7849        enum_values: EMPTY_ENUM_VALUES,
7850        notes: None,
7851    },
7852    IndicatorParamInfo {
7853        key: "apply_smoothing",
7854        label: "Apply Smoothing",
7855        kind: IndicatorParamKind::Bool,
7856        required: false,
7857        default: Some(ParamValueStatic::Bool(false)),
7858        min: None,
7859        max: None,
7860        step: None,
7861        enum_values: ENUM_VALUES_TRUE_FALSE,
7862        notes: None,
7863    },
7864    IndicatorParamInfo {
7865        key: "low_band",
7866        label: "Smoothing Lower Band",
7867        kind: IndicatorParamKind::Int,
7868        required: false,
7869        default: Some(ParamValueStatic::Int(10)),
7870        min: Some(1.0),
7871        max: None,
7872        step: Some(1.0),
7873        enum_values: EMPTY_ENUM_VALUES,
7874        notes: None,
7875    },
7876];
7877
7878const PARAM_DEMAND_INDEX: &[IndicatorParamInfo] = &[
7879    IndicatorParamInfo {
7880        key: "len_bs",
7881        label: "Buy/Sell Power Length",
7882        kind: IndicatorParamKind::Int,
7883        required: false,
7884        default: Some(ParamValueStatic::Int(19)),
7885        min: Some(1.0),
7886        max: None,
7887        step: Some(1.0),
7888        enum_values: EMPTY_ENUM_VALUES,
7889        notes: None,
7890    },
7891    IndicatorParamInfo {
7892        key: "len_bs_ma",
7893        label: "Buy/Sell Power MA Length",
7894        kind: IndicatorParamKind::Int,
7895        required: false,
7896        default: Some(ParamValueStatic::Int(19)),
7897        min: Some(1.0),
7898        max: None,
7899        step: Some(1.0),
7900        enum_values: EMPTY_ENUM_VALUES,
7901        notes: None,
7902    },
7903    IndicatorParamInfo {
7904        key: "len_di_ma",
7905        label: "Demand Index SMA Length",
7906        kind: IndicatorParamKind::Int,
7907        required: false,
7908        default: Some(ParamValueStatic::Int(19)),
7909        min: Some(1.0),
7910        max: None,
7911        step: Some(1.0),
7912        enum_values: EMPTY_ENUM_VALUES,
7913        notes: None,
7914    },
7915    IndicatorParamInfo {
7916        key: "ma_type",
7917        label: "MA Type",
7918        kind: IndicatorParamKind::EnumString,
7919        required: false,
7920        default: Some(ParamValueStatic::EnumString("ema")),
7921        min: None,
7922        max: None,
7923        step: None,
7924        enum_values: ENUM_VALUES_DEMAND_INDEX_MA_TYPE,
7925        notes: None,
7926    },
7927];
7928
7929const PARAM_VWAP_ZSCORE_WITH_SIGNALS: &[IndicatorParamInfo] = &[
7930    IndicatorParamInfo {
7931        key: "length",
7932        label: "Length",
7933        kind: IndicatorParamKind::Int,
7934        required: false,
7935        default: Some(ParamValueStatic::Int(20)),
7936        min: Some(1.0),
7937        max: None,
7938        step: Some(1.0),
7939        enum_values: EMPTY_ENUM_VALUES,
7940        notes: None,
7941    },
7942    IndicatorParamInfo {
7943        key: "upper_bottom",
7944        label: "Upper Threshold",
7945        kind: IndicatorParamKind::Float,
7946        required: false,
7947        default: Some(ParamValueStatic::Float(2.5)),
7948        min: None,
7949        max: None,
7950        step: None,
7951        enum_values: EMPTY_ENUM_VALUES,
7952        notes: None,
7953    },
7954    IndicatorParamInfo {
7955        key: "lower_bottom",
7956        label: "Lower Threshold",
7957        kind: IndicatorParamKind::Float,
7958        required: false,
7959        default: Some(ParamValueStatic::Float(-2.5)),
7960        min: None,
7961        max: None,
7962        step: None,
7963        enum_values: EMPTY_ENUM_VALUES,
7964        notes: None,
7965    },
7966];
7967
7968const PARAM_VI: &[IndicatorParamInfo] = &[IndicatorParamInfo {
7969    key: "period",
7970    label: "Period",
7971    kind: IndicatorParamKind::Int,
7972    required: false,
7973    default: Some(ParamValueStatic::Int(14)),
7974    min: Some(1.0),
7975    max: None,
7976    step: Some(1.0),
7977    enum_values: EMPTY_ENUM_VALUES,
7978    notes: None,
7979}];
7980
7981const PARAM_KDJ: &[IndicatorParamInfo] = &[
7982    IndicatorParamInfo {
7983        key: "fast_k_period",
7984        label: "Fast K Period",
7985        kind: IndicatorParamKind::Int,
7986        required: false,
7987        default: Some(ParamValueStatic::Int(9)),
7988        min: Some(1.0),
7989        max: None,
7990        step: Some(1.0),
7991        enum_values: EMPTY_ENUM_VALUES,
7992        notes: None,
7993    },
7994    IndicatorParamInfo {
7995        key: "slow_k_period",
7996        label: "Slow K Period",
7997        kind: IndicatorParamKind::Int,
7998        required: false,
7999        default: Some(ParamValueStatic::Int(3)),
8000        min: Some(1.0),
8001        max: None,
8002        step: Some(1.0),
8003        enum_values: EMPTY_ENUM_VALUES,
8004        notes: None,
8005    },
8006    IndicatorParamInfo {
8007        key: "slow_k_ma_type",
8008        label: "Slow K MA Type",
8009        kind: IndicatorParamKind::EnumString,
8010        required: false,
8011        default: Some(ParamValueStatic::EnumString("sma")),
8012        min: None,
8013        max: None,
8014        step: None,
8015        enum_values: EMPTY_ENUM_VALUES,
8016        notes: None,
8017    },
8018    IndicatorParamInfo {
8019        key: "slow_d_period",
8020        label: "Slow D Period",
8021        kind: IndicatorParamKind::Int,
8022        required: false,
8023        default: Some(ParamValueStatic::Int(3)),
8024        min: Some(1.0),
8025        max: None,
8026        step: Some(1.0),
8027        enum_values: EMPTY_ENUM_VALUES,
8028        notes: None,
8029    },
8030    IndicatorParamInfo {
8031        key: "slow_d_ma_type",
8032        label: "Slow D MA Type",
8033        kind: IndicatorParamKind::EnumString,
8034        required: false,
8035        default: Some(ParamValueStatic::EnumString("sma")),
8036        min: None,
8037        max: None,
8038        step: None,
8039        enum_values: EMPTY_ENUM_VALUES,
8040        notes: None,
8041    },
8042];
8043
8044const PARAM_ACOSC: &[IndicatorParamInfo] = PARAM_NONE;
8045
8046const PARAM_ALLIGATOR: &[IndicatorParamInfo] = &[
8047    IndicatorParamInfo {
8048        key: "jaw_period",
8049        label: "Jaw Period",
8050        kind: IndicatorParamKind::Int,
8051        required: false,
8052        default: Some(ParamValueStatic::Int(13)),
8053        min: Some(1.0),
8054        max: None,
8055        step: Some(1.0),
8056        enum_values: EMPTY_ENUM_VALUES,
8057        notes: None,
8058    },
8059    IndicatorParamInfo {
8060        key: "jaw_offset",
8061        label: "Jaw Offset",
8062        kind: IndicatorParamKind::Int,
8063        required: false,
8064        default: Some(ParamValueStatic::Int(8)),
8065        min: Some(0.0),
8066        max: None,
8067        step: Some(1.0),
8068        enum_values: EMPTY_ENUM_VALUES,
8069        notes: None,
8070    },
8071    IndicatorParamInfo {
8072        key: "teeth_period",
8073        label: "Teeth Period",
8074        kind: IndicatorParamKind::Int,
8075        required: false,
8076        default: Some(ParamValueStatic::Int(8)),
8077        min: Some(1.0),
8078        max: None,
8079        step: Some(1.0),
8080        enum_values: EMPTY_ENUM_VALUES,
8081        notes: None,
8082    },
8083    IndicatorParamInfo {
8084        key: "teeth_offset",
8085        label: "Teeth Offset",
8086        kind: IndicatorParamKind::Int,
8087        required: false,
8088        default: Some(ParamValueStatic::Int(5)),
8089        min: Some(0.0),
8090        max: None,
8091        step: Some(1.0),
8092        enum_values: EMPTY_ENUM_VALUES,
8093        notes: None,
8094    },
8095    IndicatorParamInfo {
8096        key: "lips_period",
8097        label: "Lips Period",
8098        kind: IndicatorParamKind::Int,
8099        required: false,
8100        default: Some(ParamValueStatic::Int(5)),
8101        min: Some(1.0),
8102        max: None,
8103        step: Some(1.0),
8104        enum_values: EMPTY_ENUM_VALUES,
8105        notes: None,
8106    },
8107    IndicatorParamInfo {
8108        key: "lips_offset",
8109        label: "Lips Offset",
8110        kind: IndicatorParamKind::Int,
8111        required: false,
8112        default: Some(ParamValueStatic::Int(3)),
8113        min: Some(0.0),
8114        max: None,
8115        step: Some(1.0),
8116        enum_values: EMPTY_ENUM_VALUES,
8117        notes: None,
8118    },
8119];
8120
8121const PARAM_ALPHATREND: &[IndicatorParamInfo] = &[
8122    IndicatorParamInfo {
8123        key: "coeff",
8124        label: "Coeff",
8125        kind: IndicatorParamKind::Float,
8126        required: false,
8127        default: Some(ParamValueStatic::Float(1.0)),
8128        min: Some(0.0),
8129        max: None,
8130        step: None,
8131        enum_values: EMPTY_ENUM_VALUES,
8132        notes: None,
8133    },
8134    IndicatorParamInfo {
8135        key: "period",
8136        label: "Period",
8137        kind: IndicatorParamKind::Int,
8138        required: false,
8139        default: Some(ParamValueStatic::Int(14)),
8140        min: Some(1.0),
8141        max: None,
8142        step: Some(1.0),
8143        enum_values: EMPTY_ENUM_VALUES,
8144        notes: None,
8145    },
8146    IndicatorParamInfo {
8147        key: "no_volume",
8148        label: "No Volume",
8149        kind: IndicatorParamKind::Bool,
8150        required: false,
8151        default: Some(ParamValueStatic::Bool(false)),
8152        min: None,
8153        max: None,
8154        step: None,
8155        enum_values: ENUM_VALUES_TRUE_FALSE,
8156        notes: None,
8157    },
8158];
8159
8160const PARAM_ASO: &[IndicatorParamInfo] = &[
8161    IndicatorParamInfo {
8162        key: "period",
8163        label: "Period",
8164        kind: IndicatorParamKind::Int,
8165        required: false,
8166        default: Some(ParamValueStatic::Int(10)),
8167        min: Some(1.0),
8168        max: None,
8169        step: Some(1.0),
8170        enum_values: EMPTY_ENUM_VALUES,
8171        notes: None,
8172    },
8173    IndicatorParamInfo {
8174        key: "mode",
8175        label: "Mode",
8176        kind: IndicatorParamKind::Int,
8177        required: false,
8178        default: Some(ParamValueStatic::Int(0)),
8179        min: Some(0.0),
8180        max: None,
8181        step: Some(1.0),
8182        enum_values: EMPTY_ENUM_VALUES,
8183        notes: None,
8184    },
8185];
8186
8187const PARAM_AVSL: &[IndicatorParamInfo] = &[
8188    IndicatorParamInfo {
8189        key: "fast_period",
8190        label: "Fast Period",
8191        kind: IndicatorParamKind::Int,
8192        required: false,
8193        default: Some(ParamValueStatic::Int(12)),
8194        min: Some(1.0),
8195        max: None,
8196        step: Some(1.0),
8197        enum_values: EMPTY_ENUM_VALUES,
8198        notes: None,
8199    },
8200    IndicatorParamInfo {
8201        key: "slow_period",
8202        label: "Slow Period",
8203        kind: IndicatorParamKind::Int,
8204        required: false,
8205        default: Some(ParamValueStatic::Int(26)),
8206        min: Some(1.0),
8207        max: None,
8208        step: Some(1.0),
8209        enum_values: EMPTY_ENUM_VALUES,
8210        notes: None,
8211    },
8212    IndicatorParamInfo {
8213        key: "multiplier",
8214        label: "Multiplier",
8215        kind: IndicatorParamKind::Float,
8216        required: false,
8217        default: Some(ParamValueStatic::Float(2.0)),
8218        min: Some(0.0),
8219        max: None,
8220        step: Some(0.1),
8221        enum_values: EMPTY_ENUM_VALUES,
8222        notes: None,
8223    },
8224];
8225
8226const PARAM_BANDPASS: &[IndicatorParamInfo] = &[
8227    IndicatorParamInfo {
8228        key: "period",
8229        label: "Period",
8230        kind: IndicatorParamKind::Int,
8231        required: false,
8232        default: Some(ParamValueStatic::Int(20)),
8233        min: Some(1.0),
8234        max: None,
8235        step: Some(1.0),
8236        enum_values: EMPTY_ENUM_VALUES,
8237        notes: None,
8238    },
8239    IndicatorParamInfo {
8240        key: "bandwidth",
8241        label: "Bandwidth",
8242        kind: IndicatorParamKind::Float,
8243        required: false,
8244        default: Some(ParamValueStatic::Float(0.3)),
8245        min: Some(0.0),
8246        max: None,
8247        step: None,
8248        enum_values: EMPTY_ENUM_VALUES,
8249        notes: None,
8250    },
8251];
8252
8253const PARAM_CHANDE: &[IndicatorParamInfo] = &[
8254    IndicatorParamInfo {
8255        key: "period",
8256        label: "Period",
8257        kind: IndicatorParamKind::Int,
8258        required: false,
8259        default: Some(ParamValueStatic::Int(22)),
8260        min: Some(1.0),
8261        max: None,
8262        step: Some(1.0),
8263        enum_values: EMPTY_ENUM_VALUES,
8264        notes: None,
8265    },
8266    IndicatorParamInfo {
8267        key: "mult",
8268        label: "Multiplier",
8269        kind: IndicatorParamKind::Float,
8270        required: false,
8271        default: Some(ParamValueStatic::Float(3.0)),
8272        min: Some(0.0),
8273        max: None,
8274        step: Some(0.1),
8275        enum_values: EMPTY_ENUM_VALUES,
8276        notes: None,
8277    },
8278    IndicatorParamInfo {
8279        key: "direction",
8280        label: "Direction",
8281        kind: IndicatorParamKind::EnumString,
8282        required: false,
8283        default: Some(ParamValueStatic::EnumString("long")),
8284        min: None,
8285        max: None,
8286        step: None,
8287        enum_values: &["long", "short"],
8288        notes: None,
8289    },
8290];
8291
8292const PARAM_CHANDELIER_EXIT: &[IndicatorParamInfo] = &[
8293    IndicatorParamInfo {
8294        key: "period",
8295        label: "Period",
8296        kind: IndicatorParamKind::Int,
8297        required: false,
8298        default: Some(ParamValueStatic::Int(22)),
8299        min: Some(1.0),
8300        max: None,
8301        step: Some(1.0),
8302        enum_values: EMPTY_ENUM_VALUES,
8303        notes: None,
8304    },
8305    IndicatorParamInfo {
8306        key: "mult",
8307        label: "Multiplier",
8308        kind: IndicatorParamKind::Float,
8309        required: false,
8310        default: Some(ParamValueStatic::Float(3.0)),
8311        min: Some(0.0),
8312        max: None,
8313        step: None,
8314        enum_values: EMPTY_ENUM_VALUES,
8315        notes: None,
8316    },
8317    IndicatorParamInfo {
8318        key: "use_close",
8319        label: "Use Close",
8320        kind: IndicatorParamKind::Bool,
8321        required: false,
8322        default: Some(ParamValueStatic::Bool(true)),
8323        min: None,
8324        max: None,
8325        step: None,
8326        enum_values: ENUM_VALUES_TRUE_FALSE,
8327        notes: None,
8328    },
8329];
8330
8331const PARAM_CKSP: &[IndicatorParamInfo] = &[
8332    IndicatorParamInfo {
8333        key: "p",
8334        label: "P",
8335        kind: IndicatorParamKind::Int,
8336        required: false,
8337        default: Some(ParamValueStatic::Int(10)),
8338        min: Some(1.0),
8339        max: None,
8340        step: Some(1.0),
8341        enum_values: EMPTY_ENUM_VALUES,
8342        notes: None,
8343    },
8344    IndicatorParamInfo {
8345        key: "x",
8346        label: "X",
8347        kind: IndicatorParamKind::Float,
8348        required: false,
8349        default: Some(ParamValueStatic::Float(1.0)),
8350        min: Some(0.0),
8351        max: None,
8352        step: None,
8353        enum_values: EMPTY_ENUM_VALUES,
8354        notes: None,
8355    },
8356    IndicatorParamInfo {
8357        key: "q",
8358        label: "Q",
8359        kind: IndicatorParamKind::Int,
8360        required: false,
8361        default: Some(ParamValueStatic::Int(9)),
8362        min: Some(1.0),
8363        max: None,
8364        step: Some(1.0),
8365        enum_values: EMPTY_ENUM_VALUES,
8366        notes: None,
8367    },
8368];
8369
8370const PARAM_CORRELATION_CYCLE: &[IndicatorParamInfo] = &[
8371    IndicatorParamInfo {
8372        key: "period",
8373        label: "Period",
8374        kind: IndicatorParamKind::Int,
8375        required: false,
8376        default: Some(ParamValueStatic::Int(20)),
8377        min: Some(1.0),
8378        max: None,
8379        step: Some(1.0),
8380        enum_values: EMPTY_ENUM_VALUES,
8381        notes: None,
8382    },
8383    IndicatorParamInfo {
8384        key: "threshold",
8385        label: "Threshold",
8386        kind: IndicatorParamKind::Float,
8387        required: false,
8388        default: Some(ParamValueStatic::Float(9.0)),
8389        min: None,
8390        max: None,
8391        step: None,
8392        enum_values: EMPTY_ENUM_VALUES,
8393        notes: None,
8394    },
8395];
8396
8397const PARAM_CORREL_HL: &[IndicatorParamInfo] = &[IndicatorParamInfo {
8398    key: "period",
8399    label: "Period",
8400    kind: IndicatorParamKind::Int,
8401    required: false,
8402    default: Some(ParamValueStatic::Int(9)),
8403    min: Some(1.0),
8404    max: None,
8405    step: Some(1.0),
8406    enum_values: EMPTY_ENUM_VALUES,
8407    notes: None,
8408}];
8409
8410const PARAM_DAMIANI_VOLATMETER: &[IndicatorParamInfo] = &[
8411    IndicatorParamInfo {
8412        key: "vis_atr",
8413        label: "Vis ATR",
8414        kind: IndicatorParamKind::Int,
8415        required: false,
8416        default: Some(ParamValueStatic::Int(13)),
8417        min: Some(1.0),
8418        max: None,
8419        step: Some(1.0),
8420        enum_values: EMPTY_ENUM_VALUES,
8421        notes: None,
8422    },
8423    IndicatorParamInfo {
8424        key: "vis_std",
8425        label: "Vis STD",
8426        kind: IndicatorParamKind::Int,
8427        required: false,
8428        default: Some(ParamValueStatic::Int(20)),
8429        min: Some(1.0),
8430        max: None,
8431        step: Some(1.0),
8432        enum_values: EMPTY_ENUM_VALUES,
8433        notes: None,
8434    },
8435    IndicatorParamInfo {
8436        key: "sed_atr",
8437        label: "Sed ATR",
8438        kind: IndicatorParamKind::Int,
8439        required: false,
8440        default: Some(ParamValueStatic::Int(40)),
8441        min: Some(1.0),
8442        max: None,
8443        step: Some(1.0),
8444        enum_values: EMPTY_ENUM_VALUES,
8445        notes: None,
8446    },
8447    IndicatorParamInfo {
8448        key: "sed_std",
8449        label: "Sed STD",
8450        kind: IndicatorParamKind::Int,
8451        required: false,
8452        default: Some(ParamValueStatic::Int(100)),
8453        min: Some(1.0),
8454        max: None,
8455        step: Some(1.0),
8456        enum_values: EMPTY_ENUM_VALUES,
8457        notes: None,
8458    },
8459    IndicatorParamInfo {
8460        key: "threshold",
8461        label: "Threshold",
8462        kind: IndicatorParamKind::Float,
8463        required: false,
8464        default: Some(ParamValueStatic::Float(1.4)),
8465        min: None,
8466        max: None,
8467        step: None,
8468        enum_values: EMPTY_ENUM_VALUES,
8469        notes: None,
8470    },
8471];
8472
8473const PARAM_DVDIQQE: &[IndicatorParamInfo] = &[
8474    IndicatorParamInfo {
8475        key: "period",
8476        label: "Period",
8477        kind: IndicatorParamKind::Int,
8478        required: false,
8479        default: Some(ParamValueStatic::Int(13)),
8480        min: Some(1.0),
8481        max: None,
8482        step: Some(1.0),
8483        enum_values: EMPTY_ENUM_VALUES,
8484        notes: None,
8485    },
8486    IndicatorParamInfo {
8487        key: "smoothing_period",
8488        label: "Smoothing Period",
8489        kind: IndicatorParamKind::Int,
8490        required: false,
8491        default: Some(ParamValueStatic::Int(6)),
8492        min: Some(1.0),
8493        max: None,
8494        step: Some(1.0),
8495        enum_values: EMPTY_ENUM_VALUES,
8496        notes: None,
8497    },
8498    IndicatorParamInfo {
8499        key: "fast_multiplier",
8500        label: "Fast Multiplier",
8501        kind: IndicatorParamKind::Float,
8502        required: false,
8503        default: Some(ParamValueStatic::Float(2.618)),
8504        min: Some(0.0),
8505        max: None,
8506        step: None,
8507        enum_values: EMPTY_ENUM_VALUES,
8508        notes: None,
8509    },
8510    IndicatorParamInfo {
8511        key: "slow_multiplier",
8512        label: "Slow Multiplier",
8513        kind: IndicatorParamKind::Float,
8514        required: false,
8515        default: Some(ParamValueStatic::Float(4.236)),
8516        min: Some(0.0),
8517        max: None,
8518        step: None,
8519        enum_values: EMPTY_ENUM_VALUES,
8520        notes: None,
8521    },
8522    IndicatorParamInfo {
8523        key: "volume_type",
8524        label: "Volume Type",
8525        kind: IndicatorParamKind::EnumString,
8526        required: false,
8527        default: Some(ParamValueStatic::EnumString("default")),
8528        min: None,
8529        max: None,
8530        step: None,
8531        enum_values: EMPTY_ENUM_VALUES,
8532        notes: None,
8533    },
8534    IndicatorParamInfo {
8535        key: "center_type",
8536        label: "Center Type",
8537        kind: IndicatorParamKind::EnumString,
8538        required: false,
8539        default: Some(ParamValueStatic::EnumString("dynamic")),
8540        min: None,
8541        max: None,
8542        step: None,
8543        enum_values: EMPTY_ENUM_VALUES,
8544        notes: None,
8545    },
8546    IndicatorParamInfo {
8547        key: "tick_size",
8548        label: "Tick Size",
8549        kind: IndicatorParamKind::Float,
8550        required: false,
8551        default: Some(ParamValueStatic::Float(0.01)),
8552        min: Some(0.0),
8553        max: None,
8554        step: None,
8555        enum_values: EMPTY_ENUM_VALUES,
8556        notes: None,
8557    },
8558];
8559
8560const PARAM_EMD: &[IndicatorParamInfo] = &[
8561    IndicatorParamInfo {
8562        key: "period",
8563        label: "Period",
8564        kind: IndicatorParamKind::Int,
8565        required: false,
8566        default: Some(ParamValueStatic::Int(20)),
8567        min: Some(1.0),
8568        max: None,
8569        step: Some(1.0),
8570        enum_values: EMPTY_ENUM_VALUES,
8571        notes: None,
8572    },
8573    IndicatorParamInfo {
8574        key: "delta",
8575        label: "Delta",
8576        kind: IndicatorParamKind::Float,
8577        required: false,
8578        default: Some(ParamValueStatic::Float(0.5)),
8579        min: Some(0.0),
8580        max: None,
8581        step: None,
8582        enum_values: EMPTY_ENUM_VALUES,
8583        notes: None,
8584    },
8585    IndicatorParamInfo {
8586        key: "fraction",
8587        label: "Fraction",
8588        kind: IndicatorParamKind::Float,
8589        required: false,
8590        default: Some(ParamValueStatic::Float(0.1)),
8591        min: Some(0.0),
8592        max: None,
8593        step: None,
8594        enum_values: EMPTY_ENUM_VALUES,
8595        notes: None,
8596    },
8597];
8598
8599const PARAM_ERI: &[IndicatorParamInfo] = &[
8600    IndicatorParamInfo {
8601        key: "period",
8602        label: "Period",
8603        kind: IndicatorParamKind::Int,
8604        required: false,
8605        default: Some(ParamValueStatic::Int(13)),
8606        min: Some(1.0),
8607        max: None,
8608        step: Some(1.0),
8609        enum_values: EMPTY_ENUM_VALUES,
8610        notes: None,
8611    },
8612    IndicatorParamInfo {
8613        key: "ma_type",
8614        label: "MA Type",
8615        kind: IndicatorParamKind::EnumString,
8616        required: false,
8617        default: Some(ParamValueStatic::EnumString("ema")),
8618        min: None,
8619        max: None,
8620        step: None,
8621        enum_values: EMPTY_ENUM_VALUES,
8622        notes: None,
8623    },
8624];
8625
8626const PARAM_FISHER: &[IndicatorParamInfo] = &[IndicatorParamInfo {
8627    key: "period",
8628    label: "Period",
8629    kind: IndicatorParamKind::Int,
8630    required: false,
8631    default: Some(ParamValueStatic::Int(9)),
8632    min: Some(1.0),
8633    max: None,
8634    step: Some(1.0),
8635    enum_values: EMPTY_ENUM_VALUES,
8636    notes: None,
8637}];
8638
8639const PARAM_FVG_TRAILING_STOP: &[IndicatorParamInfo] = &[
8640    IndicatorParamInfo {
8641        key: "unmitigated_fvg_lookback",
8642        label: "FVG Lookback",
8643        kind: IndicatorParamKind::Int,
8644        required: false,
8645        default: Some(ParamValueStatic::Int(5)),
8646        min: Some(1.0),
8647        max: None,
8648        step: Some(1.0),
8649        enum_values: EMPTY_ENUM_VALUES,
8650        notes: None,
8651    },
8652    IndicatorParamInfo {
8653        key: "smoothing_length",
8654        label: "Smoothing Length",
8655        kind: IndicatorParamKind::Int,
8656        required: false,
8657        default: Some(ParamValueStatic::Int(9)),
8658        min: Some(1.0),
8659        max: None,
8660        step: Some(1.0),
8661        enum_values: EMPTY_ENUM_VALUES,
8662        notes: None,
8663    },
8664    IndicatorParamInfo {
8665        key: "reset_on_cross",
8666        label: "Reset On Cross",
8667        kind: IndicatorParamKind::Bool,
8668        required: false,
8669        default: Some(ParamValueStatic::Bool(false)),
8670        min: None,
8671        max: None,
8672        step: None,
8673        enum_values: ENUM_VALUES_TRUE_FALSE,
8674        notes: None,
8675    },
8676];
8677
8678const PARAM_GATOROSC: &[IndicatorParamInfo] = &[
8679    IndicatorParamInfo {
8680        key: "jaws_length",
8681        label: "Jaws Length",
8682        kind: IndicatorParamKind::Int,
8683        required: false,
8684        default: Some(ParamValueStatic::Int(13)),
8685        min: Some(1.0),
8686        max: None,
8687        step: Some(1.0),
8688        enum_values: EMPTY_ENUM_VALUES,
8689        notes: None,
8690    },
8691    IndicatorParamInfo {
8692        key: "jaws_shift",
8693        label: "Jaws Shift",
8694        kind: IndicatorParamKind::Int,
8695        required: false,
8696        default: Some(ParamValueStatic::Int(8)),
8697        min: Some(0.0),
8698        max: None,
8699        step: Some(1.0),
8700        enum_values: EMPTY_ENUM_VALUES,
8701        notes: None,
8702    },
8703    IndicatorParamInfo {
8704        key: "teeth_length",
8705        label: "Teeth Length",
8706        kind: IndicatorParamKind::Int,
8707        required: false,
8708        default: Some(ParamValueStatic::Int(8)),
8709        min: Some(1.0),
8710        max: None,
8711        step: Some(1.0),
8712        enum_values: EMPTY_ENUM_VALUES,
8713        notes: None,
8714    },
8715    IndicatorParamInfo {
8716        key: "teeth_shift",
8717        label: "Teeth Shift",
8718        kind: IndicatorParamKind::Int,
8719        required: false,
8720        default: Some(ParamValueStatic::Int(5)),
8721        min: Some(0.0),
8722        max: None,
8723        step: Some(1.0),
8724        enum_values: EMPTY_ENUM_VALUES,
8725        notes: None,
8726    },
8727    IndicatorParamInfo {
8728        key: "lips_length",
8729        label: "Lips Length",
8730        kind: IndicatorParamKind::Int,
8731        required: false,
8732        default: Some(ParamValueStatic::Int(5)),
8733        min: Some(1.0),
8734        max: None,
8735        step: Some(1.0),
8736        enum_values: EMPTY_ENUM_VALUES,
8737        notes: None,
8738    },
8739    IndicatorParamInfo {
8740        key: "lips_shift",
8741        label: "Lips Shift",
8742        kind: IndicatorParamKind::Int,
8743        required: false,
8744        default: Some(ParamValueStatic::Int(3)),
8745        min: Some(0.0),
8746        max: None,
8747        step: Some(1.0),
8748        enum_values: EMPTY_ENUM_VALUES,
8749        notes: None,
8750    },
8751];
8752
8753const PARAM_HALFTREND: &[IndicatorParamInfo] = &[
8754    IndicatorParamInfo {
8755        key: "amplitude",
8756        label: "Amplitude",
8757        kind: IndicatorParamKind::Int,
8758        required: false,
8759        default: Some(ParamValueStatic::Int(2)),
8760        min: Some(1.0),
8761        max: None,
8762        step: Some(1.0),
8763        enum_values: EMPTY_ENUM_VALUES,
8764        notes: None,
8765    },
8766    IndicatorParamInfo {
8767        key: "channel_deviation",
8768        label: "Channel Deviation",
8769        kind: IndicatorParamKind::Float,
8770        required: false,
8771        default: Some(ParamValueStatic::Float(2.0)),
8772        min: Some(0.0),
8773        max: None,
8774        step: None,
8775        enum_values: EMPTY_ENUM_VALUES,
8776        notes: None,
8777    },
8778    IndicatorParamInfo {
8779        key: "atr_period",
8780        label: "ATR Period",
8781        kind: IndicatorParamKind::Int,
8782        required: false,
8783        default: Some(ParamValueStatic::Int(100)),
8784        min: Some(1.0),
8785        max: None,
8786        step: Some(1.0),
8787        enum_values: EMPTY_ENUM_VALUES,
8788        notes: None,
8789    },
8790];
8791
8792const PARAM_SAFEZONESTOP: &[IndicatorParamInfo] = &[
8793    IndicatorParamInfo {
8794        key: "period",
8795        label: "Period",
8796        kind: IndicatorParamKind::Int,
8797        required: false,
8798        default: Some(ParamValueStatic::Int(22)),
8799        min: Some(1.0),
8800        max: None,
8801        step: Some(1.0),
8802        enum_values: EMPTY_ENUM_VALUES,
8803        notes: None,
8804    },
8805    IndicatorParamInfo {
8806        key: "mult",
8807        label: "Multiplier",
8808        kind: IndicatorParamKind::Float,
8809        required: false,
8810        default: Some(ParamValueStatic::Float(2.5)),
8811        min: Some(0.0),
8812        max: None,
8813        step: None,
8814        enum_values: EMPTY_ENUM_VALUES,
8815        notes: None,
8816    },
8817    IndicatorParamInfo {
8818        key: "max_lookback",
8819        label: "Max Lookback",
8820        kind: IndicatorParamKind::Int,
8821        required: false,
8822        default: Some(ParamValueStatic::Int(3)),
8823        min: Some(1.0),
8824        max: None,
8825        step: Some(1.0),
8826        enum_values: EMPTY_ENUM_VALUES,
8827        notes: None,
8828    },
8829    IndicatorParamInfo {
8830        key: "direction",
8831        label: "Direction",
8832        kind: IndicatorParamKind::EnumString,
8833        required: false,
8834        default: Some(ParamValueStatic::EnumString("long")),
8835        min: None,
8836        max: None,
8837        step: None,
8838        enum_values: EMPTY_ENUM_VALUES,
8839        notes: None,
8840    },
8841];
8842
8843const PARAM_DEVSTOP: &[IndicatorParamInfo] = &[
8844    IndicatorParamInfo {
8845        key: "period",
8846        label: "Period",
8847        kind: IndicatorParamKind::Int,
8848        required: false,
8849        default: Some(ParamValueStatic::Int(20)),
8850        min: Some(1.0),
8851        max: None,
8852        step: Some(1.0),
8853        enum_values: EMPTY_ENUM_VALUES,
8854        notes: None,
8855    },
8856    IndicatorParamInfo {
8857        key: "mult",
8858        label: "Multiplier",
8859        kind: IndicatorParamKind::Float,
8860        required: false,
8861        default: Some(ParamValueStatic::Float(0.0)),
8862        min: Some(0.0),
8863        max: None,
8864        step: None,
8865        enum_values: EMPTY_ENUM_VALUES,
8866        notes: None,
8867    },
8868    IndicatorParamInfo {
8869        key: "devtype",
8870        label: "Dev Type",
8871        kind: IndicatorParamKind::Int,
8872        required: false,
8873        default: Some(ParamValueStatic::Int(0)),
8874        min: Some(0.0),
8875        max: None,
8876        step: Some(1.0),
8877        enum_values: EMPTY_ENUM_VALUES,
8878        notes: None,
8879    },
8880    IndicatorParamInfo {
8881        key: "direction",
8882        label: "Direction",
8883        kind: IndicatorParamKind::EnumString,
8884        required: false,
8885        default: Some(ParamValueStatic::EnumString("long")),
8886        min: None,
8887        max: None,
8888        step: None,
8889        enum_values: EMPTY_ENUM_VALUES,
8890        notes: None,
8891    },
8892    IndicatorParamInfo {
8893        key: "ma_type",
8894        label: "MA Type",
8895        kind: IndicatorParamKind::EnumString,
8896        required: false,
8897        default: Some(ParamValueStatic::EnumString("sma")),
8898        min: None,
8899        max: None,
8900        step: None,
8901        enum_values: EMPTY_ENUM_VALUES,
8902        notes: None,
8903    },
8904];
8905
8906const PARAM_MOD_GOD_MODE: &[IndicatorParamInfo] = &[
8907    IndicatorParamInfo {
8908        key: "n1",
8909        label: "N1",
8910        kind: IndicatorParamKind::Int,
8911        required: false,
8912        default: Some(ParamValueStatic::Int(17)),
8913        min: Some(1.0),
8914        max: None,
8915        step: Some(1.0),
8916        enum_values: EMPTY_ENUM_VALUES,
8917        notes: None,
8918    },
8919    IndicatorParamInfo {
8920        key: "n2",
8921        label: "N2",
8922        kind: IndicatorParamKind::Int,
8923        required: false,
8924        default: Some(ParamValueStatic::Int(6)),
8925        min: Some(1.0),
8926        max: None,
8927        step: Some(1.0),
8928        enum_values: EMPTY_ENUM_VALUES,
8929        notes: None,
8930    },
8931    IndicatorParamInfo {
8932        key: "n3",
8933        label: "N3",
8934        kind: IndicatorParamKind::Int,
8935        required: false,
8936        default: Some(ParamValueStatic::Int(4)),
8937        min: Some(1.0),
8938        max: None,
8939        step: Some(1.0),
8940        enum_values: EMPTY_ENUM_VALUES,
8941        notes: None,
8942    },
8943    IndicatorParamInfo {
8944        key: "mode",
8945        label: "Mode",
8946        kind: IndicatorParamKind::EnumString,
8947        required: false,
8948        default: Some(ParamValueStatic::EnumString("tradition_mg")),
8949        min: None,
8950        max: None,
8951        step: None,
8952        enum_values: EMPTY_ENUM_VALUES,
8953        notes: None,
8954    },
8955    IndicatorParamInfo {
8956        key: "use_volume",
8957        label: "Use Volume",
8958        kind: IndicatorParamKind::Bool,
8959        required: false,
8960        default: Some(ParamValueStatic::Bool(true)),
8961        min: None,
8962        max: None,
8963        step: None,
8964        enum_values: ENUM_VALUES_TRUE_FALSE,
8965        notes: None,
8966    },
8967];
8968
8969const PARAM_HEMA_TREND_LEVELS: &[IndicatorParamInfo] = &[
8970    IndicatorParamInfo {
8971        key: "fast_length",
8972        label: "Fast Length",
8973        kind: IndicatorParamKind::Int,
8974        required: false,
8975        default: Some(ParamValueStatic::Int(20)),
8976        min: Some(1.0),
8977        max: None,
8978        step: Some(1.0),
8979        enum_values: EMPTY_ENUM_VALUES,
8980        notes: None,
8981    },
8982    IndicatorParamInfo {
8983        key: "slow_length",
8984        label: "Slow Length",
8985        kind: IndicatorParamKind::Int,
8986        required: false,
8987        default: Some(ParamValueStatic::Int(40)),
8988        min: Some(1.0),
8989        max: None,
8990        step: Some(1.0),
8991        enum_values: EMPTY_ENUM_VALUES,
8992        notes: None,
8993    },
8994];
8995
8996const PARAM_KST: &[IndicatorParamInfo] = &[
8997    IndicatorParamInfo {
8998        key: "sma_period1",
8999        label: "SMA 1",
9000        kind: IndicatorParamKind::Int,
9001        required: false,
9002        default: Some(ParamValueStatic::Int(10)),
9003        min: Some(1.0),
9004        max: None,
9005        step: Some(1.0),
9006        enum_values: EMPTY_ENUM_VALUES,
9007        notes: None,
9008    },
9009    IndicatorParamInfo {
9010        key: "sma_period2",
9011        label: "SMA 2",
9012        kind: IndicatorParamKind::Int,
9013        required: false,
9014        default: Some(ParamValueStatic::Int(10)),
9015        min: Some(1.0),
9016        max: None,
9017        step: Some(1.0),
9018        enum_values: EMPTY_ENUM_VALUES,
9019        notes: None,
9020    },
9021    IndicatorParamInfo {
9022        key: "sma_period3",
9023        label: "SMA 3",
9024        kind: IndicatorParamKind::Int,
9025        required: false,
9026        default: Some(ParamValueStatic::Int(10)),
9027        min: Some(1.0),
9028        max: None,
9029        step: Some(1.0),
9030        enum_values: EMPTY_ENUM_VALUES,
9031        notes: None,
9032    },
9033    IndicatorParamInfo {
9034        key: "sma_period4",
9035        label: "SMA 4",
9036        kind: IndicatorParamKind::Int,
9037        required: false,
9038        default: Some(ParamValueStatic::Int(15)),
9039        min: Some(1.0),
9040        max: None,
9041        step: Some(1.0),
9042        enum_values: EMPTY_ENUM_VALUES,
9043        notes: None,
9044    },
9045    IndicatorParamInfo {
9046        key: "roc_period1",
9047        label: "ROC 1",
9048        kind: IndicatorParamKind::Int,
9049        required: false,
9050        default: Some(ParamValueStatic::Int(10)),
9051        min: Some(1.0),
9052        max: None,
9053        step: Some(1.0),
9054        enum_values: EMPTY_ENUM_VALUES,
9055        notes: None,
9056    },
9057    IndicatorParamInfo {
9058        key: "roc_period2",
9059        label: "ROC 2",
9060        kind: IndicatorParamKind::Int,
9061        required: false,
9062        default: Some(ParamValueStatic::Int(15)),
9063        min: Some(1.0),
9064        max: None,
9065        step: Some(1.0),
9066        enum_values: EMPTY_ENUM_VALUES,
9067        notes: None,
9068    },
9069    IndicatorParamInfo {
9070        key: "roc_period3",
9071        label: "ROC 3",
9072        kind: IndicatorParamKind::Int,
9073        required: false,
9074        default: Some(ParamValueStatic::Int(20)),
9075        min: Some(1.0),
9076        max: None,
9077        step: Some(1.0),
9078        enum_values: EMPTY_ENUM_VALUES,
9079        notes: None,
9080    },
9081    IndicatorParamInfo {
9082        key: "roc_period4",
9083        label: "ROC 4",
9084        kind: IndicatorParamKind::Int,
9085        required: false,
9086        default: Some(ParamValueStatic::Int(30)),
9087        min: Some(1.0),
9088        max: None,
9089        step: Some(1.0),
9090        enum_values: EMPTY_ENUM_VALUES,
9091        notes: None,
9092    },
9093    IndicatorParamInfo {
9094        key: "signal_period",
9095        label: "Signal Period",
9096        kind: IndicatorParamKind::Int,
9097        required: false,
9098        default: Some(ParamValueStatic::Int(9)),
9099        min: Some(1.0),
9100        max: None,
9101        step: Some(1.0),
9102        enum_values: EMPTY_ENUM_VALUES,
9103        notes: None,
9104    },
9105];
9106
9107const PARAM_KAUFMANSTOP: &[IndicatorParamInfo] = &[
9108    IndicatorParamInfo {
9109        key: "period",
9110        label: "Period",
9111        kind: IndicatorParamKind::Int,
9112        required: false,
9113        default: Some(ParamValueStatic::Int(22)),
9114        min: Some(1.0),
9115        max: None,
9116        step: Some(1.0),
9117        enum_values: EMPTY_ENUM_VALUES,
9118        notes: None,
9119    },
9120    IndicatorParamInfo {
9121        key: "mult",
9122        label: "Multiplier",
9123        kind: IndicatorParamKind::Float,
9124        required: false,
9125        default: Some(ParamValueStatic::Float(2.0)),
9126        min: Some(0.0),
9127        max: None,
9128        step: None,
9129        enum_values: EMPTY_ENUM_VALUES,
9130        notes: None,
9131    },
9132    IndicatorParamInfo {
9133        key: "direction",
9134        label: "Direction",
9135        kind: IndicatorParamKind::EnumString,
9136        required: false,
9137        default: Some(ParamValueStatic::EnumString("long")),
9138        min: None,
9139        max: None,
9140        step: None,
9141        enum_values: EMPTY_ENUM_VALUES,
9142        notes: None,
9143    },
9144    IndicatorParamInfo {
9145        key: "ma_type",
9146        label: "MA Type",
9147        kind: IndicatorParamKind::EnumString,
9148        required: false,
9149        default: Some(ParamValueStatic::EnumString("sma")),
9150        min: None,
9151        max: None,
9152        step: None,
9153        enum_values: EMPTY_ENUM_VALUES,
9154        notes: None,
9155    },
9156];
9157
9158const PARAM_LPC: &[IndicatorParamInfo] = &[
9159    IndicatorParamInfo {
9160        key: "cutoff_type",
9161        label: "Cutoff Type",
9162        kind: IndicatorParamKind::EnumString,
9163        required: false,
9164        default: Some(ParamValueStatic::EnumString("adaptive")),
9165        min: None,
9166        max: None,
9167        step: None,
9168        enum_values: EMPTY_ENUM_VALUES,
9169        notes: None,
9170    },
9171    IndicatorParamInfo {
9172        key: "fixed_period",
9173        label: "Fixed Period",
9174        kind: IndicatorParamKind::Int,
9175        required: false,
9176        default: Some(ParamValueStatic::Int(20)),
9177        min: Some(1.0),
9178        max: None,
9179        step: Some(1.0),
9180        enum_values: EMPTY_ENUM_VALUES,
9181        notes: None,
9182    },
9183    IndicatorParamInfo {
9184        key: "max_cycle_limit",
9185        label: "Max Cycle Limit",
9186        kind: IndicatorParamKind::Int,
9187        required: false,
9188        default: Some(ParamValueStatic::Int(60)),
9189        min: Some(1.0),
9190        max: None,
9191        step: Some(1.0),
9192        enum_values: EMPTY_ENUM_VALUES,
9193        notes: None,
9194    },
9195    IndicatorParamInfo {
9196        key: "cycle_mult",
9197        label: "Cycle Mult",
9198        kind: IndicatorParamKind::Float,
9199        required: false,
9200        default: Some(ParamValueStatic::Float(1.0)),
9201        min: Some(0.0),
9202        max: None,
9203        step: None,
9204        enum_values: EMPTY_ENUM_VALUES,
9205        notes: None,
9206    },
9207    IndicatorParamInfo {
9208        key: "tr_mult",
9209        label: "TR Mult",
9210        kind: IndicatorParamKind::Float,
9211        required: false,
9212        default: Some(ParamValueStatic::Float(1.0)),
9213        min: Some(0.0),
9214        max: None,
9215        step: None,
9216        enum_values: EMPTY_ENUM_VALUES,
9217        notes: None,
9218    },
9219];
9220
9221const PARAM_MAB: &[IndicatorParamInfo] = &[
9222    IndicatorParamInfo {
9223        key: "fast_period",
9224        label: "Fast Period",
9225        kind: IndicatorParamKind::Int,
9226        required: false,
9227        default: Some(ParamValueStatic::Int(10)),
9228        min: Some(1.0),
9229        max: None,
9230        step: Some(1.0),
9231        enum_values: EMPTY_ENUM_VALUES,
9232        notes: None,
9233    },
9234    IndicatorParamInfo {
9235        key: "slow_period",
9236        label: "Slow Period",
9237        kind: IndicatorParamKind::Int,
9238        required: false,
9239        default: Some(ParamValueStatic::Int(50)),
9240        min: Some(1.0),
9241        max: None,
9242        step: Some(1.0),
9243        enum_values: EMPTY_ENUM_VALUES,
9244        notes: None,
9245    },
9246    IndicatorParamInfo {
9247        key: "devup",
9248        label: "Dev Up",
9249        kind: IndicatorParamKind::Float,
9250        required: false,
9251        default: Some(ParamValueStatic::Float(1.0)),
9252        min: Some(0.0),
9253        max: None,
9254        step: None,
9255        enum_values: EMPTY_ENUM_VALUES,
9256        notes: None,
9257    },
9258    IndicatorParamInfo {
9259        key: "devdn",
9260        label: "Dev Down",
9261        kind: IndicatorParamKind::Float,
9262        required: false,
9263        default: Some(ParamValueStatic::Float(1.0)),
9264        min: Some(0.0),
9265        max: None,
9266        step: None,
9267        enum_values: EMPTY_ENUM_VALUES,
9268        notes: None,
9269    },
9270    IndicatorParamInfo {
9271        key: "fast_ma_type",
9272        label: "Fast MA Type",
9273        kind: IndicatorParamKind::EnumString,
9274        required: false,
9275        default: Some(ParamValueStatic::EnumString("sma")),
9276        min: None,
9277        max: None,
9278        step: None,
9279        enum_values: EMPTY_ENUM_VALUES,
9280        notes: None,
9281    },
9282    IndicatorParamInfo {
9283        key: "slow_ma_type",
9284        label: "Slow MA Type",
9285        kind: IndicatorParamKind::EnumString,
9286        required: false,
9287        default: Some(ParamValueStatic::EnumString("sma")),
9288        min: None,
9289        max: None,
9290        step: None,
9291        enum_values: EMPTY_ENUM_VALUES,
9292        notes: None,
9293    },
9294];
9295
9296const PARAM_MACZ: &[IndicatorParamInfo] = &[
9297    IndicatorParamInfo {
9298        key: "fast_length",
9299        label: "Fast Length",
9300        kind: IndicatorParamKind::Int,
9301        required: false,
9302        default: Some(ParamValueStatic::Int(12)),
9303        min: Some(1.0),
9304        max: None,
9305        step: Some(1.0),
9306        enum_values: EMPTY_ENUM_VALUES,
9307        notes: None,
9308    },
9309    IndicatorParamInfo {
9310        key: "slow_length",
9311        label: "Slow Length",
9312        kind: IndicatorParamKind::Int,
9313        required: false,
9314        default: Some(ParamValueStatic::Int(25)),
9315        min: Some(1.0),
9316        max: None,
9317        step: Some(1.0),
9318        enum_values: EMPTY_ENUM_VALUES,
9319        notes: None,
9320    },
9321    IndicatorParamInfo {
9322        key: "signal_length",
9323        label: "Signal Length",
9324        kind: IndicatorParamKind::Int,
9325        required: false,
9326        default: Some(ParamValueStatic::Int(9)),
9327        min: Some(1.0),
9328        max: None,
9329        step: Some(1.0),
9330        enum_values: EMPTY_ENUM_VALUES,
9331        notes: None,
9332    },
9333    IndicatorParamInfo {
9334        key: "lengthz",
9335        label: "Length Z",
9336        kind: IndicatorParamKind::Int,
9337        required: false,
9338        default: Some(ParamValueStatic::Int(20)),
9339        min: Some(1.0),
9340        max: None,
9341        step: Some(1.0),
9342        enum_values: EMPTY_ENUM_VALUES,
9343        notes: None,
9344    },
9345    IndicatorParamInfo {
9346        key: "length_stdev",
9347        label: "Length StdDev",
9348        kind: IndicatorParamKind::Int,
9349        required: false,
9350        default: Some(ParamValueStatic::Int(25)),
9351        min: Some(1.0),
9352        max: None,
9353        step: Some(1.0),
9354        enum_values: EMPTY_ENUM_VALUES,
9355        notes: None,
9356    },
9357    IndicatorParamInfo {
9358        key: "a",
9359        label: "A",
9360        kind: IndicatorParamKind::Float,
9361        required: false,
9362        default: Some(ParamValueStatic::Float(1.0)),
9363        min: None,
9364        max: None,
9365        step: None,
9366        enum_values: EMPTY_ENUM_VALUES,
9367        notes: None,
9368    },
9369    IndicatorParamInfo {
9370        key: "b",
9371        label: "B",
9372        kind: IndicatorParamKind::Float,
9373        required: false,
9374        default: Some(ParamValueStatic::Float(1.0)),
9375        min: None,
9376        max: None,
9377        step: None,
9378        enum_values: EMPTY_ENUM_VALUES,
9379        notes: None,
9380    },
9381    IndicatorParamInfo {
9382        key: "use_lag",
9383        label: "Use Lag",
9384        kind: IndicatorParamKind::Bool,
9385        required: false,
9386        default: Some(ParamValueStatic::Bool(false)),
9387        min: None,
9388        max: None,
9389        step: None,
9390        enum_values: ENUM_VALUES_TRUE_FALSE,
9391        notes: None,
9392    },
9393    IndicatorParamInfo {
9394        key: "gamma",
9395        label: "Gamma",
9396        kind: IndicatorParamKind::Float,
9397        required: false,
9398        default: Some(ParamValueStatic::Float(0.02)),
9399        min: None,
9400        max: None,
9401        step: None,
9402        enum_values: EMPTY_ENUM_VALUES,
9403        notes: None,
9404    },
9405];
9406
9407const PARAM_MINMAX: &[IndicatorParamInfo] = &[IndicatorParamInfo {
9408    key: "order",
9409    label: "Order",
9410    kind: IndicatorParamKind::Int,
9411    required: false,
9412    default: Some(ParamValueStatic::Int(3)),
9413    min: Some(1.0),
9414    max: None,
9415    step: Some(1.0),
9416    enum_values: EMPTY_ENUM_VALUES,
9417    notes: None,
9418}];
9419
9420const PARAM_MSW: &[IndicatorParamInfo] = &[IndicatorParamInfo {
9421    key: "period",
9422    label: "Period",
9423    kind: IndicatorParamKind::Int,
9424    required: false,
9425    default: Some(ParamValueStatic::Int(5)),
9426    min: Some(1.0),
9427    max: None,
9428    step: Some(1.0),
9429    enum_values: EMPTY_ENUM_VALUES,
9430    notes: None,
9431}];
9432
9433const PARAM_NWE: &[IndicatorParamInfo] = &[
9434    IndicatorParamInfo {
9435        key: "bandwidth",
9436        label: "Bandwidth",
9437        kind: IndicatorParamKind::Float,
9438        required: false,
9439        default: Some(ParamValueStatic::Float(8.0)),
9440        min: Some(0.0),
9441        max: None,
9442        step: None,
9443        enum_values: EMPTY_ENUM_VALUES,
9444        notes: None,
9445    },
9446    IndicatorParamInfo {
9447        key: "multiplier",
9448        label: "Multiplier",
9449        kind: IndicatorParamKind::Float,
9450        required: false,
9451        default: Some(ParamValueStatic::Float(3.0)),
9452        min: Some(0.0),
9453        max: None,
9454        step: None,
9455        enum_values: EMPTY_ENUM_VALUES,
9456        notes: None,
9457    },
9458    IndicatorParamInfo {
9459        key: "lookback",
9460        label: "Lookback",
9461        kind: IndicatorParamKind::Int,
9462        required: false,
9463        default: Some(ParamValueStatic::Int(500)),
9464        min: Some(1.0),
9465        max: None,
9466        step: Some(1.0),
9467        enum_values: EMPTY_ENUM_VALUES,
9468        notes: None,
9469    },
9470];
9471
9472const PARAM_OTT: &[IndicatorParamInfo] = &[
9473    IndicatorParamInfo {
9474        key: "period",
9475        label: "Period",
9476        kind: IndicatorParamKind::Int,
9477        required: false,
9478        default: Some(ParamValueStatic::Int(2)),
9479        min: Some(1.0),
9480        max: None,
9481        step: Some(1.0),
9482        enum_values: EMPTY_ENUM_VALUES,
9483        notes: None,
9484    },
9485    IndicatorParamInfo {
9486        key: "percent",
9487        label: "Percent",
9488        kind: IndicatorParamKind::Float,
9489        required: false,
9490        default: Some(ParamValueStatic::Float(1.4)),
9491        min: Some(0.0),
9492        max: None,
9493        step: None,
9494        enum_values: EMPTY_ENUM_VALUES,
9495        notes: None,
9496    },
9497    IndicatorParamInfo {
9498        key: "ma_type",
9499        label: "MA Type",
9500        kind: IndicatorParamKind::EnumString,
9501        required: false,
9502        default: Some(ParamValueStatic::EnumString("VAR")),
9503        min: None,
9504        max: None,
9505        step: None,
9506        enum_values: EMPTY_ENUM_VALUES,
9507        notes: None,
9508    },
9509];
9510
9511const PARAM_OTTO: &[IndicatorParamInfo] = &[
9512    IndicatorParamInfo {
9513        key: "ott_period",
9514        label: "OTT Period",
9515        kind: IndicatorParamKind::Int,
9516        required: false,
9517        default: Some(ParamValueStatic::Int(2)),
9518        min: Some(1.0),
9519        max: None,
9520        step: Some(1.0),
9521        enum_values: EMPTY_ENUM_VALUES,
9522        notes: None,
9523    },
9524    IndicatorParamInfo {
9525        key: "ott_percent",
9526        label: "OTT Percent",
9527        kind: IndicatorParamKind::Float,
9528        required: false,
9529        default: Some(ParamValueStatic::Float(0.6)),
9530        min: Some(0.0),
9531        max: None,
9532        step: None,
9533        enum_values: EMPTY_ENUM_VALUES,
9534        notes: None,
9535    },
9536    IndicatorParamInfo {
9537        key: "fast_vidya_length",
9538        label: "Fast VIDYA Length",
9539        kind: IndicatorParamKind::Int,
9540        required: false,
9541        default: Some(ParamValueStatic::Int(10)),
9542        min: Some(1.0),
9543        max: None,
9544        step: Some(1.0),
9545        enum_values: EMPTY_ENUM_VALUES,
9546        notes: None,
9547    },
9548    IndicatorParamInfo {
9549        key: "slow_vidya_length",
9550        label: "Slow VIDYA Length",
9551        kind: IndicatorParamKind::Int,
9552        required: false,
9553        default: Some(ParamValueStatic::Int(25)),
9554        min: Some(1.0),
9555        max: None,
9556        step: Some(1.0),
9557        enum_values: EMPTY_ENUM_VALUES,
9558        notes: None,
9559    },
9560    IndicatorParamInfo {
9561        key: "correcting_constant",
9562        label: "Correcting Constant",
9563        kind: IndicatorParamKind::Float,
9564        required: false,
9565        default: Some(ParamValueStatic::Float(100000.0)),
9566        min: Some(0.0),
9567        max: None,
9568        step: None,
9569        enum_values: EMPTY_ENUM_VALUES,
9570        notes: None,
9571    },
9572    IndicatorParamInfo {
9573        key: "ma_type",
9574        label: "MA Type",
9575        kind: IndicatorParamKind::EnumString,
9576        required: false,
9577        default: Some(ParamValueStatic::EnumString("VAR")),
9578        min: None,
9579        max: None,
9580        step: None,
9581        enum_values: EMPTY_ENUM_VALUES,
9582        notes: None,
9583    },
9584];
9585
9586const PARAM_PMA: &[IndicatorParamInfo] = PARAM_NONE;
9587
9588const PARAM_EHLERS_ADAPTIVE_CG: &[IndicatorParamInfo] = &[
9589    IndicatorParamInfo {
9590        key: "alpha",
9591        label: "Alpha",
9592        kind: IndicatorParamKind::Float,
9593        required: false,
9594        default: Some(ParamValueStatic::Float(0.07)),
9595        min: Some(0.0),
9596        max: Some(1.0),
9597        step: None,
9598        enum_values: EMPTY_ENUM_VALUES,
9599        notes: None,
9600    },
9601    PARAM_OUTPUT_EHLERS_ADAPTIVE_CG,
9602];
9603
9604const PARAM_PRB: &[IndicatorParamInfo] = &[
9605    IndicatorParamInfo {
9606        key: "smooth_data",
9607        label: "Smooth Data",
9608        kind: IndicatorParamKind::Bool,
9609        required: false,
9610        default: Some(ParamValueStatic::Bool(true)),
9611        min: None,
9612        max: None,
9613        step: None,
9614        enum_values: ENUM_VALUES_TRUE_FALSE,
9615        notes: None,
9616    },
9617    IndicatorParamInfo {
9618        key: "smooth_period",
9619        label: "Smooth Period",
9620        kind: IndicatorParamKind::Int,
9621        required: false,
9622        default: Some(ParamValueStatic::Int(10)),
9623        min: Some(1.0),
9624        max: None,
9625        step: Some(1.0),
9626        enum_values: EMPTY_ENUM_VALUES,
9627        notes: None,
9628    },
9629    IndicatorParamInfo {
9630        key: "regression_period",
9631        label: "Regression Period",
9632        kind: IndicatorParamKind::Int,
9633        required: false,
9634        default: Some(ParamValueStatic::Int(100)),
9635        min: Some(1.0),
9636        max: None,
9637        step: Some(1.0),
9638        enum_values: EMPTY_ENUM_VALUES,
9639        notes: None,
9640    },
9641    IndicatorParamInfo {
9642        key: "polynomial_order",
9643        label: "Polynomial Order",
9644        kind: IndicatorParamKind::Int,
9645        required: false,
9646        default: Some(ParamValueStatic::Int(2)),
9647        min: Some(1.0),
9648        max: None,
9649        step: Some(1.0),
9650        enum_values: EMPTY_ENUM_VALUES,
9651        notes: None,
9652    },
9653    IndicatorParamInfo {
9654        key: "regression_offset",
9655        label: "Regression Offset",
9656        kind: IndicatorParamKind::Int,
9657        required: false,
9658        default: Some(ParamValueStatic::Int(0)),
9659        min: None,
9660        max: None,
9661        step: Some(1.0),
9662        enum_values: EMPTY_ENUM_VALUES,
9663        notes: None,
9664    },
9665    IndicatorParamInfo {
9666        key: "ndev",
9667        label: "NDev",
9668        kind: IndicatorParamKind::Float,
9669        required: false,
9670        default: Some(ParamValueStatic::Float(2.0)),
9671        min: Some(0.0),
9672        max: None,
9673        step: None,
9674        enum_values: EMPTY_ENUM_VALUES,
9675        notes: None,
9676    },
9677    IndicatorParamInfo {
9678        key: "equ_from",
9679        label: "Equ From",
9680        kind: IndicatorParamKind::Int,
9681        required: false,
9682        default: Some(ParamValueStatic::Int(0)),
9683        min: Some(0.0),
9684        max: None,
9685        step: Some(1.0),
9686        enum_values: EMPTY_ENUM_VALUES,
9687        notes: None,
9688    },
9689];
9690
9691const PARAM_POLYNOMIAL_REGRESSION_EXTRAPOLATION: &[IndicatorParamInfo] = &[
9692    IndicatorParamInfo {
9693        key: "length",
9694        label: "Length",
9695        kind: IndicatorParamKind::Int,
9696        required: false,
9697        default: Some(ParamValueStatic::Int(100)),
9698        min: Some(1.0),
9699        max: None,
9700        step: Some(1.0),
9701        enum_values: EMPTY_ENUM_VALUES,
9702        notes: None,
9703    },
9704    IndicatorParamInfo {
9705        key: "extrapolate",
9706        label: "Extrapolate",
9707        kind: IndicatorParamKind::Int,
9708        required: false,
9709        default: Some(ParamValueStatic::Int(10)),
9710        min: Some(0.0),
9711        max: None,
9712        step: Some(1.0),
9713        enum_values: EMPTY_ENUM_VALUES,
9714        notes: None,
9715    },
9716    IndicatorParamInfo {
9717        key: "degree",
9718        label: "Degree",
9719        kind: IndicatorParamKind::Int,
9720        required: false,
9721        default: Some(ParamValueStatic::Int(3)),
9722        min: Some(0.0),
9723        max: Some(8.0),
9724        step: Some(1.0),
9725        enum_values: EMPTY_ENUM_VALUES,
9726        notes: Some("Must satisfy degree + 1 <= length"),
9727    },
9728];
9729
9730const PARAM_STATISTICAL_TRAILING_STOP: &[IndicatorParamInfo] = &[
9731    IndicatorParamInfo {
9732        key: "data_length",
9733        label: "Data Length",
9734        kind: IndicatorParamKind::Int,
9735        required: false,
9736        default: Some(ParamValueStatic::Int(10)),
9737        min: Some(1.0),
9738        max: None,
9739        step: Some(1.0),
9740        enum_values: EMPTY_ENUM_VALUES,
9741        notes: Some("Corrected from the provided source so the data_length input controls the true-range window"),
9742    },
9743    IndicatorParamInfo {
9744        key: "normalization_length",
9745        label: "Distribution Length",
9746        kind: IndicatorParamKind::Int,
9747        required: false,
9748        default: Some(ParamValueStatic::Int(100)),
9749        min: Some(10.0),
9750        max: Some(5000.0),
9751        step: Some(1.0),
9752        enum_values: EMPTY_ENUM_VALUES,
9753        notes: None,
9754    },
9755    IndicatorParamInfo {
9756        key: "base_level",
9757        label: "Base Level",
9758        kind: IndicatorParamKind::EnumString,
9759        required: false,
9760        default: Some(ParamValueStatic::EnumString("level2")),
9761        min: None,
9762        max: None,
9763        step: None,
9764        enum_values: ENUM_VALUES_STATISTICAL_TRAILING_STOP_BASE_LEVEL,
9765        notes: None,
9766    },
9767];
9768
9769const PARAM_GEOMETRIC_BIAS_OSCILLATOR: &[IndicatorParamInfo] = &[
9770    IndicatorParamInfo {
9771        key: "length",
9772        label: "Window Size",
9773        kind: IndicatorParamKind::Int,
9774        required: false,
9775        default: Some(ParamValueStatic::Int(100)),
9776        min: Some(10.0),
9777        max: Some(500.0),
9778        step: Some(1.0),
9779        enum_values: EMPTY_ENUM_VALUES,
9780        notes: None,
9781    },
9782    IndicatorParamInfo {
9783        key: "multiplier",
9784        label: "ATR Multiplier",
9785        kind: IndicatorParamKind::Float,
9786        required: false,
9787        default: Some(ParamValueStatic::Float(2.0)),
9788        min: Some(0.1),
9789        max: None,
9790        step: Some(0.1),
9791        enum_values: EMPTY_ENUM_VALUES,
9792        notes: Some(
9793            "Used as the RDP simplification threshold against ATR-normalized price geometry",
9794        ),
9795    },
9796    IndicatorParamInfo {
9797        key: "atr_length",
9798        label: "ATR Length",
9799        kind: IndicatorParamKind::Int,
9800        required: false,
9801        default: Some(ParamValueStatic::Int(14)),
9802        min: Some(1.0),
9803        max: None,
9804        step: Some(1.0),
9805        enum_values: EMPTY_ENUM_VALUES,
9806        notes: None,
9807    },
9808    IndicatorParamInfo {
9809        key: "smooth",
9810        label: "Smoothing",
9811        kind: IndicatorParamKind::Int,
9812        required: false,
9813        default: Some(ParamValueStatic::Int(1)),
9814        min: Some(1.0),
9815        max: None,
9816        step: Some(1.0),
9817        enum_values: EMPTY_ENUM_VALUES,
9818        notes: None,
9819    },
9820];
9821
9822const PARAM_VDUBUS_DIVERGENCE_WAVE_PATTERN_GENERATOR: &[IndicatorParamInfo] = &[
9823    IndicatorParamInfo {
9824        key: "fast_depth",
9825        label: "Fast Depth",
9826        kind: IndicatorParamKind::Int,
9827        required: false,
9828        default: Some(ParamValueStatic::Int(9)),
9829        min: Some(1.0),
9830        max: None,
9831        step: Some(1.0),
9832        enum_values: EMPTY_ENUM_VALUES,
9833        notes: None,
9834    },
9835    IndicatorParamInfo {
9836        key: "slow_depth",
9837        label: "Slow Depth",
9838        kind: IndicatorParamKind::Int,
9839        required: false,
9840        default: Some(ParamValueStatic::Int(24)),
9841        min: Some(1.0),
9842        max: None,
9843        step: Some(1.0),
9844        enum_values: EMPTY_ENUM_VALUES,
9845        notes: None,
9846    },
9847    IndicatorParamInfo {
9848        key: "fast_length",
9849        label: "Fast Length",
9850        kind: IndicatorParamKind::Int,
9851        required: false,
9852        default: Some(ParamValueStatic::Int(21)),
9853        min: Some(1.0),
9854        max: None,
9855        step: Some(1.0),
9856        enum_values: EMPTY_ENUM_VALUES,
9857        notes: None,
9858    },
9859    IndicatorParamInfo {
9860        key: "slow_length",
9861        label: "Slow Length",
9862        kind: IndicatorParamKind::Int,
9863        required: false,
9864        default: Some(ParamValueStatic::Int(34)),
9865        min: Some(1.0),
9866        max: None,
9867        step: Some(1.0),
9868        enum_values: EMPTY_ENUM_VALUES,
9869        notes: None,
9870    },
9871    IndicatorParamInfo {
9872        key: "signal_length",
9873        label: "Signal Length",
9874        kind: IndicatorParamKind::Int,
9875        required: false,
9876        default: Some(ParamValueStatic::Int(5)),
9877        min: Some(1.0),
9878        max: None,
9879        step: Some(1.0),
9880        enum_values: EMPTY_ENUM_VALUES,
9881        notes: None,
9882    },
9883    IndicatorParamInfo {
9884        key: "lookback",
9885        label: "Momentum Pivot Lookback",
9886        kind: IndicatorParamKind::Int,
9887        required: false,
9888        default: Some(ParamValueStatic::Int(3)),
9889        min: Some(1.0),
9890        max: None,
9891        step: Some(1.0),
9892        enum_values: EMPTY_ENUM_VALUES,
9893        notes: None,
9894    },
9895    IndicatorParamInfo {
9896        key: "err_tol",
9897        label: "Harmonic Tolerance",
9898        kind: IndicatorParamKind::Float,
9899        required: false,
9900        default: Some(ParamValueStatic::Float(0.15)),
9901        min: Some(0.01),
9902        max: Some(0.5),
9903        step: Some(0.01),
9904        enum_values: EMPTY_ENUM_VALUES,
9905        notes: Some(
9906            "Uses corrected XAD ratio instead of the constant 1.27 shown in the provided source",
9907        ),
9908    },
9909    IndicatorParamInfo {
9910        key: "show_standard",
9911        label: "Show Standard",
9912        kind: IndicatorParamKind::Bool,
9913        required: false,
9914        default: Some(ParamValueStatic::Bool(true)),
9915        min: None,
9916        max: None,
9917        step: None,
9918        enum_values: ENUM_VALUES_TRUE_FALSE,
9919        notes: None,
9920    },
9921    IndicatorParamInfo {
9922        key: "show_climax",
9923        label: "Show Climax",
9924        kind: IndicatorParamKind::Bool,
9925        required: false,
9926        default: Some(ParamValueStatic::Bool(true)),
9927        min: None,
9928        max: None,
9929        step: None,
9930        enum_values: ENUM_VALUES_TRUE_FALSE,
9931        notes: None,
9932    },
9933    IndicatorParamInfo {
9934        key: "show_rounded",
9935        label: "Show Rounded",
9936        kind: IndicatorParamKind::Bool,
9937        required: false,
9938        default: Some(ParamValueStatic::Bool(true)),
9939        min: None,
9940        max: None,
9941        step: None,
9942        enum_values: ENUM_VALUES_TRUE_FALSE,
9943        notes: None,
9944    },
9945    IndicatorParamInfo {
9946        key: "show_predator",
9947        label: "Show Predator",
9948        kind: IndicatorParamKind::Bool,
9949        required: false,
9950        default: Some(ParamValueStatic::Bool(true)),
9951        min: None,
9952        max: None,
9953        step: None,
9954        enum_values: ENUM_VALUES_TRUE_FALSE,
9955        notes: None,
9956    },
9957    IndicatorParamInfo {
9958        key: "show_gartley",
9959        label: "Show Gartley",
9960        kind: IndicatorParamKind::Bool,
9961        required: false,
9962        default: Some(ParamValueStatic::Bool(false)),
9963        min: None,
9964        max: None,
9965        step: None,
9966        enum_values: ENUM_VALUES_TRUE_FALSE,
9967        notes: None,
9968    },
9969    IndicatorParamInfo {
9970        key: "show_bat",
9971        label: "Show Bat",
9972        kind: IndicatorParamKind::Bool,
9973        required: false,
9974        default: Some(ParamValueStatic::Bool(false)),
9975        min: None,
9976        max: None,
9977        step: None,
9978        enum_values: ENUM_VALUES_TRUE_FALSE,
9979        notes: None,
9980    },
9981    IndicatorParamInfo {
9982        key: "show_butterfly",
9983        label: "Show Butterfly",
9984        kind: IndicatorParamKind::Bool,
9985        required: false,
9986        default: Some(ParamValueStatic::Bool(false)),
9987        min: None,
9988        max: None,
9989        step: None,
9990        enum_values: ENUM_VALUES_TRUE_FALSE,
9991        notes: None,
9992    },
9993    IndicatorParamInfo {
9994        key: "show_crab",
9995        label: "Show Crab",
9996        kind: IndicatorParamKind::Bool,
9997        required: false,
9998        default: Some(ParamValueStatic::Bool(false)),
9999        min: None,
10000        max: None,
10001        step: None,
10002        enum_values: ENUM_VALUES_TRUE_FALSE,
10003        notes: None,
10004    },
10005    IndicatorParamInfo {
10006        key: "show_deep",
10007        label: "Show Deep",
10008        kind: IndicatorParamKind::Bool,
10009        required: false,
10010        default: Some(ParamValueStatic::Bool(false)),
10011        min: None,
10012        max: None,
10013        step: None,
10014        enum_values: ENUM_VALUES_TRUE_FALSE,
10015        notes: None,
10016    },
10017    IndicatorParamInfo {
10018        key: "show_hs",
10019        label: "Show H&S",
10020        kind: IndicatorParamKind::Bool,
10021        required: false,
10022        default: Some(ParamValueStatic::Bool(true)),
10023        min: None,
10024        max: None,
10025        step: None,
10026        enum_values: ENUM_VALUES_TRUE_FALSE,
10027        notes: None,
10028    },
10029];
10030
10031const PARAM_QQE: &[IndicatorParamInfo] = &[
10032    IndicatorParamInfo {
10033        key: "rsi_period",
10034        label: "RSI Period",
10035        kind: IndicatorParamKind::Int,
10036        required: false,
10037        default: Some(ParamValueStatic::Int(14)),
10038        min: Some(1.0),
10039        max: None,
10040        step: Some(1.0),
10041        enum_values: EMPTY_ENUM_VALUES,
10042        notes: None,
10043    },
10044    IndicatorParamInfo {
10045        key: "smoothing_factor",
10046        label: "Smoothing Factor",
10047        kind: IndicatorParamKind::Int,
10048        required: false,
10049        default: Some(ParamValueStatic::Int(5)),
10050        min: Some(1.0),
10051        max: None,
10052        step: Some(1.0),
10053        enum_values: EMPTY_ENUM_VALUES,
10054        notes: None,
10055    },
10056    IndicatorParamInfo {
10057        key: "fast_factor",
10058        label: "Fast Factor",
10059        kind: IndicatorParamKind::Float,
10060        required: false,
10061        default: Some(ParamValueStatic::Float(4.236)),
10062        min: Some(0.0),
10063        max: None,
10064        step: None,
10065        enum_values: EMPTY_ENUM_VALUES,
10066        notes: None,
10067    },
10068];
10069
10070const PARAM_QQE_WEIGHTED_OSCILLATOR: &[IndicatorParamInfo] = &[
10071    IndicatorParamInfo {
10072        key: "length",
10073        label: "Length",
10074        kind: IndicatorParamKind::Int,
10075        required: false,
10076        default: Some(ParamValueStatic::Int(14)),
10077        min: Some(1.0),
10078        max: None,
10079        step: Some(1.0),
10080        enum_values: EMPTY_ENUM_VALUES,
10081        notes: None,
10082    },
10083    IndicatorParamInfo {
10084        key: "factor",
10085        label: "Factor",
10086        kind: IndicatorParamKind::Float,
10087        required: false,
10088        default: Some(ParamValueStatic::Float(4.236)),
10089        min: Some(0.0),
10090        max: None,
10091        step: None,
10092        enum_values: EMPTY_ENUM_VALUES,
10093        notes: None,
10094    },
10095    IndicatorParamInfo {
10096        key: "smooth",
10097        label: "Smooth",
10098        kind: IndicatorParamKind::Int,
10099        required: false,
10100        default: Some(ParamValueStatic::Int(5)),
10101        min: Some(1.0),
10102        max: None,
10103        step: Some(1.0),
10104        enum_values: EMPTY_ENUM_VALUES,
10105        notes: None,
10106    },
10107    IndicatorParamInfo {
10108        key: "weight",
10109        label: "Weight",
10110        kind: IndicatorParamKind::Float,
10111        required: false,
10112        default: Some(ParamValueStatic::Float(2.0)),
10113        min: None,
10114        max: None,
10115        step: None,
10116        enum_values: EMPTY_ENUM_VALUES,
10117        notes: None,
10118    },
10119];
10120
10121const PARAM_FORWARD_BACKWARD_EXPONENTIAL_OSCILLATOR: &[IndicatorParamInfo] = &[
10122    IndicatorParamInfo {
10123        key: "length",
10124        label: "Length",
10125        kind: IndicatorParamKind::Int,
10126        required: false,
10127        default: Some(ParamValueStatic::Int(20)),
10128        min: Some(1.0),
10129        max: None,
10130        step: Some(1.0),
10131        enum_values: EMPTY_ENUM_VALUES,
10132        notes: None,
10133    },
10134    IndicatorParamInfo {
10135        key: "smooth",
10136        label: "Smoothing",
10137        kind: IndicatorParamKind::Int,
10138        required: false,
10139        default: Some(ParamValueStatic::Int(10)),
10140        min: Some(1.0),
10141        max: None,
10142        step: Some(1.0),
10143        enum_values: EMPTY_ENUM_VALUES,
10144        notes: None,
10145    },
10146];
10147
10148const PARAM_ADAPTIVE_BOUNDS_RSI: &[IndicatorParamInfo] = &[
10149    IndicatorParamInfo {
10150        key: "rsi_length",
10151        label: "RSI Length",
10152        kind: IndicatorParamKind::Int,
10153        required: false,
10154        default: Some(ParamValueStatic::Int(14)),
10155        min: Some(1.0),
10156        max: None,
10157        step: Some(1.0),
10158        enum_values: EMPTY_ENUM_VALUES,
10159        notes: None,
10160    },
10161    IndicatorParamInfo {
10162        key: "alpha",
10163        label: "Learning Rate",
10164        kind: IndicatorParamKind::Float,
10165        required: false,
10166        default: Some(ParamValueStatic::Float(0.1)),
10167        min: Some(0.001),
10168        max: Some(1.0),
10169        step: Some(0.001),
10170        enum_values: EMPTY_ENUM_VALUES,
10171        notes: None,
10172    },
10173];
10174
10175const PARAM_RANGE_OSCILLATOR: &[IndicatorParamInfo] = &[
10176    IndicatorParamInfo {
10177        key: "length",
10178        label: "Length",
10179        kind: IndicatorParamKind::Int,
10180        required: false,
10181        default: Some(ParamValueStatic::Int(50)),
10182        min: Some(1.0),
10183        max: None,
10184        step: Some(1.0),
10185        enum_values: EMPTY_ENUM_VALUES,
10186        notes: None,
10187    },
10188    IndicatorParamInfo {
10189        key: "mult",
10190        label: "Multiplier",
10191        kind: IndicatorParamKind::Float,
10192        required: false,
10193        default: Some(ParamValueStatic::Float(2.0)),
10194        min: Some(0.1),
10195        max: None,
10196        step: Some(0.1),
10197        enum_values: EMPTY_ENUM_VALUES,
10198        notes: None,
10199    },
10200];
10201const PARAM_RANGE_FILTERED_TREND_SIGNALS: &[IndicatorParamInfo] = &[
10202    IndicatorParamInfo {
10203        key: "kalman_alpha",
10204        label: "Kalman Alpha",
10205        kind: IndicatorParamKind::Float,
10206        required: false,
10207        default: Some(ParamValueStatic::Float(0.01)),
10208        min: Some(0.0),
10209        max: None,
10210        step: Some(0.01),
10211        enum_values: EMPTY_ENUM_VALUES,
10212        notes: None,
10213    },
10214    IndicatorParamInfo {
10215        key: "kalman_beta",
10216        label: "Kalman Beta",
10217        kind: IndicatorParamKind::Float,
10218        required: false,
10219        default: Some(ParamValueStatic::Float(0.1)),
10220        min: Some(0.0),
10221        max: None,
10222        step: Some(0.1),
10223        enum_values: EMPTY_ENUM_VALUES,
10224        notes: None,
10225    },
10226    IndicatorParamInfo {
10227        key: "kalman_period",
10228        label: "Kalman Period",
10229        kind: IndicatorParamKind::Int,
10230        required: false,
10231        default: Some(ParamValueStatic::Int(77)),
10232        min: Some(1.0),
10233        max: None,
10234        step: Some(1.0),
10235        enum_values: EMPTY_ENUM_VALUES,
10236        notes: None,
10237    },
10238    IndicatorParamInfo {
10239        key: "dev",
10240        label: "Deviation",
10241        kind: IndicatorParamKind::Float,
10242        required: false,
10243        default: Some(ParamValueStatic::Float(1.2)),
10244        min: Some(0.0),
10245        max: None,
10246        step: Some(0.1),
10247        enum_values: EMPTY_ENUM_VALUES,
10248        notes: None,
10249    },
10250    IndicatorParamInfo {
10251        key: "supertrend_factor",
10252        label: "Supertrend Factor",
10253        kind: IndicatorParamKind::Float,
10254        required: false,
10255        default: Some(ParamValueStatic::Float(0.7)),
10256        min: Some(0.0),
10257        max: None,
10258        step: Some(0.1),
10259        enum_values: EMPTY_ENUM_VALUES,
10260        notes: None,
10261    },
10262    IndicatorParamInfo {
10263        key: "supertrend_atr_period",
10264        label: "Supertrend ATR Period",
10265        kind: IndicatorParamKind::Int,
10266        required: false,
10267        default: Some(ParamValueStatic::Int(7)),
10268        min: Some(1.0),
10269        max: None,
10270        step: Some(1.0),
10271        enum_values: EMPTY_ENUM_VALUES,
10272        notes: None,
10273    },
10274];
10275const ENUM_VALUES_MSC_BOS_CONFIRMATION: &[&str] = &["Candle Close", "Wicks"];
10276const PARAM_MARKET_STRUCTURE_CONFLUENCE: &[IndicatorParamInfo] = &[
10277    IndicatorParamInfo {
10278        key: "swing_size",
10279        label: "Time Horizon",
10280        kind: IndicatorParamKind::Int,
10281        required: false,
10282        default: Some(ParamValueStatic::Int(10)),
10283        min: Some(2.0),
10284        max: None,
10285        step: Some(1.0),
10286        enum_values: EMPTY_ENUM_VALUES,
10287        notes: None,
10288    },
10289    IndicatorParamInfo {
10290        key: "bos_confirmation",
10291        label: "BOS Confirmation",
10292        kind: IndicatorParamKind::EnumString,
10293        required: false,
10294        default: Some(ParamValueStatic::EnumString("Candle Close")),
10295        min: None,
10296        max: None,
10297        step: None,
10298        enum_values: ENUM_VALUES_MSC_BOS_CONFIRMATION,
10299        notes: None,
10300    },
10301    IndicatorParamInfo {
10302        key: "basis_length",
10303        label: "Basis Length",
10304        kind: IndicatorParamKind::Int,
10305        required: false,
10306        default: Some(ParamValueStatic::Int(100)),
10307        min: Some(1.0),
10308        max: None,
10309        step: Some(1.0),
10310        enum_values: EMPTY_ENUM_VALUES,
10311        notes: None,
10312    },
10313    IndicatorParamInfo {
10314        key: "atr_length",
10315        label: "ATR Length",
10316        kind: IndicatorParamKind::Int,
10317        required: false,
10318        default: Some(ParamValueStatic::Int(14)),
10319        min: Some(1.0),
10320        max: None,
10321        step: Some(1.0),
10322        enum_values: EMPTY_ENUM_VALUES,
10323        notes: None,
10324    },
10325    IndicatorParamInfo {
10326        key: "atr_smooth",
10327        label: "ATR Smoothing",
10328        kind: IndicatorParamKind::Int,
10329        required: false,
10330        default: Some(ParamValueStatic::Int(21)),
10331        min: Some(1.0),
10332        max: None,
10333        step: Some(1.0),
10334        enum_values: EMPTY_ENUM_VALUES,
10335        notes: None,
10336    },
10337    IndicatorParamInfo {
10338        key: "vol_mult",
10339        label: "Volatility Multiplier",
10340        kind: IndicatorParamKind::Float,
10341        required: false,
10342        default: Some(ParamValueStatic::Float(2.0)),
10343        min: Some(0.0),
10344        max: None,
10345        step: Some(0.1),
10346        enum_values: EMPTY_ENUM_VALUES,
10347        notes: None,
10348    },
10349];
10350const ENUM_VALUES_VWRSI_MA_TYPE: &[&str] = &["EMA", "SMA", "HMA", "SMMA (RMA)", "WMA", "VWMA"];
10351const PARAM_VOLUME_WEIGHTED_RELATIVE_STRENGTH_INDEX: &[IndicatorParamInfo] = &[
10352    IndicatorParamInfo {
10353        key: "rsi_length",
10354        label: "RSI Length",
10355        kind: IndicatorParamKind::Int,
10356        required: false,
10357        default: Some(ParamValueStatic::Int(14)),
10358        min: Some(1.0),
10359        max: None,
10360        step: Some(1.0),
10361        enum_values: EMPTY_ENUM_VALUES,
10362        notes: None,
10363    },
10364    IndicatorParamInfo {
10365        key: "range_length",
10366        label: "Consolidation Length",
10367        kind: IndicatorParamKind::Int,
10368        required: false,
10369        default: Some(ParamValueStatic::Int(10)),
10370        min: Some(1.0),
10371        max: None,
10372        step: Some(1.0),
10373        enum_values: EMPTY_ENUM_VALUES,
10374        notes: None,
10375    },
10376    IndicatorParamInfo {
10377        key: "ma_length",
10378        label: "RSI MA Length",
10379        kind: IndicatorParamKind::Int,
10380        required: false,
10381        default: Some(ParamValueStatic::Int(14)),
10382        min: Some(1.0),
10383        max: None,
10384        step: Some(1.0),
10385        enum_values: EMPTY_ENUM_VALUES,
10386        notes: None,
10387    },
10388    IndicatorParamInfo {
10389        key: "ma_type",
10390        label: "RSI MA Type",
10391        kind: IndicatorParamKind::EnumString,
10392        required: false,
10393        default: Some(ParamValueStatic::EnumString("EMA")),
10394        min: None,
10395        max: None,
10396        step: None,
10397        enum_values: ENUM_VALUES_VWRSI_MA_TYPE,
10398        notes: None,
10399    },
10400];
10401
10402const PARAM_RANGE_FILTER: &[IndicatorParamInfo] = &[
10403    IndicatorParamInfo {
10404        key: "range_size",
10405        label: "Range Size",
10406        kind: IndicatorParamKind::Float,
10407        required: false,
10408        default: Some(ParamValueStatic::Float(2.618)),
10409        min: Some(0.0),
10410        max: None,
10411        step: None,
10412        enum_values: EMPTY_ENUM_VALUES,
10413        notes: None,
10414    },
10415    IndicatorParamInfo {
10416        key: "range_period",
10417        label: "Range Period",
10418        kind: IndicatorParamKind::Int,
10419        required: false,
10420        default: Some(ParamValueStatic::Int(14)),
10421        min: Some(1.0),
10422        max: None,
10423        step: Some(1.0),
10424        enum_values: EMPTY_ENUM_VALUES,
10425        notes: None,
10426    },
10427    IndicatorParamInfo {
10428        key: "smooth_range",
10429        label: "Smooth Range",
10430        kind: IndicatorParamKind::Bool,
10431        required: false,
10432        default: Some(ParamValueStatic::Bool(true)),
10433        min: None,
10434        max: None,
10435        step: None,
10436        enum_values: ENUM_VALUES_TRUE_FALSE,
10437        notes: None,
10438    },
10439    IndicatorParamInfo {
10440        key: "smooth_period",
10441        label: "Smooth Period",
10442        kind: IndicatorParamKind::Int,
10443        required: false,
10444        default: Some(ParamValueStatic::Int(27)),
10445        min: Some(1.0),
10446        max: None,
10447        step: Some(1.0),
10448        enum_values: EMPTY_ENUM_VALUES,
10449        notes: None,
10450    },
10451];
10452
10453const PARAM_RSMK: &[IndicatorParamInfo] = &[
10454    IndicatorParamInfo {
10455        key: "lookback",
10456        label: "Lookback",
10457        kind: IndicatorParamKind::Int,
10458        required: false,
10459        default: Some(ParamValueStatic::Int(90)),
10460        min: Some(1.0),
10461        max: None,
10462        step: Some(1.0),
10463        enum_values: EMPTY_ENUM_VALUES,
10464        notes: None,
10465    },
10466    IndicatorParamInfo {
10467        key: "period",
10468        label: "Period",
10469        kind: IndicatorParamKind::Int,
10470        required: false,
10471        default: Some(ParamValueStatic::Int(3)),
10472        min: Some(1.0),
10473        max: None,
10474        step: Some(1.0),
10475        enum_values: EMPTY_ENUM_VALUES,
10476        notes: None,
10477    },
10478    IndicatorParamInfo {
10479        key: "signal_period",
10480        label: "Signal Period",
10481        kind: IndicatorParamKind::Int,
10482        required: false,
10483        default: Some(ParamValueStatic::Int(20)),
10484        min: Some(1.0),
10485        max: None,
10486        step: Some(1.0),
10487        enum_values: EMPTY_ENUM_VALUES,
10488        notes: None,
10489    },
10490    IndicatorParamInfo {
10491        key: "matype",
10492        label: "MA Type",
10493        kind: IndicatorParamKind::EnumString,
10494        required: false,
10495        default: Some(ParamValueStatic::EnumString("ema")),
10496        min: None,
10497        max: None,
10498        step: None,
10499        enum_values: EMPTY_ENUM_VALUES,
10500        notes: None,
10501    },
10502    IndicatorParamInfo {
10503        key: "signal_matype",
10504        label: "Signal MA Type",
10505        kind: IndicatorParamKind::EnumString,
10506        required: false,
10507        default: Some(ParamValueStatic::EnumString("ema")),
10508        min: None,
10509        max: None,
10510        step: None,
10511        enum_values: EMPTY_ENUM_VALUES,
10512        notes: None,
10513    },
10514];
10515
10516const PARAM_VOSS: &[IndicatorParamInfo] = &[
10517    IndicatorParamInfo {
10518        key: "period",
10519        label: "Period",
10520        kind: IndicatorParamKind::Int,
10521        required: false,
10522        default: Some(ParamValueStatic::Int(20)),
10523        min: Some(1.0),
10524        max: None,
10525        step: Some(1.0),
10526        enum_values: EMPTY_ENUM_VALUES,
10527        notes: None,
10528    },
10529    IndicatorParamInfo {
10530        key: "predict",
10531        label: "Predict",
10532        kind: IndicatorParamKind::Int,
10533        required: false,
10534        default: Some(ParamValueStatic::Int(3)),
10535        min: Some(1.0),
10536        max: None,
10537        step: Some(1.0),
10538        enum_values: EMPTY_ENUM_VALUES,
10539        notes: None,
10540    },
10541    IndicatorParamInfo {
10542        key: "bandwidth",
10543        label: "Bandwidth",
10544        kind: IndicatorParamKind::Float,
10545        required: false,
10546        default: Some(ParamValueStatic::Float(0.25)),
10547        min: Some(0.0),
10548        max: None,
10549        step: None,
10550        enum_values: EMPTY_ENUM_VALUES,
10551        notes: None,
10552    },
10553];
10554
10555const PARAM_STC: &[IndicatorParamInfo] = &[
10556    IndicatorParamInfo {
10557        key: "fast_period",
10558        label: "Fast Period",
10559        kind: IndicatorParamKind::Int,
10560        required: false,
10561        default: Some(ParamValueStatic::Int(23)),
10562        min: Some(1.0),
10563        max: None,
10564        step: Some(1.0),
10565        enum_values: EMPTY_ENUM_VALUES,
10566        notes: None,
10567    },
10568    IndicatorParamInfo {
10569        key: "slow_period",
10570        label: "Slow Period",
10571        kind: IndicatorParamKind::Int,
10572        required: false,
10573        default: Some(ParamValueStatic::Int(50)),
10574        min: Some(1.0),
10575        max: None,
10576        step: Some(1.0),
10577        enum_values: EMPTY_ENUM_VALUES,
10578        notes: None,
10579    },
10580    IndicatorParamInfo {
10581        key: "k_period",
10582        label: "K Period",
10583        kind: IndicatorParamKind::Int,
10584        required: false,
10585        default: Some(ParamValueStatic::Int(10)),
10586        min: Some(1.0),
10587        max: None,
10588        step: Some(1.0),
10589        enum_values: EMPTY_ENUM_VALUES,
10590        notes: None,
10591    },
10592    IndicatorParamInfo {
10593        key: "d_period",
10594        label: "D Period",
10595        kind: IndicatorParamKind::Int,
10596        required: false,
10597        default: Some(ParamValueStatic::Int(3)),
10598        min: Some(1.0),
10599        max: None,
10600        step: Some(1.0),
10601        enum_values: EMPTY_ENUM_VALUES,
10602        notes: None,
10603    },
10604];
10605
10606const PARAM_RVI: &[IndicatorParamInfo] = &[
10607    IndicatorParamInfo {
10608        key: "period",
10609        label: "Period",
10610        kind: IndicatorParamKind::Int,
10611        required: false,
10612        default: Some(ParamValueStatic::Int(10)),
10613        min: Some(1.0),
10614        max: None,
10615        step: Some(1.0),
10616        enum_values: EMPTY_ENUM_VALUES,
10617        notes: None,
10618    },
10619    IndicatorParamInfo {
10620        key: "ma_len",
10621        label: "MA Length",
10622        kind: IndicatorParamKind::Int,
10623        required: false,
10624        default: Some(ParamValueStatic::Int(14)),
10625        min: Some(1.0),
10626        max: None,
10627        step: Some(1.0),
10628        enum_values: EMPTY_ENUM_VALUES,
10629        notes: None,
10630    },
10631    IndicatorParamInfo {
10632        key: "matype",
10633        label: "MA Type",
10634        kind: IndicatorParamKind::Int,
10635        required: false,
10636        default: Some(ParamValueStatic::Int(1)),
10637        min: Some(0.0),
10638        max: None,
10639        step: Some(1.0),
10640        enum_values: EMPTY_ENUM_VALUES,
10641        notes: None,
10642    },
10643    IndicatorParamInfo {
10644        key: "devtype",
10645        label: "Deviation Type",
10646        kind: IndicatorParamKind::Int,
10647        required: false,
10648        default: Some(ParamValueStatic::Int(0)),
10649        min: Some(0.0),
10650        max: None,
10651        step: Some(1.0),
10652        enum_values: EMPTY_ENUM_VALUES,
10653        notes: None,
10654    },
10655];
10656
10657const PARAM_COPPOCK: &[IndicatorParamInfo] = &[
10658    IndicatorParamInfo {
10659        key: "short_roc_period",
10660        label: "Short ROC Period",
10661        kind: IndicatorParamKind::Int,
10662        required: false,
10663        default: Some(ParamValueStatic::Int(11)),
10664        min: Some(1.0),
10665        max: None,
10666        step: Some(1.0),
10667        enum_values: EMPTY_ENUM_VALUES,
10668        notes: None,
10669    },
10670    IndicatorParamInfo {
10671        key: "long_roc_period",
10672        label: "Long ROC Period",
10673        kind: IndicatorParamKind::Int,
10674        required: false,
10675        default: Some(ParamValueStatic::Int(14)),
10676        min: Some(1.0),
10677        max: None,
10678        step: Some(1.0),
10679        enum_values: EMPTY_ENUM_VALUES,
10680        notes: None,
10681    },
10682    IndicatorParamInfo {
10683        key: "ma_period",
10684        label: "MA Period",
10685        kind: IndicatorParamKind::Int,
10686        required: false,
10687        default: Some(ParamValueStatic::Int(10)),
10688        min: Some(1.0),
10689        max: None,
10690        step: Some(1.0),
10691        enum_values: EMPTY_ENUM_VALUES,
10692        notes: None,
10693    },
10694];
10695
10696const PARAM_PIVOT: &[IndicatorParamInfo] = &[IndicatorParamInfo {
10697    key: "mode",
10698    label: "Mode",
10699    kind: IndicatorParamKind::Int,
10700    required: false,
10701    default: Some(ParamValueStatic::Int(3)),
10702    min: Some(0.0),
10703    max: None,
10704    step: Some(1.0),
10705    enum_values: EMPTY_ENUM_VALUES,
10706    notes: None,
10707}];
10708
10709const SUPPLEMENTAL_SEED_NOTE: &str =
10710    "Phase 1 seed metadata; parameter and capability metadata will expand.";
10711
10712struct SupplementalIndicatorSeed {
10713    id: &'static str,
10714    label: &'static str,
10715    category: &'static str,
10716    input_kind: IndicatorInputKind,
10717    outputs: &'static [IndicatorOutputInfo],
10718    params: &'static [IndicatorParamInfo],
10719}
10720
10721const SUPPLEMENTAL_INDICATORS: &[SupplementalIndicatorSeed] = &[
10722    SupplementalIndicatorSeed {
10723        id: "adx",
10724        label: "ADX",
10725        category: "trend",
10726        input_kind: IndicatorInputKind::Ohlc,
10727        outputs: OUTPUTS_VALUE_F64,
10728        params: PARAM_ADX_PERIOD,
10729    },
10730    SupplementalIndicatorSeed {
10731        id: "adxr",
10732        label: "ADXR",
10733        category: "trend",
10734        input_kind: IndicatorInputKind::Ohlc,
10735        outputs: OUTPUTS_VALUE_F64,
10736        params: PARAM_ADX_PERIOD,
10737    },
10738    SupplementalIndicatorSeed {
10739        id: "dx",
10740        label: "DX",
10741        category: "trend",
10742        input_kind: IndicatorInputKind::Ohlc,
10743        outputs: OUTPUTS_VALUE_F64,
10744        params: PARAM_DX_PERIOD,
10745    },
10746    SupplementalIndicatorSeed {
10747        id: "di",
10748        label: "DI",
10749        category: "trend",
10750        input_kind: IndicatorInputKind::Ohlc,
10751        outputs: OUTPUTS_PLUS_MINUS,
10752        params: PARAM_DI,
10753    },
10754    SupplementalIndicatorSeed {
10755        id: "dm",
10756        label: "DM",
10757        category: "trend",
10758        input_kind: IndicatorInputKind::HighLow,
10759        outputs: OUTPUTS_PLUS_MINUS,
10760        params: PARAM_DM,
10761    },
10762    SupplementalIndicatorSeed {
10763        id: "vi",
10764        label: "VI",
10765        category: "trend",
10766        input_kind: IndicatorInputKind::Ohlc,
10767        outputs: OUTPUTS_PLUS_MINUS,
10768        params: PARAM_VI,
10769    },
10770    SupplementalIndicatorSeed {
10771        id: "donchian",
10772        label: "Donchian",
10773        category: "volatility",
10774        input_kind: IndicatorInputKind::HighLow,
10775        outputs: OUTPUTS_BOLLINGER,
10776        params: PARAM_DONCHIAN,
10777    },
10778    SupplementalIndicatorSeed {
10779        id: "supertrend",
10780        label: "SuperTrend",
10781        category: "trend",
10782        input_kind: IndicatorInputKind::Ohlc,
10783        outputs: OUTPUTS_TREND_CHANGED,
10784        params: PARAM_SUPERTREND,
10785    },
10786    SupplementalIndicatorSeed {
10787        id: "adjustable_ma_alternating_extremities",
10788        label: "Adjustable MA & Alternating Extremities",
10789        category: "trend",
10790        input_kind: IndicatorInputKind::Ohlc,
10791        outputs: OUTPUTS_ADJUSTABLE_MA_ALTERNATING_EXTREMITIES,
10792        params: PARAM_ADJUSTABLE_MA_ALTERNATING_EXTREMITIES,
10793    },
10794    SupplementalIndicatorSeed {
10795        id: "supertrend_recovery",
10796        label: "SuperTrend Recovery",
10797        category: "trend",
10798        input_kind: IndicatorInputKind::Ohlc,
10799        outputs: OUTPUTS_SUPERTREND_RECOVERY,
10800        params: PARAM_SUPERTREND_RECOVERY,
10801    },
10802    SupplementalIndicatorSeed {
10803        id: "keltner",
10804        label: "Keltner",
10805        category: "volatility",
10806        input_kind: IndicatorInputKind::Ohlc,
10807        outputs: OUTPUTS_BOLLINGER,
10808        params: PARAM_KELTNER,
10809    },
10810    SupplementalIndicatorSeed {
10811        id: "aroon",
10812        label: "Aroon",
10813        category: "trend",
10814        input_kind: IndicatorInputKind::HighLow,
10815        outputs: OUTPUTS_UP_DOWN,
10816        params: PARAM_AROON,
10817    },
10818    SupplementalIndicatorSeed {
10819        id: "aroonosc",
10820        label: "Aroon Oscillator",
10821        category: "momentum",
10822        input_kind: IndicatorInputKind::HighLow,
10823        outputs: OUTPUTS_VALUE_F64,
10824        params: PARAM_AROON,
10825    },
10826    SupplementalIndicatorSeed {
10827        id: "srsi",
10828        label: "Stochastic RSI",
10829        category: "momentum",
10830        input_kind: IndicatorInputKind::Slice,
10831        outputs: OUTPUTS_STOCH,
10832        params: PARAM_SRSI,
10833    },
10834    SupplementalIndicatorSeed {
10835        id: "stochastic_connors_rsi",
10836        label: "Stochastic Connors RSI",
10837        category: "momentum",
10838        input_kind: IndicatorInputKind::Slice,
10839        outputs: OUTPUTS_STOCH,
10840        params: PARAM_STOCHASTIC_CONNORS_RSI,
10841    },
10842    SupplementalIndicatorSeed {
10843        id: "kdj",
10844        label: "KDJ",
10845        category: "momentum",
10846        input_kind: IndicatorInputKind::Ohlc,
10847        outputs: OUTPUTS_KDJ,
10848        params: PARAM_KDJ,
10849    },
10850    SupplementalIndicatorSeed {
10851        id: "squeeze_momentum",
10852        label: "Squeeze Momentum",
10853        category: "momentum",
10854        input_kind: IndicatorInputKind::Ohlc,
10855        outputs: OUTPUTS_SQUEEZE_MOMENTUM,
10856        params: PARAM_SQUEEZE_MOMENTUM,
10857    },
10858    SupplementalIndicatorSeed {
10859        id: "wavetrend",
10860        label: "WaveTrend",
10861        category: "momentum",
10862        input_kind: IndicatorInputKind::Slice,
10863        outputs: OUTPUTS_WAVETREND,
10864        params: PARAM_WAVETREND,
10865    },
10866    SupplementalIndicatorSeed {
10867        id: "wto",
10868        label: "WTO",
10869        category: "momentum",
10870        input_kind: IndicatorInputKind::Slice,
10871        outputs: OUTPUTS_WTO,
10872        params: PARAM_WTO,
10873    },
10874    SupplementalIndicatorSeed {
10875        id: "accumulation_swing_index",
10876        label: "Accumulation Swing Index",
10877        category: "volatility",
10878        input_kind: IndicatorInputKind::Ohlc,
10879        outputs: OUTPUTS_VALUE_F64,
10880        params: PARAM_ACCUMULATION_SWING_INDEX,
10881    },
10882    SupplementalIndicatorSeed {
10883        id: "daily_factor",
10884        label: "Daily Factor",
10885        category: "momentum",
10886        input_kind: IndicatorInputKind::Ohlc,
10887        outputs: OUTPUTS_DAILY_FACTOR,
10888        params: PARAM_DAILY_FACTOR,
10889    },
10890    SupplementalIndicatorSeed {
10891        id: "moving_average_cross_probability",
10892        label: "Moving Average Cross Probability",
10893        category: "momentum",
10894        input_kind: IndicatorInputKind::Candles,
10895        outputs: OUTPUTS_MOVING_AVERAGE_CROSS_PROBABILITY,
10896        params: PARAM_MOVING_AVERAGE_CROSS_PROBABILITY,
10897    },
10898    SupplementalIndicatorSeed {
10899        id: "bulls_v_bears",
10900        label: "Bulls v Bears",
10901        category: "momentum",
10902        input_kind: IndicatorInputKind::Ohlc,
10903        outputs: OUTPUTS_BULLS_V_BEARS,
10904        params: PARAM_BULLS_V_BEARS,
10905    },
10906    SupplementalIndicatorSeed {
10907        id: "regression_slope_oscillator",
10908        label: "Regression Slope Oscillator",
10909        category: "momentum",
10910        input_kind: IndicatorInputKind::Candles,
10911        outputs: OUTPUTS_REGRESSION_SLOPE_OSCILLATOR,
10912        params: PARAM_REGRESSION_SLOPE_OSCILLATOR,
10913    },
10914    SupplementalIndicatorSeed {
10915        id: "smooth_theil_sen",
10916        label: "Smooth Theil-Sen",
10917        category: "trend",
10918        input_kind: IndicatorInputKind::Candles,
10919        outputs: OUTPUTS_SMOOTH_THEIL_SEN,
10920        params: PARAM_SMOOTH_THEIL_SEN,
10921    },
10922    SupplementalIndicatorSeed {
10923        id: "l2_ehlers_signal_to_noise",
10924        label: "L2 Ehlers Signal to Noise",
10925        category: "cycle",
10926        input_kind: IndicatorInputKind::Candles,
10927        outputs: OUTPUTS_VALUE_F64,
10928        params: PARAM_L2_EHLERS_SIGNAL_TO_NOISE,
10929    },
10930    SupplementalIndicatorSeed {
10931        id: "ehlers_smoothed_adaptive_momentum",
10932        label: "Ehlers Smoothed Adaptive Momentum",
10933        category: "cycle",
10934        input_kind: IndicatorInputKind::Candles,
10935        outputs: OUTPUTS_VALUE_F64,
10936        params: PARAM_EHLERS_SMOOTHED_ADAPTIVE_MOMENTUM,
10937    },
10938    SupplementalIndicatorSeed {
10939        id: "ehlers_adaptive_cyber_cycle",
10940        label: "Ehlers Adaptive Cyber Cycle",
10941        category: "cycle",
10942        input_kind: IndicatorInputKind::Candles,
10943        outputs: OUTPUTS_EHLERS_SIMPLE_CYCLE_INDICATOR,
10944        params: PARAM_EHLERS_ADAPTIVE_CYBER_CYCLE,
10945    },
10946    SupplementalIndicatorSeed {
10947        id: "ehlers_simple_cycle_indicator",
10948        label: "Ehlers Simple Cycle Indicator",
10949        category: "cycle",
10950        input_kind: IndicatorInputKind::Candles,
10951        outputs: OUTPUTS_EHLERS_SIMPLE_CYCLE_INDICATOR,
10952        params: PARAM_EHLERS_SIMPLE_CYCLE_INDICATOR,
10953    },
10954    SupplementalIndicatorSeed {
10955        id: "l1_ehlers_phasor",
10956        label: "L1 Ehlers Phasor",
10957        category: "cycle",
10958        input_kind: IndicatorInputKind::Candles,
10959        outputs: OUTPUTS_VALUE_F64,
10960        params: PARAM_L1_EHLERS_PHASOR,
10961    },
10962    SupplementalIndicatorSeed {
10963        id: "andean_oscillator",
10964        label: "Andean Oscillator",
10965        category: "trend",
10966        input_kind: IndicatorInputKind::Candles,
10967        outputs: OUTPUTS_ANDEAN_OSCILLATOR,
10968        params: PARAM_ANDEAN_OSCILLATOR,
10969    },
10970    SupplementalIndicatorSeed {
10971        id: "cycle_channel_oscillator",
10972        label: "Cycle Channel Oscillator",
10973        category: "cycle",
10974        input_kind: IndicatorInputKind::Candles,
10975        outputs: OUTPUTS_CYCLE_CHANNEL_OSCILLATOR,
10976        params: PARAM_CYCLE_CHANNEL_OSCILLATOR,
10977    },
10978    SupplementalIndicatorSeed {
10979        id: "ewma_volatility",
10980        label: "EWMA Volatility",
10981        category: "volatility",
10982        input_kind: IndicatorInputKind::Slice,
10983        outputs: OUTPUTS_VALUE_F64,
10984        params: PARAM_EWMA_VOLATILITY,
10985    },
10986    SupplementalIndicatorSeed {
10987        id: "ichimoku_oscillator",
10988        label: "Ichimoku Oscillator",
10989        category: "trend",
10990        input_kind: IndicatorInputKind::Candles,
10991        outputs: OUTPUTS_ICHIMOKU_OSCILLATOR,
10992        params: PARAM_ICHIMOKU_OSCILLATOR,
10993    },
10994    SupplementalIndicatorSeed {
10995        id: "random_walk_index",
10996        label: "Random Walk Index",
10997        category: "volatility",
10998        input_kind: IndicatorInputKind::Ohlc,
10999        outputs: OUTPUTS_RANDOM_WALK_INDEX,
11000        params: PARAM_RANDOM_WALK_INDEX,
11001    },
11002    SupplementalIndicatorSeed {
11003        id: "price_moving_average_ratio_percentile",
11004        label: "Price Moving Average Ratio & Percentile",
11005        category: "momentum",
11006        input_kind: IndicatorInputKind::Candles,
11007        outputs: OUTPUTS_PRICE_MOVING_AVERAGE_RATIO_PERCENTILE,
11008        params: PARAM_PRICE_MOVING_AVERAGE_RATIO_PERCENTILE,
11009    },
11010    SupplementalIndicatorSeed {
11011        id: "relative_strength_index_wave_indicator",
11012        label: "Relative Strength Index Wave Indicator",
11013        category: "momentum",
11014        input_kind: IndicatorInputKind::Candles,
11015        outputs: OUTPUTS_RELATIVE_STRENGTH_INDEX_WAVE_INDICATOR,
11016        params: PARAM_RELATIVE_STRENGTH_INDEX_WAVE_INDICATOR,
11017    },
11018    SupplementalIndicatorSeed {
11019        id: "mesa_stochastic_multi_length",
11020        label: "MESA Stochastic Multi Length",
11021        category: "momentum",
11022        input_kind: IndicatorInputKind::Candles,
11023        outputs: OUTPUTS_MESA_STOCHASTIC_MULTI_LENGTH,
11024        params: PARAM_MESA_STOCHASTIC_MULTI_LENGTH,
11025    },
11026    SupplementalIndicatorSeed {
11027        id: "spearman_correlation",
11028        label: "Spearman Correlation",
11029        category: "relative_strength",
11030        input_kind: IndicatorInputKind::Candles,
11031        outputs: OUTPUTS_SPEARMAN_CORRELATION,
11032        params: PARAM_SPEARMAN_CORRELATION,
11033    },
11034    SupplementalIndicatorSeed {
11035        id: "trend_trigger_factor",
11036        label: "Trend Trigger Factor",
11037        category: "momentum",
11038        input_kind: IndicatorInputKind::HighLow,
11039        outputs: OUTPUTS_VALUE_F64,
11040        params: PARAM_TREND_TRIGGER_FACTOR,
11041    },
11042    SupplementalIndicatorSeed {
11043        id: "volatility_quality_index",
11044        label: "Volatility Quality Index",
11045        category: "volatility",
11046        input_kind: IndicatorInputKind::Ohlc,
11047        outputs: OUTPUTS_VOLATILITY_QUALITY_INDEX,
11048        params: PARAM_VOLATILITY_QUALITY_INDEX,
11049    },
11050    SupplementalIndicatorSeed {
11051        id: "yang_zhang_volatility",
11052        label: "Yang-Zhang Volatility",
11053        category: "volatility",
11054        input_kind: IndicatorInputKind::Ohlc,
11055        outputs: OUTPUTS_YANG_ZHANG,
11056        params: PARAM_YANG_ZHANG,
11057    },
11058    SupplementalIndicatorSeed {
11059        id: "garman_klass_volatility",
11060        label: "Garman-Klass Volatility",
11061        category: "volatility",
11062        input_kind: IndicatorInputKind::Ohlc,
11063        outputs: OUTPUTS_VALUE_F64,
11064        params: PARAM_GARMAN_KLASS,
11065    },
11066    SupplementalIndicatorSeed {
11067        id: "parkinson_volatility",
11068        label: "Parkinson Volatility",
11069        category: "volatility",
11070        input_kind: IndicatorInputKind::HighLow,
11071        outputs: OUTPUTS_PARKINSON,
11072        params: PARAM_PARKINSON,
11073    },
11074    SupplementalIndicatorSeed {
11075        id: "atr_percentile",
11076        label: "ATR Percentile",
11077        category: "volatility",
11078        input_kind: IndicatorInputKind::Ohlc,
11079        outputs: OUTPUTS_VALUE_F64,
11080        params: PARAM_ATR_PERCENTILE,
11081    },
11082    SupplementalIndicatorSeed {
11083        id: "advance_decline_line",
11084        label: "Advance-Decline Line",
11085        category: "breadth",
11086        input_kind: IndicatorInputKind::Slice,
11087        outputs: OUTPUTS_VALUE_F64,
11088        params: PARAM_NONE,
11089    },
11090    SupplementalIndicatorSeed {
11091        id: "decisionpoint_breadth_swenlin_trading_oscillator",
11092        label: "DecisionPoint Breadth Swenlin Trading Oscillator",
11093        category: "breadth",
11094        input_kind: IndicatorInputKind::HighLow,
11095        outputs: OUTPUTS_VALUE_F64,
11096        params: PARAM_NONE,
11097    },
11098    SupplementalIndicatorSeed {
11099        id: "velocity_acceleration_indicator",
11100        label: "Velocity Acceleration Indicator",
11101        category: "momentum",
11102        input_kind: IndicatorInputKind::Candles,
11103        outputs: OUTPUTS_VALUE_F64,
11104        params: PARAM_VELOCITY_ACCELERATION_INDICATOR,
11105    },
11106    SupplementalIndicatorSeed {
11107        id: "normalized_resonator",
11108        label: "Normalized Resonator",
11109        category: "cycle",
11110        input_kind: IndicatorInputKind::Candles,
11111        outputs: OUTPUTS_OSCILLATOR_SIGNAL,
11112        params: PARAM_NORMALIZED_RESONATOR,
11113    },
11114    SupplementalIndicatorSeed {
11115        id: "monotonicity_index",
11116        label: "Monotonicity Index",
11117        category: "statistics",
11118        input_kind: IndicatorInputKind::Candles,
11119        outputs: OUTPUTS_MONOTONICITY_INDEX,
11120        params: PARAM_MONOTONICITY_INDEX,
11121    },
11122    SupplementalIndicatorSeed {
11123        id: "half_causal_estimator",
11124        label: "Half Causal Estimator",
11125        category: "statistics",
11126        input_kind: IndicatorInputKind::Candles,
11127        outputs: OUTPUTS_HALF_CAUSAL_ESTIMATOR,
11128        params: PARAM_HALF_CAUSAL_ESTIMATOR,
11129    },
11130    SupplementalIndicatorSeed {
11131        id: "bull_power_vs_bear_power",
11132        label: "Bull Power vs Bear Power",
11133        category: "momentum",
11134        input_kind: IndicatorInputKind::Ohlc,
11135        outputs: OUTPUTS_VALUE_F64,
11136        params: PARAM_BULL_POWER_VS_BEAR_POWER,
11137    },
11138    SupplementalIndicatorSeed {
11139        id: "historical_volatility",
11140        label: "Historical Volatility",
11141        category: "volatility",
11142        input_kind: IndicatorInputKind::Slice,
11143        outputs: OUTPUTS_VALUE_F64,
11144        params: PARAM_HISTORICAL_VOLATILITY,
11145    },
11146    SupplementalIndicatorSeed {
11147        id: "absolute_strength_index_oscillator",
11148        label: "Absolute Strength Index Oscillator",
11149        category: "momentum",
11150        input_kind: IndicatorInputKind::Slice,
11151        outputs: OUTPUTS_OSCILLATOR_SIGNAL_HISTOGRAM,
11152        params: PARAM_ABSOLUTE_STRENGTH_INDEX_OSCILLATOR,
11153    },
11154    SupplementalIndicatorSeed {
11155        id: "adaptive_bandpass_trigger_oscillator",
11156        label: "Adaptive Bandpass Trigger Oscillator",
11157        category: "cycle",
11158        input_kind: IndicatorInputKind::Slice,
11159        outputs: OUTPUTS_IN_PHASE_LEAD,
11160        params: PARAM_ADAPTIVE_BANDPASS_TRIGGER_OSCILLATOR,
11161    },
11162    SupplementalIndicatorSeed {
11163        id: "premier_rsi_oscillator",
11164        label: "Premier RSI Oscillator",
11165        category: "momentum",
11166        input_kind: IndicatorInputKind::Slice,
11167        outputs: OUTPUTS_VALUE_F64,
11168        params: PARAM_PREMIER_RSI_OSCILLATOR,
11169    },
11170    SupplementalIndicatorSeed {
11171        id: "multi_length_stochastic_average",
11172        label: "Multi-Length Stochastic Average",
11173        category: "momentum",
11174        input_kind: IndicatorInputKind::Candles,
11175        outputs: OUTPUTS_VALUE_F64,
11176        params: PARAM_MULTI_LENGTH_STOCHASTIC_AVERAGE,
11177    },
11178    SupplementalIndicatorSeed {
11179        id: "hull_butterfly_oscillator",
11180        label: "Hull Butterfly Oscillator",
11181        category: "momentum",
11182        input_kind: IndicatorInputKind::Candles,
11183        outputs: OUTPUTS_HULL_BUTTERFLY_OSCILLATOR,
11184        params: PARAM_HULL_BUTTERFLY_OSCILLATOR,
11185    },
11186    SupplementalIndicatorSeed {
11187        id: "fibonacci_trailing_stop",
11188        label: "Fibonacci Trailing Stop",
11189        category: "trend",
11190        input_kind: IndicatorInputKind::Ohlc,
11191        outputs: OUTPUTS_FIBONACCI_TRAILING_STOP,
11192        params: PARAM_FIBONACCI_TRAILING_STOP,
11193    },
11194    SupplementalIndicatorSeed {
11195        id: "fibonacci_entry_bands",
11196        label: "Fibonacci Entry Bands",
11197        category: "trend",
11198        input_kind: IndicatorInputKind::Ohlc,
11199        outputs: OUTPUTS_FIBONACCI_ENTRY_BANDS,
11200        params: PARAM_FIBONACCI_ENTRY_BANDS,
11201    },
11202    SupplementalIndicatorSeed {
11203        id: "volume_energy_reservoirs",
11204        label: "Volume Energy Reservoirs",
11205        category: "volume",
11206        input_kind: IndicatorInputKind::Ohlcv,
11207        outputs: OUTPUTS_VOLUME_ENERGY_RESERVOIRS,
11208        params: PARAM_VOLUME_ENERGY_RESERVOIRS,
11209    },
11210    SupplementalIndicatorSeed {
11211        id: "neighboring_trailing_stop",
11212        label: "Neighboring Trailing Stop",
11213        category: "trend",
11214        input_kind: IndicatorInputKind::Ohlc,
11215        outputs: OUTPUTS_NEIGHBORING_TRAILING_STOP,
11216        params: PARAM_NEIGHBORING_TRAILING_STOP,
11217    },
11218    SupplementalIndicatorSeed {
11219        id: "macd_wave_signal_pro",
11220        label: "MACD Wave Signal Pro",
11221        category: "momentum",
11222        input_kind: IndicatorInputKind::Ohlc,
11223        outputs: OUTPUTS_MACD_WAVE_SIGNAL_PRO,
11224        params: PARAM_NONE,
11225    },
11226    SupplementalIndicatorSeed {
11227        id: "hema_trend_levels",
11228        label: "HEMA Trend Levels",
11229        category: "trend",
11230        input_kind: IndicatorInputKind::Ohlc,
11231        outputs: OUTPUTS_HEMA_TREND_LEVELS,
11232        params: PARAM_HEMA_TREND_LEVELS,
11233    },
11234    SupplementalIndicatorSeed {
11235        id: "grover_llorens_cycle_oscillator",
11236        label: "Grover Llorens Cycle Oscillator",
11237        category: "cycle",
11238        input_kind: IndicatorInputKind::Ohlc,
11239        outputs: OUTPUTS_VALUE_F64,
11240        params: PARAM_GROVER_LLORENS_CYCLE_OSCILLATOR,
11241    },
11242    SupplementalIndicatorSeed {
11243        id: "squeeze_index",
11244        label: "Squeeze Index",
11245        category: "volatility",
11246        input_kind: IndicatorInputKind::Slice,
11247        outputs: OUTPUTS_VALUE_F64,
11248        params: PARAM_SQUEEZE_INDEX,
11249    },
11250    SupplementalIndicatorSeed {
11251        id: "stochastic_distance",
11252        label: "Stochastic Distance",
11253        category: "momentum",
11254        input_kind: IndicatorInputKind::Slice,
11255        outputs: OUTPUTS_OSCILLATOR_SIGNAL,
11256        params: PARAM_STOCHASTIC_DISTANCE,
11257    },
11258    SupplementalIndicatorSeed {
11259        id: "vertical_horizontal_filter",
11260        label: "Vertical Horizontal Filter",
11261        category: "trend",
11262        input_kind: IndicatorInputKind::Slice,
11263        outputs: OUTPUTS_VALUE_F64,
11264        params: PARAM_VERTICAL_HORIZONTAL_FILTER,
11265    },
11266    SupplementalIndicatorSeed {
11267        id: "intraday_momentum_index",
11268        label: "Intraday Momentum Index",
11269        category: "momentum",
11270        input_kind: IndicatorInputKind::Ohlc,
11271        outputs: &[
11272            OUTPUT_IMI,
11273            OUTPUT_UPPER_HIT,
11274            OUTPUT_LOWER_HIT,
11275            OUTPUT_SIGNAL,
11276        ],
11277        params: PARAM_INTRADAY_MOMENTUM_INDEX,
11278    },
11279    SupplementalIndicatorSeed {
11280        id: "vwap_zscore_with_signals",
11281        label: "VWAP Z-Score With Signals",
11282        category: "volume",
11283        input_kind: IndicatorInputKind::CloseVolume,
11284        outputs: &[
11285            OUTPUT_ZVWAP,
11286            OUTPUT_SUPPORT_SIGNAL,
11287            OUTPUT_RESISTANCE_SIGNAL,
11288        ],
11289        params: PARAM_VWAP_ZSCORE_WITH_SIGNALS,
11290    },
11291    SupplementalIndicatorSeed {
11292        id: "demand_index",
11293        label: "Demand Index",
11294        category: "volume",
11295        input_kind: IndicatorInputKind::Ohlcv,
11296        outputs: &[OUTPUT_DEMAND_INDEX, OUTPUT_SIGNAL],
11297        params: PARAM_DEMAND_INDEX,
11298    },
11299    SupplementalIndicatorSeed {
11300        id: "didi_index",
11301        label: "Didi Index",
11302        category: "momentum",
11303        input_kind: IndicatorInputKind::Slice,
11304        outputs: &[
11305            OUTPUT_SHORT,
11306            OUTPUT_LONG,
11307            OUTPUT_CROSSOVER,
11308            OUTPUT_CROSSUNDER,
11309        ],
11310        params: PARAM_DIDI_INDEX,
11311    },
11312    SupplementalIndicatorSeed {
11313        id: "ehlers_autocorrelation_periodogram",
11314        label: "Ehlers Autocorrelation Periodogram",
11315        category: "cycle",
11316        input_kind: IndicatorInputKind::Slice,
11317        outputs: &[OUTPUT_DOMINANT_CYCLE, OUTPUT_NORMALIZED_POWER],
11318        params: PARAM_EHLERS_AUTOCORRELATION_PERIODOGRAM,
11319    },
11320    SupplementalIndicatorSeed {
11321        id: "ehlers_linear_extrapolation_predictor",
11322        label: "Ehlers Linear Extrapolation Predictor",
11323        category: "cycle",
11324        input_kind: IndicatorInputKind::Slice,
11325        outputs: &[
11326            OUTPUT_PREDICTION,
11327            OUTPUT_FILTER,
11328            OUTPUT_STATE,
11329            OUTPUT_GO_LONG,
11330            OUTPUT_GO_SHORT,
11331        ],
11332        params: PARAM_EHLERS_LINEAR_EXTRAPOLATION_PREDICTOR,
11333    },
11334    SupplementalIndicatorSeed {
11335        id: "kase_peak_oscillator_with_divergences",
11336        label: "Kase Peak Oscillator With Divergences",
11337        category: "momentum",
11338        input_kind: IndicatorInputKind::Ohlc,
11339        outputs: &[
11340            OUTPUT_OSCILLATOR,
11341            OUTPUT_HIST,
11342            OUTPUT_MAX_PEAK_VALUE,
11343            OUTPUT_MIN_PEAK_VALUE,
11344            OUTPUT_MARKET_EXTREME,
11345            OUTPUT_REGULAR_BULLISH,
11346            OUTPUT_HIDDEN_BULLISH,
11347            OUTPUT_REGULAR_BEARISH,
11348            OUTPUT_HIDDEN_BEARISH,
11349            OUTPUT_GO_LONG,
11350            OUTPUT_GO_SHORT,
11351        ],
11352        params: PARAM_KASE_PEAK_OSCILLATOR_WITH_DIVERGENCES,
11353    },
11354    SupplementalIndicatorSeed {
11355        id: "gopalakrishnan_range_index",
11356        label: "Gopalakrishnan Range Index",
11357        category: "volatility",
11358        input_kind: IndicatorInputKind::HighLow,
11359        outputs: OUTPUTS_VALUE_F64,
11360        params: PARAM_GOPALAKRISHNAN_RANGE_INDEX,
11361    },
11362    SupplementalIndicatorSeed {
11363        id: "atr",
11364        label: "ATR",
11365        category: "volatility",
11366        input_kind: IndicatorInputKind::Ohlc,
11367        outputs: OUTPUTS_VALUE_F64,
11368        params: PARAM_ATR_PERIOD,
11369    },
11370    SupplementalIndicatorSeed {
11371        id: "ad",
11372        label: "AD",
11373        category: "volume",
11374        input_kind: IndicatorInputKind::Ohlcv,
11375        outputs: OUTPUTS_VALUE_F64,
11376        params: PARAM_NONE,
11377    },
11378    SupplementalIndicatorSeed {
11379        id: "adosc",
11380        label: "ADOSC",
11381        category: "volume",
11382        input_kind: IndicatorInputKind::Ohlcv,
11383        outputs: OUTPUTS_VALUE_F64,
11384        params: PARAM_ADOSC,
11385    },
11386    SupplementalIndicatorSeed {
11387        id: "ao",
11388        label: "AO",
11389        category: "momentum",
11390        input_kind: IndicatorInputKind::HighLow,
11391        outputs: OUTPUTS_VALUE_F64,
11392        params: PARAM_AO,
11393    },
11394    SupplementalIndicatorSeed {
11395        id: "bop",
11396        label: "BOP",
11397        category: "momentum",
11398        input_kind: IndicatorInputKind::Ohlc,
11399        outputs: OUTPUTS_VALUE_F64,
11400        params: PARAM_NONE,
11401    },
11402    SupplementalIndicatorSeed {
11403        id: "emv",
11404        label: "EMV",
11405        category: "volume",
11406        input_kind: IndicatorInputKind::Ohlcv,
11407        outputs: OUTPUTS_VALUE_F64,
11408        params: PARAM_NONE,
11409    },
11410    SupplementalIndicatorSeed {
11411        id: "efi",
11412        label: "EFI",
11413        category: "volume",
11414        input_kind: IndicatorInputKind::CloseVolume,
11415        outputs: OUTPUTS_VALUE_F64,
11416        params: PARAM_EFI_PERIOD,
11417    },
11418    SupplementalIndicatorSeed {
11419        id: "dti",
11420        label: "DTI",
11421        category: "momentum",
11422        input_kind: IndicatorInputKind::HighLow,
11423        outputs: OUTPUTS_VALUE_F64,
11424        params: PARAM_DTI,
11425    },
11426    SupplementalIndicatorSeed {
11427        id: "mfi",
11428        label: "MFI",
11429        category: "volume",
11430        input_kind: IndicatorInputKind::CloseVolume,
11431        outputs: OUTPUTS_VALUE_F64,
11432        params: PARAM_MFI_PERIOD,
11433    },
11434    SupplementalIndicatorSeed {
11435        id: "volume_weighted_rsi",
11436        label: "Volume Weighted RSI",
11437        category: "volume",
11438        input_kind: IndicatorInputKind::CloseVolume,
11439        outputs: OUTPUTS_VALUE_F64,
11440        params: PARAM_RSI_PERIOD,
11441    },
11442    SupplementalIndicatorSeed {
11443        id: "mass",
11444        label: "MASS",
11445        category: "volatility",
11446        input_kind: IndicatorInputKind::HighLow,
11447        outputs: OUTPUTS_VALUE_F64,
11448        params: PARAM_MASS_PERIOD,
11449    },
11450    SupplementalIndicatorSeed {
11451        id: "kvo",
11452        label: "KVO",
11453        category: "volume",
11454        input_kind: IndicatorInputKind::Ohlcv,
11455        outputs: OUTPUTS_VALUE_F64,
11456        params: PARAM_KVO,
11457    },
11458    SupplementalIndicatorSeed {
11459        id: "vosc",
11460        label: "VOSC",
11461        category: "volume",
11462        input_kind: IndicatorInputKind::Slice,
11463        outputs: OUTPUTS_VALUE_F64,
11464        params: PARAM_VOSC,
11465    },
11466    SupplementalIndicatorSeed {
11467        id: "rsi",
11468        label: "RSI",
11469        category: "momentum",
11470        input_kind: IndicatorInputKind::Slice,
11471        outputs: OUTPUTS_VALUE_F64,
11472        params: PARAM_RSI_PERIOD,
11473    },
11474    SupplementalIndicatorSeed {
11475        id: "rsx",
11476        label: "RSX",
11477        category: "momentum",
11478        input_kind: IndicatorInputKind::Slice,
11479        outputs: OUTPUTS_VALUE_F64,
11480        params: PARAM_RSI_PERIOD,
11481    },
11482    SupplementalIndicatorSeed {
11483        id: "roc",
11484        label: "ROC",
11485        category: "momentum",
11486        input_kind: IndicatorInputKind::Slice,
11487        outputs: OUTPUTS_VALUE_F64,
11488        params: PARAM_ROC_PERIOD,
11489    },
11490    SupplementalIndicatorSeed {
11491        id: "linear_correlation_oscillator",
11492        label: "Linear Correlation Oscillator",
11493        category: "momentum",
11494        input_kind: IndicatorInputKind::Slice,
11495        outputs: OUTPUTS_VALUE_F64,
11496        params: PARAM_LINEAR_CORRELATION_OSCILLATOR_PERIOD,
11497    },
11498    SupplementalIndicatorSeed {
11499        id: "ehlers_fm_demodulator",
11500        label: "Ehlers FM Demodulator",
11501        category: "momentum",
11502        input_kind: IndicatorInputKind::Ohlc,
11503        outputs: OUTPUTS_VALUE_F64,
11504        params: PARAM_EHLERS_FM_DEMODULATOR_PERIOD,
11505    },
11506    SupplementalIndicatorSeed {
11507        id: "ehlers_adaptive_cg",
11508        label: "Ehlers Adaptive CG",
11509        category: "momentum",
11510        input_kind: IndicatorInputKind::Slice,
11511        outputs: OUTPUTS_EHLERS_ADAPTIVE_CG,
11512        params: PARAM_EHLERS_ADAPTIVE_CG,
11513    },
11514    SupplementalIndicatorSeed {
11515        id: "adaptive_momentum_oscillator",
11516        label: "Adaptive Momentum Oscillator",
11517        category: "momentum",
11518        input_kind: IndicatorInputKind::Slice,
11519        outputs: OUTPUTS_ADAPTIVE_MOMENTUM_OSCILLATOR,
11520        params: PARAM_ADAPTIVE_MOMENTUM_OSCILLATOR,
11521    },
11522    SupplementalIndicatorSeed {
11523        id: "velocity",
11524        label: "Velocity",
11525        category: "momentum",
11526        input_kind: IndicatorInputKind::Slice,
11527        outputs: OUTPUTS_VALUE_F64,
11528        params: PARAM_VELOCITY,
11529    },
11530    SupplementalIndicatorSeed {
11531        id: "normalized_volume_true_range",
11532        label: "Normalized Volume True Range",
11533        category: "volume",
11534        input_kind: IndicatorInputKind::Ohlcv,
11535        outputs: OUTPUTS_NORMALIZED_VOLUME_TRUE_RANGE,
11536        params: PARAM_NORMALIZED_VOLUME_TRUE_RANGE,
11537    },
11538    SupplementalIndicatorSeed {
11539        id: "exponential_trend",
11540        label: "Exponential Trend",
11541        category: "trend",
11542        input_kind: IndicatorInputKind::Ohlc,
11543        outputs: OUTPUTS_EXPONENTIAL_TREND,
11544        params: PARAM_EXPONENTIAL_TREND,
11545    },
11546    SupplementalIndicatorSeed {
11547        id: "trend_flow_trail",
11548        label: "Trend Flow Trail",
11549        category: "trend",
11550        input_kind: IndicatorInputKind::Ohlcv,
11551        outputs: OUTPUTS_TREND_FLOW_TRAIL,
11552        params: PARAM_TREND_FLOW_TRAIL,
11553    },
11554    SupplementalIndicatorSeed {
11555        id: "range_breakout_signals",
11556        label: "Range Breakout Signals",
11557        category: "trend",
11558        input_kind: IndicatorInputKind::Ohlcv,
11559        outputs: OUTPUTS_RANGE_BREAKOUT_SIGNALS,
11560        params: PARAM_RANGE_BREAKOUT_SIGNALS,
11561    },
11562    SupplementalIndicatorSeed {
11563        id: "apo",
11564        label: "APO",
11565        category: "momentum",
11566        input_kind: IndicatorInputKind::Slice,
11567        outputs: OUTPUTS_VALUE_F64,
11568        params: PARAM_APO,
11569    },
11570    SupplementalIndicatorSeed {
11571        id: "cci",
11572        label: "CCI",
11573        category: "momentum",
11574        input_kind: IndicatorInputKind::Slice,
11575        outputs: OUTPUTS_VALUE_F64,
11576        params: PARAM_CCI_PERIOD,
11577    },
11578    SupplementalIndicatorSeed {
11579        id: "cci_cycle",
11580        label: "CCI Cycle",
11581        category: "momentum",
11582        input_kind: IndicatorInputKind::Slice,
11583        outputs: OUTPUTS_VALUE_F64,
11584        params: PARAM_CCI_CYCLE,
11585    },
11586    SupplementalIndicatorSeed {
11587        id: "cfo",
11588        label: "CFO",
11589        category: "momentum",
11590        input_kind: IndicatorInputKind::Slice,
11591        outputs: OUTPUTS_VALUE_F64,
11592        params: PARAM_CFO,
11593    },
11594    SupplementalIndicatorSeed {
11595        id: "cg",
11596        label: "CG",
11597        category: "momentum",
11598        input_kind: IndicatorInputKind::Slice,
11599        outputs: OUTPUTS_VALUE_F64,
11600        params: PARAM_CG_PERIOD,
11601    },
11602    SupplementalIndicatorSeed {
11603        id: "er",
11604        label: "ER",
11605        category: "momentum",
11606        input_kind: IndicatorInputKind::Slice,
11607        outputs: OUTPUTS_VALUE_F64,
11608        params: PARAM_ER_PERIOD,
11609    },
11610    SupplementalIndicatorSeed {
11611        id: "kurtosis",
11612        label: "Kurtosis",
11613        category: "statistics",
11614        input_kind: IndicatorInputKind::Slice,
11615        outputs: OUTPUTS_VALUE_F64,
11616        params: PARAM_KURTOSIS_PERIOD,
11617    },
11618    SupplementalIndicatorSeed {
11619        id: "natr",
11620        label: "NATR",
11621        category: "volatility",
11622        input_kind: IndicatorInputKind::Ohlc,
11623        outputs: OUTPUTS_VALUE_F64,
11624        params: PARAM_NATR_PERIOD,
11625    },
11626    SupplementalIndicatorSeed {
11627        id: "mean_ad",
11628        label: "Mean AD",
11629        category: "statistics",
11630        input_kind: IndicatorInputKind::Slice,
11631        outputs: OUTPUTS_VALUE_F64,
11632        params: PARAM_MEAN_AD_PERIOD,
11633    },
11634    SupplementalIndicatorSeed {
11635        id: "medium_ad",
11636        label: "Medium AD",
11637        category: "statistics",
11638        input_kind: IndicatorInputKind::Slice,
11639        outputs: OUTPUTS_VALUE_F64,
11640        params: PARAM_MEDIUM_AD_PERIOD,
11641    },
11642    SupplementalIndicatorSeed {
11643        id: "deviation",
11644        label: "Deviation",
11645        category: "statistics",
11646        input_kind: IndicatorInputKind::Slice,
11647        outputs: OUTPUTS_VALUE_F64,
11648        params: PARAM_DEVIATION,
11649    },
11650    SupplementalIndicatorSeed {
11651        id: "dpo",
11652        label: "DPO",
11653        category: "trend",
11654        input_kind: IndicatorInputKind::Slice,
11655        outputs: OUTPUTS_VALUE_F64,
11656        params: PARAM_DPO_PERIOD,
11657    },
11658    SupplementalIndicatorSeed {
11659        id: "fosc",
11660        label: "FOSC",
11661        category: "momentum",
11662        input_kind: IndicatorInputKind::Slice,
11663        outputs: OUTPUTS_VALUE_F64,
11664        params: PARAM_FOSC_PERIOD,
11665    },
11666    SupplementalIndicatorSeed {
11667        id: "ift_rsi",
11668        label: "IFT RSI",
11669        category: "momentum",
11670        input_kind: IndicatorInputKind::Slice,
11671        outputs: OUTPUTS_VALUE_F64,
11672        params: PARAM_IFT_RSI,
11673    },
11674    SupplementalIndicatorSeed {
11675        id: "linearreg_angle",
11676        label: "Linear Regression Angle",
11677        category: "trend",
11678        input_kind: IndicatorInputKind::Slice,
11679        outputs: OUTPUTS_VALUE_F64,
11680        params: PARAM_LINEARREG_ANGLE_PERIOD,
11681    },
11682    SupplementalIndicatorSeed {
11683        id: "linearreg_intercept",
11684        label: "Linear Regression Intercept",
11685        category: "trend",
11686        input_kind: IndicatorInputKind::Slice,
11687        outputs: OUTPUTS_VALUE_F64,
11688        params: PARAM_LINEARREG_INTERCEPT_PERIOD,
11689    },
11690    SupplementalIndicatorSeed {
11691        id: "linearreg_slope",
11692        label: "Linear Regression Slope",
11693        category: "trend",
11694        input_kind: IndicatorInputKind::Slice,
11695        outputs: OUTPUTS_VALUE_F64,
11696        params: PARAM_LINEARREG_SLOPE_PERIOD,
11697    },
11698    SupplementalIndicatorSeed {
11699        id: "pfe",
11700        label: "PFE",
11701        category: "trend",
11702        input_kind: IndicatorInputKind::Slice,
11703        outputs: OUTPUTS_VALUE_F64,
11704        params: PARAM_PFE,
11705    },
11706    SupplementalIndicatorSeed {
11707        id: "qstick",
11708        label: "QStick",
11709        category: "trend",
11710        input_kind: IndicatorInputKind::Ohlc,
11711        outputs: OUTPUTS_VALUE_F64,
11712        params: PARAM_QSTICK,
11713    },
11714    SupplementalIndicatorSeed {
11715        id: "reverse_rsi",
11716        label: "Reverse RSI",
11717        category: "momentum",
11718        input_kind: IndicatorInputKind::Slice,
11719        outputs: OUTPUTS_VALUE_F64,
11720        params: PARAM_REVERSE_RSI,
11721    },
11722    SupplementalIndicatorSeed {
11723        id: "percentile_nearest_rank",
11724        label: "Percentile Nearest Rank",
11725        category: "statistics",
11726        input_kind: IndicatorInputKind::Slice,
11727        outputs: OUTPUTS_VALUE_F64,
11728        params: PARAM_PERCENTILE_NEAREST_RANK,
11729    },
11730    SupplementalIndicatorSeed {
11731        id: "ui",
11732        label: "UI",
11733        category: "volatility",
11734        input_kind: IndicatorInputKind::Slice,
11735        outputs: OUTPUTS_VALUE_F64,
11736        params: PARAM_UI,
11737    },
11738    SupplementalIndicatorSeed {
11739        id: "zscore",
11740        label: "Zscore",
11741        category: "statistics",
11742        input_kind: IndicatorInputKind::Slice,
11743        outputs: OUTPUTS_VALUE_F64,
11744        params: PARAM_ZSCORE,
11745    },
11746    SupplementalIndicatorSeed {
11747        id: "medprice",
11748        label: "Medprice",
11749        category: "price",
11750        input_kind: IndicatorInputKind::HighLow,
11751        outputs: OUTPUTS_VALUE_F64,
11752        params: PARAM_NONE,
11753    },
11754    SupplementalIndicatorSeed {
11755        id: "midpoint",
11756        label: "Midpoint",
11757        category: "price",
11758        input_kind: IndicatorInputKind::Slice,
11759        outputs: OUTPUTS_VALUE_F64,
11760        params: PARAM_MIDPOINT_PERIOD,
11761    },
11762    SupplementalIndicatorSeed {
11763        id: "midprice",
11764        label: "Midprice",
11765        category: "price",
11766        input_kind: IndicatorInputKind::HighLow,
11767        outputs: OUTPUTS_VALUE_F64,
11768        params: PARAM_MIDPRICE_PERIOD,
11769    },
11770    SupplementalIndicatorSeed {
11771        id: "wclprice",
11772        label: "WCLPRICE",
11773        category: "price",
11774        input_kind: IndicatorInputKind::Ohlc,
11775        outputs: OUTPUTS_VALUE_F64,
11776        params: PARAM_NONE,
11777    },
11778    SupplementalIndicatorSeed {
11779        id: "obv",
11780        label: "OBV",
11781        category: "volume",
11782        input_kind: IndicatorInputKind::CloseVolume,
11783        outputs: OUTPUTS_VALUE_F64,
11784        params: PARAM_NONE,
11785    },
11786    SupplementalIndicatorSeed {
11787        id: "vpt",
11788        label: "VPT",
11789        category: "volume",
11790        input_kind: IndicatorInputKind::CloseVolume,
11791        outputs: OUTPUTS_VALUE_F64,
11792        params: PARAM_NONE,
11793    },
11794    SupplementalIndicatorSeed {
11795        id: "nvi",
11796        label: "NVI",
11797        category: "volume",
11798        input_kind: IndicatorInputKind::CloseVolume,
11799        outputs: OUTPUTS_VALUE_F64,
11800        params: PARAM_NONE,
11801    },
11802    SupplementalIndicatorSeed {
11803        id: "pvi",
11804        label: "PVI",
11805        category: "volume",
11806        input_kind: IndicatorInputKind::CloseVolume,
11807        outputs: OUTPUTS_VALUE_F64,
11808        params: PARAM_PVI,
11809    },
11810    SupplementalIndicatorSeed {
11811        id: "mom",
11812        label: "MOM",
11813        category: "momentum",
11814        input_kind: IndicatorInputKind::Slice,
11815        outputs: OUTPUTS_VALUE_F64,
11816        params: PARAM_MOM_PERIOD,
11817    },
11818    SupplementalIndicatorSeed {
11819        id: "cmo",
11820        label: "CMO",
11821        category: "momentum",
11822        input_kind: IndicatorInputKind::Slice,
11823        outputs: OUTPUTS_VALUE_F64,
11824        params: PARAM_CMO_PERIOD,
11825    },
11826    SupplementalIndicatorSeed {
11827        id: "dec_osc",
11828        label: "Dec Osc",
11829        category: "momentum",
11830        input_kind: IndicatorInputKind::Slice,
11831        outputs: OUTPUTS_VALUE_F64,
11832        params: PARAM_DEC_OSC,
11833    },
11834    SupplementalIndicatorSeed {
11835        id: "lrsi",
11836        label: "LRSI",
11837        category: "momentum",
11838        input_kind: IndicatorInputKind::HighLow,
11839        outputs: OUTPUTS_VALUE_F64,
11840        params: PARAM_LRSI_ALPHA,
11841    },
11842    SupplementalIndicatorSeed {
11843        id: "rocp",
11844        label: "ROCP",
11845        category: "momentum",
11846        input_kind: IndicatorInputKind::Slice,
11847        outputs: OUTPUTS_VALUE_F64,
11848        params: PARAM_ROCP_PERIOD,
11849    },
11850    SupplementalIndicatorSeed {
11851        id: "rocr",
11852        label: "ROCR",
11853        category: "momentum",
11854        input_kind: IndicatorInputKind::Slice,
11855        outputs: OUTPUTS_VALUE_F64,
11856        params: PARAM_ROCR_PERIOD,
11857    },
11858    SupplementalIndicatorSeed {
11859        id: "tsf",
11860        label: "TSF",
11861        category: "trend",
11862        input_kind: IndicatorInputKind::Slice,
11863        outputs: OUTPUTS_VALUE_F64,
11864        params: PARAM_TSF_PERIOD,
11865    },
11866    SupplementalIndicatorSeed {
11867        id: "adaptive_macd",
11868        label: "Adaptive MACD",
11869        category: "momentum",
11870        input_kind: IndicatorInputKind::Slice,
11871        outputs: OUTPUTS_MACD,
11872        params: PARAM_ADAPTIVE_MACD,
11873    },
11874    SupplementalIndicatorSeed {
11875        id: "polynomial_regression_extrapolation",
11876        label: "Polynomial Regression Extrapolation",
11877        category: "trend",
11878        input_kind: IndicatorInputKind::Slice,
11879        outputs: OUTPUTS_VALUE_F64,
11880        params: PARAM_POLYNOMIAL_REGRESSION_EXTRAPOLATION,
11881    },
11882    SupplementalIndicatorSeed {
11883        id: "statistical_trailing_stop",
11884        label: "Statistical Trailing Stop",
11885        category: "trend",
11886        input_kind: IndicatorInputKind::Ohlc,
11887        outputs: OUTPUTS_STATISTICAL_TRAILING_STOP,
11888        params: PARAM_STATISTICAL_TRAILING_STOP,
11889    },
11890    SupplementalIndicatorSeed {
11891        id: "standardized_psar_oscillator",
11892        label: "Standardized PSAR Oscillator",
11893        category: "momentum",
11894        input_kind: IndicatorInputKind::Ohlc,
11895        outputs: OUTPUTS_STANDARDIZED_PSAR_OSCILLATOR,
11896        params: PARAM_STANDARDIZED_PSAR_OSCILLATOR,
11897    },
11898    SupplementalIndicatorSeed {
11899        id: "geometric_bias_oscillator",
11900        label: "Geometric Bias Oscillator",
11901        category: "momentum",
11902        input_kind: IndicatorInputKind::Ohlc,
11903        outputs: OUTPUTS_VALUE_F64,
11904        params: PARAM_GEOMETRIC_BIAS_OSCILLATOR,
11905    },
11906    SupplementalIndicatorSeed {
11907        id: "vdubus_divergence_wave_pattern_generator",
11908        label: "Vdubus Divergence Wave Pattern Generator",
11909        category: "pattern_recognition",
11910        input_kind: IndicatorInputKind::Ohlc,
11911        outputs: OUTPUTS_VDUBUS_DIVERGENCE_WAVE_PATTERN_GENERATOR,
11912        params: PARAM_VDUBUS_DIVERGENCE_WAVE_PATTERN_GENERATOR,
11913    },
11914    SupplementalIndicatorSeed {
11915        id: "ppo",
11916        label: "PPO",
11917        category: "momentum",
11918        input_kind: IndicatorInputKind::Slice,
11919        outputs: OUTPUTS_VALUE_F64,
11920        params: PARAM_PPO,
11921    },
11922    SupplementalIndicatorSeed {
11923        id: "trix",
11924        label: "TRIX",
11925        category: "momentum",
11926        input_kind: IndicatorInputKind::Slice,
11927        outputs: OUTPUTS_VALUE_F64,
11928        params: PARAM_TRIX_PERIOD,
11929    },
11930    SupplementalIndicatorSeed {
11931        id: "tsi",
11932        label: "TSI",
11933        category: "momentum",
11934        input_kind: IndicatorInputKind::Slice,
11935        outputs: OUTPUTS_VALUE_F64,
11936        params: PARAM_TSI,
11937    },
11938    SupplementalIndicatorSeed {
11939        id: "stddev",
11940        label: "StdDev",
11941        category: "volatility",
11942        input_kind: IndicatorInputKind::Slice,
11943        outputs: OUTPUTS_VALUE_F64,
11944        params: PARAM_STDDEV,
11945    },
11946    SupplementalIndicatorSeed {
11947        id: "var",
11948        label: "VAR",
11949        category: "volatility",
11950        input_kind: IndicatorInputKind::Slice,
11951        outputs: OUTPUTS_VALUE_F64,
11952        params: PARAM_VAR,
11953    },
11954    SupplementalIndicatorSeed {
11955        id: "willr",
11956        label: "WILLR",
11957        category: "momentum",
11958        input_kind: IndicatorInputKind::Ohlc,
11959        outputs: OUTPUTS_VALUE_F64,
11960        params: PARAM_WILLR_PERIOD,
11961    },
11962    SupplementalIndicatorSeed {
11963        id: "ultosc",
11964        label: "ULTOSC",
11965        category: "momentum",
11966        input_kind: IndicatorInputKind::Ohlc,
11967        outputs: OUTPUTS_VALUE_F64,
11968        params: PARAM_ULTOSC,
11969    },
11970    SupplementalIndicatorSeed {
11971        id: "macd",
11972        label: "MACD",
11973        category: "momentum",
11974        input_kind: IndicatorInputKind::Slice,
11975        outputs: OUTPUTS_MACD,
11976        params: PARAM_MACD,
11977    },
11978    SupplementalIndicatorSeed {
11979        id: "bollinger_bands",
11980        label: "Bollinger Bands",
11981        category: "volatility",
11982        input_kind: IndicatorInputKind::Slice,
11983        outputs: OUTPUTS_BOLLINGER,
11984        params: PARAM_BOLLINGER,
11985    },
11986    SupplementalIndicatorSeed {
11987        id: "bollinger_bands_width",
11988        label: "Bollinger Bands Width",
11989        category: "volatility",
11990        input_kind: IndicatorInputKind::Slice,
11991        outputs: OUTPUTS_VALUE_F64,
11992        params: PARAM_BOLLINGER,
11993    },
11994    SupplementalIndicatorSeed {
11995        id: "stoch",
11996        label: "Stochastic",
11997        category: "momentum",
11998        input_kind: IndicatorInputKind::Ohlc,
11999        outputs: OUTPUTS_STOCH,
12000        params: PARAM_STOCH,
12001    },
12002    SupplementalIndicatorSeed {
12003        id: "stochf",
12004        label: "Fast Stochastic",
12005        category: "momentum",
12006        input_kind: IndicatorInputKind::Ohlc,
12007        outputs: OUTPUTS_STOCH,
12008        params: PARAM_STOCHF,
12009    },
12010    SupplementalIndicatorSeed {
12011        id: "vwmacd",
12012        label: "VWMACD",
12013        category: "volume",
12014        input_kind: IndicatorInputKind::CloseVolume,
12015        outputs: OUTPUTS_MACD,
12016        params: PARAM_VW_MACD,
12017    },
12018    SupplementalIndicatorSeed {
12019        id: "vpci",
12020        label: "VPCI",
12021        category: "volume",
12022        input_kind: IndicatorInputKind::CloseVolume,
12023        outputs: OUTPUTS_VPCI,
12024        params: PARAM_VPCI,
12025    },
12026    SupplementalIndicatorSeed {
12027        id: "ttm_trend",
12028        label: "TTM Trend",
12029        category: "trend",
12030        input_kind: IndicatorInputKind::Ohlc,
12031        outputs: OUTPUTS_VALUE_BOOL,
12032        params: PARAM_TTM_TREND,
12033    },
12034    SupplementalIndicatorSeed {
12035        id: "ttm_squeeze",
12036        label: "TTM Squeeze",
12037        category: "momentum",
12038        input_kind: IndicatorInputKind::Ohlc,
12039        outputs: OUTPUTS_TTM_SQUEEZE,
12040        params: PARAM_TTM_SQUEEZE,
12041    },
12042    SupplementalIndicatorSeed {
12043        id: "acosc",
12044        label: "Acosc",
12045        category: "momentum",
12046        input_kind: IndicatorInputKind::HighLow,
12047        outputs: OUTPUTS_ACOSC,
12048        params: PARAM_ACOSC,
12049    },
12050    SupplementalIndicatorSeed {
12051        id: "alligator",
12052        label: "Alligator",
12053        category: "trend",
12054        input_kind: IndicatorInputKind::Slice,
12055        outputs: OUTPUTS_ALLIGATOR,
12056        params: PARAM_ALLIGATOR,
12057    },
12058    SupplementalIndicatorSeed {
12059        id: "alphatrend",
12060        label: "AlphaTrend",
12061        category: "trend",
12062        input_kind: IndicatorInputKind::Ohlcv,
12063        outputs: OUTPUTS_K1_K2,
12064        params: PARAM_ALPHATREND,
12065    },
12066    SupplementalIndicatorSeed {
12067        id: "aso",
12068        label: "ASO",
12069        category: "momentum",
12070        input_kind: IndicatorInputKind::Ohlc,
12071        outputs: OUTPUTS_BULLS_BEARS,
12072        params: PARAM_ASO,
12073    },
12074    SupplementalIndicatorSeed {
12075        id: "avsl",
12076        label: "AVSL",
12077        category: "trend",
12078        input_kind: IndicatorInputKind::Ohlcv,
12079        outputs: OUTPUTS_VALUE_F64,
12080        params: PARAM_AVSL,
12081    },
12082    SupplementalIndicatorSeed {
12083        id: "bandpass",
12084        label: "BandPass",
12085        category: "cycle",
12086        input_kind: IndicatorInputKind::Slice,
12087        outputs: OUTPUTS_BANDPASS,
12088        params: PARAM_BANDPASS,
12089    },
12090    SupplementalIndicatorSeed {
12091        id: "chande",
12092        label: "Chande",
12093        category: "trend",
12094        input_kind: IndicatorInputKind::Ohlc,
12095        outputs: OUTPUTS_VALUE_F64,
12096        params: PARAM_CHANDE,
12097    },
12098    SupplementalIndicatorSeed {
12099        id: "chandelier_exit",
12100        label: "Chandelier Exit",
12101        category: "trend",
12102        input_kind: IndicatorInputKind::Ohlc,
12103        outputs: OUTPUTS_LONG_SHORT_STOP,
12104        params: PARAM_CHANDELIER_EXIT,
12105    },
12106    SupplementalIndicatorSeed {
12107        id: "cksp",
12108        label: "CKSP",
12109        category: "trend",
12110        input_kind: IndicatorInputKind::Ohlc,
12111        outputs: OUTPUTS_LONG_SHORT_VALUES,
12112        params: PARAM_CKSP,
12113    },
12114    SupplementalIndicatorSeed {
12115        id: "correlation_cycle",
12116        label: "Correlation Cycle",
12117        category: "cycle",
12118        input_kind: IndicatorInputKind::Slice,
12119        outputs: OUTPUTS_CORRELATION_CYCLE,
12120        params: PARAM_CORRELATION_CYCLE,
12121    },
12122    SupplementalIndicatorSeed {
12123        id: "correl_hl",
12124        label: "Correl HL",
12125        category: "statistics",
12126        input_kind: IndicatorInputKind::HighLow,
12127        outputs: OUTPUTS_VALUE_F64,
12128        params: PARAM_CORREL_HL,
12129    },
12130    SupplementalIndicatorSeed {
12131        id: "decycler",
12132        label: "Decycler",
12133        category: "trend",
12134        input_kind: IndicatorInputKind::Slice,
12135        outputs: OUTPUTS_VALUE_F64,
12136        params: PARAM_DECYCLER,
12137    },
12138    SupplementalIndicatorSeed {
12139        id: "damiani_volatmeter",
12140        label: "Damiani Volatmeter",
12141        category: "volatility",
12142        input_kind: IndicatorInputKind::Slice,
12143        outputs: OUTPUTS_VOL_ANTI,
12144        params: PARAM_DAMIANI_VOLATMETER,
12145    },
12146    SupplementalIndicatorSeed {
12147        id: "dvdiqqe",
12148        label: "DVDIQQE",
12149        category: "volume",
12150        input_kind: IndicatorInputKind::Ohlc,
12151        outputs: OUTPUTS_DVDIQQE,
12152        params: PARAM_DVDIQQE,
12153    },
12154    SupplementalIndicatorSeed {
12155        id: "emd",
12156        label: "EMD",
12157        category: "volatility",
12158        input_kind: IndicatorInputKind::Ohlcv,
12159        outputs: OUTPUTS_UPPER_MIDDLE_LOWER_BAND,
12160        params: PARAM_EMD,
12161    },
12162    SupplementalIndicatorSeed {
12163        id: "eri",
12164        label: "ERI",
12165        category: "trend",
12166        input_kind: IndicatorInputKind::Ohlc,
12167        outputs: OUTPUTS_BULL_BEAR,
12168        params: PARAM_ERI,
12169    },
12170    SupplementalIndicatorSeed {
12171        id: "fisher",
12172        label: "Fisher",
12173        category: "momentum",
12174        input_kind: IndicatorInputKind::HighLow,
12175        outputs: OUTPUTS_FISHER,
12176        params: PARAM_FISHER,
12177    },
12178    SupplementalIndicatorSeed {
12179        id: "fvg_trailing_stop",
12180        label: "FVG Trailing Stop",
12181        category: "trend",
12182        input_kind: IndicatorInputKind::Ohlc,
12183        outputs: OUTPUTS_FVG_TS,
12184        params: PARAM_FVG_TRAILING_STOP,
12185    },
12186    SupplementalIndicatorSeed {
12187        id: "gatorosc",
12188        label: "Gator Oscillator",
12189        category: "trend",
12190        input_kind: IndicatorInputKind::Slice,
12191        outputs: OUTPUTS_GATOROSC,
12192        params: PARAM_GATOROSC,
12193    },
12194    SupplementalIndicatorSeed {
12195        id: "halftrend",
12196        label: "HalfTrend",
12197        category: "trend",
12198        input_kind: IndicatorInputKind::Ohlc,
12199        outputs: OUTPUTS_HALFTREND,
12200        params: PARAM_HALFTREND,
12201    },
12202    SupplementalIndicatorSeed {
12203        id: "kst",
12204        label: "KST",
12205        category: "momentum",
12206        input_kind: IndicatorInputKind::Slice,
12207        outputs: OUTPUTS_LINE_SIGNAL,
12208        params: PARAM_KST,
12209    },
12210    SupplementalIndicatorSeed {
12211        id: "kaufmanstop",
12212        label: "Kaufmanstop",
12213        category: "trend",
12214        input_kind: IndicatorInputKind::HighLow,
12215        outputs: OUTPUTS_VALUE_F64,
12216        params: PARAM_KAUFMANSTOP,
12217    },
12218    SupplementalIndicatorSeed {
12219        id: "lpc",
12220        label: "LPC",
12221        category: "cycle",
12222        input_kind: IndicatorInputKind::Ohlc,
12223        outputs: OUTPUTS_FILTER_BANDS,
12224        params: PARAM_LPC,
12225    },
12226    SupplementalIndicatorSeed {
12227        id: "mab",
12228        label: "MAB",
12229        category: "volatility",
12230        input_kind: IndicatorInputKind::Slice,
12231        outputs: OUTPUTS_UPPER_MIDDLE_LOWER_BAND,
12232        params: PARAM_MAB,
12233    },
12234    SupplementalIndicatorSeed {
12235        id: "macz",
12236        label: "MACZ",
12237        category: "momentum",
12238        input_kind: IndicatorInputKind::Slice,
12239        outputs: OUTPUTS_VALUE_F64,
12240        params: PARAM_MACZ,
12241    },
12242    SupplementalIndicatorSeed {
12243        id: "minmax",
12244        label: "MinMax",
12245        category: "pattern",
12246        input_kind: IndicatorInputKind::HighLow,
12247        outputs: OUTPUTS_MINMAX,
12248        params: PARAM_MINMAX,
12249    },
12250    SupplementalIndicatorSeed {
12251        id: "mod_god_mode",
12252        label: "Mod God Mode",
12253        category: "momentum",
12254        input_kind: IndicatorInputKind::Ohlc,
12255        outputs: OUTPUTS_MOD_GOD_MODE,
12256        params: PARAM_MOD_GOD_MODE,
12257    },
12258    SupplementalIndicatorSeed {
12259        id: "pattern_recognition",
12260        label: "Pattern Recognition",
12261        category: "pattern",
12262        input_kind: IndicatorInputKind::Ohlc,
12263        outputs: OUTPUTS_MATRIX_BOOL,
12264        params: PARAM_NONE,
12265    },
12266    SupplementalIndicatorSeed {
12267        id: "msw",
12268        label: "MSW",
12269        category: "cycle",
12270        input_kind: IndicatorInputKind::Slice,
12271        outputs: OUTPUTS_SINE_LEAD,
12272        params: PARAM_MSW,
12273    },
12274    SupplementalIndicatorSeed {
12275        id: "nadaraya_watson_envelope",
12276        label: "Nadaraya Watson Envelope",
12277        category: "volatility",
12278        input_kind: IndicatorInputKind::Slice,
12279        outputs: OUTPUTS_UPPER_LOWER,
12280        params: PARAM_NWE,
12281    },
12282    SupplementalIndicatorSeed {
12283        id: "ott",
12284        label: "OTT",
12285        category: "trend",
12286        input_kind: IndicatorInputKind::Slice,
12287        outputs: OUTPUTS_VALUE_F64,
12288        params: PARAM_OTT,
12289    },
12290    SupplementalIndicatorSeed {
12291        id: "otto",
12292        label: "OTTO",
12293        category: "trend",
12294        input_kind: IndicatorInputKind::Slice,
12295        outputs: OUTPUTS_HOTT_LOTT,
12296        params: PARAM_OTTO,
12297    },
12298    SupplementalIndicatorSeed {
12299        id: "vidya",
12300        label: "VIDYA",
12301        category: "trend",
12302        input_kind: IndicatorInputKind::Slice,
12303        outputs: OUTPUTS_VALUE_F64,
12304        params: PARAM_VIDYA,
12305    },
12306    SupplementalIndicatorSeed {
12307        id: "vlma",
12308        label: "VLMA",
12309        category: "trend",
12310        input_kind: IndicatorInputKind::Slice,
12311        outputs: OUTPUTS_VALUE_F64,
12312        params: PARAM_VLMA,
12313    },
12314    SupplementalIndicatorSeed {
12315        id: "pma",
12316        label: "PMA",
12317        category: "trend",
12318        input_kind: IndicatorInputKind::Slice,
12319        outputs: OUTPUTS_EHLERS_PMA,
12320        params: PARAM_PMA,
12321    },
12322    SupplementalIndicatorSeed {
12323        id: "prb",
12324        label: "PRB",
12325        category: "statistics",
12326        input_kind: IndicatorInputKind::Slice,
12327        outputs: OUTPUTS_PRB,
12328        params: PARAM_PRB,
12329    },
12330    SupplementalIndicatorSeed {
12331        id: "qqe",
12332        label: "QQE",
12333        category: "momentum",
12334        input_kind: IndicatorInputKind::Slice,
12335        outputs: &[OUTPUT_FAST, OUTPUT_SLOW],
12336        params: PARAM_QQE,
12337    },
12338    SupplementalIndicatorSeed {
12339        id: "adaptive_bounds_rsi",
12340        label: "Adaptive Bounds RSI",
12341        category: "momentum",
12342        input_kind: IndicatorInputKind::Slice,
12343        outputs: OUTPUTS_ADAPTIVE_BOUNDS_RSI,
12344        params: PARAM_ADAPTIVE_BOUNDS_RSI,
12345    },
12346    SupplementalIndicatorSeed {
12347        id: "forward_backward_exponential_oscillator",
12348        label: "Forward-Backward Exponential Oscillator",
12349        category: "momentum",
12350        input_kind: IndicatorInputKind::Slice,
12351        outputs: OUTPUTS_FORWARD_BACKWARD_EXPONENTIAL_OSCILLATOR,
12352        params: PARAM_FORWARD_BACKWARD_EXPONENTIAL_OSCILLATOR,
12353    },
12354    SupplementalIndicatorSeed {
12355        id: "qqe_weighted_oscillator",
12356        label: "QQE Weighted Oscillator",
12357        category: "momentum",
12358        input_kind: IndicatorInputKind::Slice,
12359        outputs: OUTPUTS_QQE_WEIGHTED_OSCILLATOR,
12360        params: PARAM_QQE_WEIGHTED_OSCILLATOR,
12361    },
12362    SupplementalIndicatorSeed {
12363        id: "market_structure_confluence",
12364        label: "Market Structure Confluence",
12365        category: "trend",
12366        input_kind: IndicatorInputKind::Ohlc,
12367        outputs: OUTPUTS_MARKET_STRUCTURE_CONFLUENCE,
12368        params: PARAM_MARKET_STRUCTURE_CONFLUENCE,
12369    },
12370    SupplementalIndicatorSeed {
12371        id: "range_filtered_trend_signals",
12372        label: "Range Filtered Trend Signals",
12373        category: "trend",
12374        input_kind: IndicatorInputKind::Ohlc,
12375        outputs: OUTPUTS_RANGE_FILTERED_TREND_SIGNALS,
12376        params: PARAM_RANGE_FILTERED_TREND_SIGNALS,
12377    },
12378    SupplementalIndicatorSeed {
12379        id: "range_oscillator",
12380        label: "Range Oscillator",
12381        category: "volatility",
12382        input_kind: IndicatorInputKind::Ohlc,
12383        outputs: OUTPUTS_RANGE_OSCILLATOR,
12384        params: PARAM_RANGE_OSCILLATOR,
12385    },
12386    SupplementalIndicatorSeed {
12387        id: "volume_weighted_relative_strength_index",
12388        label: "Volume Weighted Relative Strength Index",
12389        category: "momentum",
12390        input_kind: IndicatorInputKind::CloseVolume,
12391        outputs: OUTPUTS_VOLUME_WEIGHTED_RELATIVE_STRENGTH_INDEX,
12392        params: PARAM_VOLUME_WEIGHTED_RELATIVE_STRENGTH_INDEX,
12393    },
12394    SupplementalIndicatorSeed {
12395        id: "range_filter",
12396        label: "Range Filter",
12397        category: "volatility",
12398        input_kind: IndicatorInputKind::Slice,
12399        outputs: OUTPUTS_FILTER_BANDS,
12400        params: PARAM_RANGE_FILTER,
12401    },
12402    SupplementalIndicatorSeed {
12403        id: "coppock",
12404        label: "Coppock",
12405        category: "momentum",
12406        input_kind: IndicatorInputKind::Slice,
12407        outputs: OUTPUTS_VALUE_F64,
12408        params: PARAM_COPPOCK,
12409    },
12410    SupplementalIndicatorSeed {
12411        id: "rsmk",
12412        label: "RSMK",
12413        category: "relative_strength",
12414        input_kind: IndicatorInputKind::CloseVolume,
12415        outputs: OUTPUTS_INDICATOR_SIGNAL,
12416        params: PARAM_RSMK,
12417    },
12418    SupplementalIndicatorSeed {
12419        id: "voss",
12420        label: "Voss",
12421        category: "cycle",
12422        input_kind: IndicatorInputKind::Slice,
12423        outputs: OUTPUTS_VOSS,
12424        params: PARAM_VOSS,
12425    },
12426    SupplementalIndicatorSeed {
12427        id: "stc",
12428        label: "STC",
12429        category: "momentum",
12430        input_kind: IndicatorInputKind::Slice,
12431        outputs: OUTPUTS_VALUE_F64,
12432        params: PARAM_STC,
12433    },
12434    SupplementalIndicatorSeed {
12435        id: "rvi",
12436        label: "RVI",
12437        category: "volatility",
12438        input_kind: IndicatorInputKind::Slice,
12439        outputs: OUTPUTS_VALUE_F64,
12440        params: PARAM_RVI,
12441    },
12442    SupplementalIndicatorSeed {
12443        id: "safezonestop",
12444        label: "SafeZoneStop",
12445        category: "trend",
12446        input_kind: IndicatorInputKind::HighLow,
12447        outputs: OUTPUTS_VALUE_F64,
12448        params: PARAM_SAFEZONESTOP,
12449    },
12450    SupplementalIndicatorSeed {
12451        id: "chop",
12452        label: "CHOP",
12453        category: "trend",
12454        input_kind: IndicatorInputKind::Ohlc,
12455        outputs: OUTPUTS_VALUE_F64,
12456        params: PARAM_CHOP,
12457    },
12458    SupplementalIndicatorSeed {
12459        id: "devstop",
12460        label: "DevStop",
12461        category: "trend",
12462        input_kind: IndicatorInputKind::HighLow,
12463        outputs: OUTPUTS_VALUE_F64,
12464        params: PARAM_DEVSTOP,
12465    },
12466    SupplementalIndicatorSeed {
12467        id: "net_myrsi",
12468        label: "NET_MyRSI",
12469        category: "momentum",
12470        input_kind: IndicatorInputKind::Slice,
12471        outputs: OUTPUTS_VALUE_F64,
12472        params: PARAMS_PERIOD_ONLY,
12473    },
12474    SupplementalIndicatorSeed {
12475        id: "wad",
12476        label: "WAD",
12477        category: "volume",
12478        input_kind: IndicatorInputKind::Ohlc,
12479        outputs: OUTPUTS_VALUE_F64,
12480        params: PARAM_NONE,
12481    },
12482    SupplementalIndicatorSeed {
12483        id: "pivot",
12484        label: "Pivot",
12485        category: "price",
12486        input_kind: IndicatorInputKind::Ohlc,
12487        outputs: OUTPUTS_PIVOT,
12488        params: PARAM_PIVOT,
12489    },
12490];
12491
12492fn supplemental_supports_cpu_batch(id: &str) -> bool {
12493    matches!(
12494        id,
12495        "adx"
12496            | "adxr"
12497            | "atr"
12498            | "atr_percentile"
12499            | "ad"
12500            | "adosc"
12501            | "ao"
12502            | "dti"
12503            | "dx"
12504            | "di"
12505            | "dm"
12506            | "vi"
12507            | "donchian"
12508            | "supertrend"
12509            | "adjustable_ma_alternating_extremities"
12510            | "supertrend_recovery"
12511            | "keltner"
12512            | "aroon"
12513            | "srsi"
12514            | "kdj"
12515            | "squeeze_momentum"
12516            | "wavetrend"
12517            | "wto"
12518            | "garman_klass_volatility"
12519            | "historical_volatility"
12520            | "absolute_strength_index_oscillator"
12521            | "adaptive_bandpass_trigger_oscillator"
12522            | "premier_rsi_oscillator"
12523            | "multi_length_stochastic_average"
12524            | "hull_butterfly_oscillator"
12525            | "fibonacci_trailing_stop"
12526            | "fibonacci_entry_bands"
12527            | "volume_energy_reservoirs"
12528            | "neighboring_trailing_stop"
12529            | "macd_wave_signal_pro"
12530            | "hema_trend_levels"
12531            | "grover_llorens_cycle_oscillator"
12532            | "squeeze_index"
12533            | "stochastic_distance"
12534            | "advance_decline_line"
12535            | "decisionpoint_breadth_swenlin_trading_oscillator"
12536            | "velocity_acceleration_indicator"
12537            | "normalized_resonator"
12538            | "monotonicity_index"
12539            | "half_causal_estimator"
12540            | "bull_power_vs_bear_power"
12541            | "vertical_horizontal_filter"
12542            | "intraday_momentum_index"
12543            | "vwap_zscore_with_signals"
12544            | "demand_index"
12545            | "didi_index"
12546            | "ehlers_autocorrelation_periodogram"
12547            | "ehlers_linear_extrapolation_predictor"
12548            | "kase_peak_oscillator_with_divergences"
12549            | "gopalakrishnan_range_index"
12550            | "yang_zhang_volatility"
12551            | "historical_volatility_percentile"
12552            | "ehlers_detrending_filter"
12553            | "keltner_channel_width_oscillator"
12554            | "market_meanness_index"
12555            | "price_density_market_noise"
12556            | "momentum_ratio_oscillator"
12557            | "hypertrend"
12558            | "adaptive_schaff_trend_cycle"
12559            | "smoothed_gaussian_trend_filter"
12560            | "logarithmic_moving_average"
12561            | "ict_propulsion_block"
12562            | "supertrend_oscillator"
12563            | "leavitt_convolution_acceleration"
12564            | "impulse_macd"
12565            | "insync_index"
12566            | "volatility_ratio_adaptive_rsx"
12567            | "on_balance_volume_oscillator"
12568            | "parkinson_volatility"
12569            | "psychological_line"
12570            | "rank_correlation_index"
12571            | "trend_follower"
12572            | "trend_direction_force_index"
12573            | "linear_regression_intensity"
12574            | "trend_continuation_factor"
12575            | "pretty_good_oscillator"
12576            | "twiggs_money_flow"
12577            | "volume_weighted_stochastic_rsi"
12578            | "stochastic_adaptive_d"
12579            | "stochastic_connors_rsi"
12580            | "volume_zone_oscillator"
12581            | "bop"
12582            | "emv"
12583            | "efi"
12584            | "mfi"
12585            | "mass"
12586            | "kvo"
12587            | "wad"
12588            | "vosc"
12589            | "rvi"
12590            | "coppock"
12591            | "rsi"
12592            | "roc"
12593            | "linear_correlation_oscillator"
12594            | "ehlers_fm_demodulator"
12595            | "ehlers_adaptive_cg"
12596            | "adaptive_momentum_oscillator"
12597            | "velocity"
12598            | "normalized_volume_true_range"
12599            | "exponential_trend"
12600            | "trend_flow_trail"
12601            | "range_breakout_signals"
12602            | "apo"
12603            | "cci"
12604            | "cci_cycle"
12605            | "cfo"
12606            | "cg"
12607            | "er"
12608            | "kurtosis"
12609            | "natr"
12610            | "net_myrsi"
12611            | "mean_ad"
12612            | "medium_ad"
12613            | "deviation"
12614            | "mod_god_mode"
12615            | "dpo"
12616            | "lrsi"
12617            | "fosc"
12618            | "ift_rsi"
12619            | "linearreg_angle"
12620            | "linearreg_intercept"
12621            | "linearreg_slope"
12622            | "pfe"
12623            | "percentile_nearest_rank"
12624            | "ui"
12625            | "zscore"
12626            | "medprice"
12627            | "midpoint"
12628            | "midprice"
12629            | "wclprice"
12630            | "obv"
12631            | "vpt"
12632            | "nvi"
12633            | "pvi"
12634            | "mom"
12635            | "cmo"
12636            | "rocp"
12637            | "rocr"
12638            | "tsf"
12639            | "adaptive_macd"
12640            | "polynomial_regression_extrapolation"
12641            | "statistical_trailing_stop"
12642            | "standardized_psar_oscillator"
12643            | "geometric_bias_oscillator"
12644            | "ppo"
12645            | "trix"
12646            | "tsi"
12647            | "stddev"
12648            | "var"
12649            | "willr"
12650            | "ultosc"
12651            | "macd"
12652            | "bollinger_bands"
12653            | "bollinger_bands_width"
12654            | "stoch"
12655            | "stochf"
12656            | "vwmacd"
12657            | "volume_weighted_rsi"
12658            | "dynamic_momentum_index"
12659            | "disparity_index"
12660            | "donchian_channel_width"
12661            | "kairi_relative_index"
12662            | "projection_oscillator"
12663            | "possible_rsi"
12664            | "stochastic_money_flow_index"
12665            | "autocorrelation_indicator"
12666            | "goertzel_cycle_composite_wave"
12667            | "rolling_skewness_kurtosis"
12668            | "rolling_z_score_trend"
12669            | "ehlers_data_sampling_relative_strength_indicator"
12670            | "velocity_acceleration_convergence_divergence_indicator"
12671            | "trend_direction_force_index"
12672            | "stc"
12673            | "vpci"
12674            | "ttm_trend"
12675            | "ttm_squeeze"
12676            | "acosc"
12677            | "alligator"
12678            | "alphatrend"
12679            | "aso"
12680            | "bandpass"
12681            | "chande"
12682            | "chandelier_exit"
12683            | "cksp"
12684            | "coppock"
12685            | "correl_hl"
12686            | "correlation_cycle"
12687            | "ehlers_adaptive_cg"
12688            | "normalized_volume_true_range"
12689            | "exponential_trend"
12690            | "trend_flow_trail"
12691            | "range_breakout_signals"
12692            | "chop"
12693            | "damiani_volatmeter"
12694            | "dvdiqqe"
12695            | "emd"
12696            | "eri"
12697            | "fisher"
12698            | "fvg_trailing_stop"
12699            | "gatorosc"
12700            | "halftrend"
12701            | "kst"
12702            | "lpc"
12703            | "mab"
12704            | "macz"
12705            | "minmax"
12706            | "msw"
12707            | "nadaraya_watson_envelope"
12708            | "otto"
12709            | "vidya"
12710            | "vlma"
12711            | "pma"
12712            | "prb"
12713            | "qqe"
12714            | "qqe_weighted_oscillator"
12715            | "range_filter"
12716            | "rsmk"
12717            | "safezonestop"
12718            | "devstop"
12719            | "voss"
12720            | "pivot"
12721    )
12722}
12723
12724fn supplemental_supports_cuda_single(id: &str) -> bool {
12725    matches!(id, "pattern_recognition")
12726}
12727
12728fn supplemental_supports_cuda_batch(id: &str) -> bool {
12729    matches!(
12730        id,
12731        "acosc"
12732            | "adosc"
12733            | "adx"
12734            | "adxr"
12735            | "alligator"
12736            | "alphatrend"
12737            | "ao"
12738            | "apo"
12739            | "aroon"
12740            | "aroonosc"
12741            | "aso"
12742            | "atr"
12743            | "avsl"
12744            | "bandpass"
12745            | "bollinger_bands"
12746            | "bollinger_bands_width"
12747            | "bop"
12748            | "cci"
12749            | "cci_cycle"
12750            | "cfo"
12751            | "cg"
12752            | "chande"
12753            | "chandelier_exit"
12754            | "chop"
12755            | "cksp"
12756            | "cmo"
12757            | "coppock"
12758            | "correl_hl"
12759            | "correlation_cycle"
12760            | "cvi"
12761            | "damiani_volatmeter"
12762            | "dec_osc"
12763            | "decycler"
12764            | "deviation"
12765            | "devstop"
12766            | "di"
12767            | "dm"
12768            | "donchian"
12769            | "dpo"
12770            | "dti"
12771            | "dvdiqqe"
12772            | "dx"
12773            | "efi"
12774            | "emd"
12775            | "emv"
12776            | "er"
12777            | "eri"
12778            | "fisher"
12779            | "fosc"
12780            | "fvg_trailing_stop"
12781            | "gatorosc"
12782            | "halftrend"
12783            | "ift_rsi"
12784            | "kaufmanstop"
12785            | "kdj"
12786            | "keltner"
12787            | "kst"
12788            | "kurtosis"
12789            | "kvo"
12790            | "linearreg_angle"
12791            | "linearreg_intercept"
12792            | "linearreg_slope"
12793            | "lpc"
12794            | "lrsi"
12795            | "mab"
12796            | "macd"
12797            | "macz"
12798            | "marketefi"
12799            | "mass"
12800            | "mean_ad"
12801            | "medium_ad"
12802            | "medprice"
12803            | "mfi"
12804            | "minmax"
12805            | "mod_god_mode"
12806            | "mom"
12807            | "msw"
12808            | "nadaraya_watson_envelope"
12809            | "natr"
12810            | "net_myrsi"
12811            | "nvi"
12812            | "obv"
12813            | "ott"
12814            | "otto"
12815            | "percentile_nearest_rank"
12816            | "pfe"
12817            | "pivot"
12818            | "pma"
12819            | "ppo"
12820            | "prb"
12821            | "pvi"
12822            | "qqe"
12823            | "qstick"
12824            | "range_filter"
12825            | "reverse_rsi"
12826            | "roc"
12827            | "rocp"
12828            | "rocr"
12829            | "rsi"
12830            | "rsmk"
12831            | "rsx"
12832            | "rvi"
12833            | "safezonestop"
12834            | "sar"
12835            | "squeeze_momentum"
12836            | "srsi"
12837            | "stc"
12838            | "stddev"
12839            | "stoch"
12840            | "stochf"
12841            | "supertrend"
12842            | "trix"
12843            | "tsf"
12844            | "tsi"
12845            | "ttm_squeeze"
12846            | "ttm_trend"
12847            | "ui"
12848            | "ultosc"
12849            | "var"
12850            | "vi"
12851            | "vidya"
12852            | "vlma"
12853            | "vosc"
12854            | "voss"
12855            | "vpci"
12856            | "vpt"
12857            | "vwmacd"
12858            | "wad"
12859            | "wavetrend"
12860            | "wclprice"
12861            | "willr"
12862            | "wto"
12863            | "garman_klass_volatility"
12864            | "yang_zhang_volatility"
12865            | "parkinson_volatility"
12866            | "zscore"
12867    )
12868}
12869
12870fn supplemental_supports_cuda_vram(id: &str) -> bool {
12871    matches!(id, "pattern_recognition") || supplemental_supports_cuda_batch(id)
12872}
12873
12874pub fn is_bucket_b_indicator(id: &str) -> bool {
12875    BUCKET_B_INDICATORS
12876        .iter()
12877        .any(|item| item.eq_ignore_ascii_case(id))
12878}
12879
12880static INDICATOR_REGISTRY: Lazy<Vec<IndicatorInfo>> = Lazy::new(build_registry);
12881static INDICATOR_EXACT_INDEX: Lazy<HashMap<&'static str, usize>> = Lazy::new(|| {
12882    let mut map = HashMap::with_capacity(INDICATOR_REGISTRY.len());
12883    for (idx, info) in INDICATOR_REGISTRY.iter().enumerate() {
12884        map.insert(info.id, idx);
12885    }
12886    map
12887});
12888
12889fn ma_outputs_for(ma_id: &str) -> Vec<IndicatorOutputInfo> {
12890    match ma_id {
12891        "mama" => OUTPUTS_MAMA.to_vec(),
12892        "ehlers_pma" => OUTPUTS_EHLERS_PMA.to_vec(),
12893        "ehlers_undersampled_double_moving_average" => OUTPUTS_BUFF_AVERAGES.to_vec(),
12894        "buff_averages" => OUTPUTS_BUFF_AVERAGES.to_vec(),
12895        "ema_deviation_corrected_t3" => OUTPUTS_EDCT3.to_vec(),
12896        "logarithmic_moving_average" => OUTPUTS_LOGARITHMIC_MOVING_AVERAGE.to_vec(),
12897        _ => OUTPUTS_VALUE_F64.to_vec(),
12898    }
12899}
12900
12901fn ma_params_for(ma_id: &str, period_based: bool) -> Vec<IndicatorParamInfo> {
12902    let mut params = Vec::new();
12903    if period_based {
12904        params.push(PARAM_PERIOD);
12905    }
12906    for item in ma_param_schema(ma_id).iter() {
12907        let kind = match item.kind {
12908            MaParamKind::Float => IndicatorParamKind::Float,
12909            MaParamKind::Int => IndicatorParamKind::Int,
12910        };
12911        let default = match kind {
12912            IndicatorParamKind::Float => Some(ParamValueStatic::Float(item.default)),
12913            IndicatorParamKind::Int => Some(ParamValueStatic::Int(item.default as i64)),
12914            IndicatorParamKind::Bool | IndicatorParamKind::EnumString => None,
12915        };
12916        params.push(IndicatorParamInfo {
12917            key: item.key,
12918            label: item.label,
12919            kind,
12920            required: false,
12921            default,
12922            min: item.min,
12923            max: item.max,
12924            step: item.step,
12925            enum_values: EMPTY_ENUM_VALUES,
12926            notes: item.notes,
12927        });
12928    }
12929    match ma_id {
12930        "mama" => params.push(PARAM_OUTPUT_MAMA),
12931        "ehlers_pma" => params.push(PARAM_OUTPUT_EHLERS_PMA),
12932        "ehlers_undersampled_double_moving_average" => params.push(PARAM_OUTPUT_BUFF_AVERAGES),
12933        "buff_averages" => params.push(PARAM_OUTPUT_BUFF_AVERAGES),
12934        "ema_deviation_corrected_t3" => params.push(PARAM_OUTPUT_EDCT3),
12935        "vwap" => params.push(PARAM_ANCHOR),
12936        "volume_adjusted_ma" => params.push(PARAM_STRICT),
12937        "n_order_ema" => {
12938            params.push(IndicatorParamInfo {
12939                key: "ema_style",
12940                label: "EMA Style",
12941                kind: IndicatorParamKind::EnumString,
12942                required: false,
12943                default: None,
12944                min: None,
12945                max: None,
12946                step: None,
12947                enum_values: ENUM_VALUES_N_ORDER_EMA_STYLE,
12948                notes: Some("Default: ema."),
12949            });
12950            params.push(IndicatorParamInfo {
12951                key: "iir_style",
12952                label: "IIR Style",
12953                kind: IndicatorParamKind::EnumString,
12954                required: false,
12955                default: None,
12956                min: None,
12957                max: None,
12958                step: None,
12959                enum_values: ENUM_VALUES_N_ORDER_EMA_IIR_STYLE,
12960                notes: Some("Default: impulse_matched."),
12961            });
12962        }
12963        _ => {}
12964    }
12965    params
12966}
12967
12968fn build_registry() -> Vec<IndicatorInfo> {
12969    let mut out = Vec::new();
12970
12971    for ma in list_moving_averages().iter() {
12972        out.push(IndicatorInfo {
12973            id: ma.id,
12974            label: ma.label,
12975            category: "moving_averages",
12976            dynamic_strategy_eligible: true,
12977            input_kind: if ma.requires_candles {
12978                IndicatorInputKind::Candles
12979            } else {
12980                IndicatorInputKind::Slice
12981            },
12982            outputs: ma_outputs_for(ma.id),
12983            params: ma_params_for(ma.id, ma.period_based),
12984            capabilities: IndicatorCapabilities {
12985                supports_cpu_single: ma.supports_cpu_single,
12986                supports_cpu_batch: ma.supports_cpu_batch,
12987                supports_cuda_single: ma.supports_cuda_single,
12988                supports_cuda_batch: ma.supports_cuda_sweep,
12989                supports_cuda_vram: ma.supports_cuda_sweep,
12990            },
12991            notes: ma.notes,
12992        });
12993    }
12994
12995    for seed in SUPPLEMENTAL_INDICATORS.iter() {
12996        let info = IndicatorInfo {
12997            id: seed.id,
12998            label: seed.label,
12999            category: seed.category,
13000            dynamic_strategy_eligible: true,
13001            input_kind: seed.input_kind,
13002            outputs: seed.outputs.to_vec(),
13003            params: seed.params.to_vec(),
13004            capabilities: IndicatorCapabilities {
13005                supports_cpu_single: true,
13006                supports_cpu_batch: supplemental_supports_cpu_batch(seed.id),
13007                supports_cuda_single: supplemental_supports_cuda_single(seed.id),
13008                supports_cuda_batch: supplemental_supports_cuda_batch(seed.id),
13009                supports_cuda_vram: supplemental_supports_cuda_vram(seed.id),
13010            },
13011            notes: Some(SUPPLEMENTAL_SEED_NOTE),
13012        };
13013
13014        if let Some(existing) = out
13015            .iter_mut()
13016            .find(|item| item.id.eq_ignore_ascii_case(seed.id))
13017        {
13018            *existing = info;
13019        } else {
13020            out.push(info);
13021        }
13022    }
13023
13024    out.sort_by(|a, b| a.id.cmp(b.id));
13025    out
13026}
13027
13028pub fn list_indicators() -> &'static [IndicatorInfo] {
13029    INDICATOR_REGISTRY.as_slice()
13030}
13031
13032pub fn get_indicator(id: &str) -> Option<&'static IndicatorInfo> {
13033    let indicators = list_indicators();
13034    if let Some(idx) = INDICATOR_EXACT_INDEX.get(id).copied() {
13035        return Some(&indicators[idx]);
13036    }
13037    if let Ok(idx) = indicators.binary_search_by(|info| info.id.cmp(id)) {
13038        return Some(&indicators[idx]);
13039    }
13040    indicators
13041        .iter()
13042        .find(|info| info.id.eq_ignore_ascii_case(id))
13043}
13044
13045pub fn indicator_param_schema(id: &str) -> Option<&'static [IndicatorParamInfo]> {
13046    get_indicator(id).map(|info| info.params.as_slice())
13047}
13048
13049pub fn indicator_output_schema(id: &str) -> Option<&'static [IndicatorOutputInfo]> {
13050    get_indicator(id).map(|info| info.outputs.as_slice())
13051}
13052
13053pub fn indicator_capabilities(id: &str) -> Option<IndicatorCapabilities> {
13054    get_indicator(id).map(|info| info.capabilities)
13055}
13056
13057#[cfg(test)]
13058mod tests {
13059    use super::*;
13060
13061    #[test]
13062    fn registry_is_non_empty() {
13063        assert!(!list_indicators().is_empty());
13064    }
13065
13066    #[test]
13067    fn ids_are_unique_case_insensitive() {
13068        use std::collections::HashSet;
13069        let mut seen = HashSet::new();
13070        for info in list_indicators().iter() {
13071            let lower = info.id.to_ascii_lowercase();
13072            assert!(seen.insert(lower), "duplicate id {}", info.id);
13073        }
13074    }
13075
13076    #[test]
13077    fn all_registered_entries_have_output_schema() {
13078        for info in list_indicators().iter() {
13079            assert!(
13080                !info.outputs.is_empty(),
13081                "indicator {} has no output schema",
13082                info.id
13083            );
13084        }
13085    }
13086
13087    #[test]
13088    fn ma_registry_is_mirrored() {
13089        for ma in list_moving_averages().iter() {
13090            assert!(
13091                get_indicator(ma.id).is_some(),
13092                "missing moving average {} in global registry",
13093                ma.id
13094            );
13095        }
13096    }
13097
13098    #[test]
13099    fn lookup_is_case_insensitive() {
13100        assert!(get_indicator("SMA").is_some());
13101        assert!(get_indicator("sma").is_some());
13102    }
13103
13104    #[test]
13105    fn schema_accessors_work() {
13106        assert!(indicator_output_schema("macd").is_some());
13107        assert!(indicator_param_schema("sma").is_some());
13108        assert!(indicator_capabilities("sma").is_some());
13109        assert!(indicator_output_schema("not_real").is_none());
13110    }
13111
13112    #[test]
13113    fn pattern_recognition_capability_is_registered_as_non_batch() {
13114        let info = get_indicator("pattern_recognition").unwrap();
13115        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13116        assert_eq!(info.outputs.len(), 1);
13117        assert_eq!(info.outputs[0].id, "matrix");
13118        assert!(info.capabilities.supports_cpu_single);
13119        assert!(!info.capabilities.supports_cpu_batch);
13120        assert!(info.capabilities.supports_cuda_single);
13121        assert!(!info.capabilities.supports_cuda_batch);
13122        assert!(info.capabilities.supports_cuda_vram);
13123    }
13124
13125    #[test]
13126    fn dec_osc_and_rsx_are_registered_for_cuda_batch() {
13127        let dec_osc = get_indicator("dec_osc").unwrap();
13128        assert_eq!(dec_osc.input_kind, IndicatorInputKind::Slice);
13129        assert_eq!(dec_osc.outputs.len(), 1);
13130        assert_eq!(dec_osc.outputs[0].id, "value");
13131        assert!(dec_osc.capabilities.supports_cuda_batch);
13132        assert!(dec_osc.capabilities.supports_cuda_vram);
13133
13134        let rsx = get_indicator("rsx").unwrap();
13135        assert_eq!(rsx.input_kind, IndicatorInputKind::Slice);
13136        assert_eq!(rsx.outputs.len(), 1);
13137        assert_eq!(rsx.outputs[0].id, "value");
13138        assert!(rsx.capabilities.supports_cuda_batch);
13139        assert!(rsx.capabilities.supports_cuda_vram);
13140    }
13141
13142    #[test]
13143    fn chande_is_registered_for_cpu_and_cuda_batch() {
13144        assert!(supplemental_supports_cpu_batch("chande"));
13145        assert!(supplemental_supports_cuda_batch("chande"));
13146        let chande = get_indicator("chande").unwrap();
13147        assert_eq!(chande.input_kind, IndicatorInputKind::Ohlc);
13148        assert_eq!(chande.outputs.len(), 1);
13149        assert_eq!(chande.outputs[0].id, "value");
13150        assert!(chande.capabilities.supports_cpu_batch);
13151        assert!(chande.capabilities.supports_cuda_batch);
13152        assert!(chande.capabilities.supports_cuda_vram);
13153    }
13154
13155    #[test]
13156    fn bucket_b_ma_capabilities_follow_ma_registry() {
13157        let mama = indicator_capabilities("mama").unwrap();
13158        assert!(mama.supports_cpu_batch);
13159        assert!(mama.supports_cuda_batch);
13160        assert!(mama.supports_cuda_vram);
13161
13162        let vwap = indicator_capabilities("vwap").unwrap();
13163        assert!(vwap.supports_cpu_batch);
13164        assert!(vwap.supports_cuda_batch);
13165        assert!(vwap.supports_cuda_vram);
13166    }
13167
13168    #[test]
13169    fn bucket_membership_lookup_is_case_insensitive() {
13170        assert!(is_bucket_b_indicator("MAMA"));
13171        assert!(is_bucket_b_indicator("pivot"));
13172        assert!(!is_bucket_b_indicator("sma"));
13173        assert!(!is_bucket_b_indicator("adx"));
13174    }
13175
13176    #[test]
13177    fn lrsi_is_registered_for_cuda_batch() {
13178        let lrsi = get_indicator("lrsi").unwrap();
13179        assert_eq!(lrsi.input_kind, IndicatorInputKind::HighLow);
13180        assert_eq!(lrsi.outputs.len(), 1);
13181        assert_eq!(lrsi.outputs[0].id, "value");
13182        assert!(lrsi.capabilities.supports_cpu_batch);
13183        assert!(lrsi.capabilities.supports_cuda_batch);
13184        assert!(lrsi.capabilities.supports_cuda_vram);
13185    }
13186
13187    #[test]
13188    fn garman_klass_volatility_is_registered_for_cpu_and_cuda_batch() {
13189        assert!(supplemental_supports_cpu_batch("garman_klass_volatility"));
13190        assert!(supplemental_supports_cuda_batch("garman_klass_volatility"));
13191        let info = get_indicator("garman_klass_volatility").unwrap();
13192        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13193        assert_eq!(info.outputs.len(), 1);
13194        assert_eq!(info.outputs[0].id, "value");
13195        assert_eq!(info.params.len(), 1);
13196        assert_eq!(info.params[0].key, "lookback");
13197        assert!(info.capabilities.supports_cpu_single);
13198        assert!(info.capabilities.supports_cpu_batch);
13199        assert!(info.capabilities.supports_cuda_batch);
13200        assert!(info.capabilities.supports_cuda_vram);
13201    }
13202
13203    #[test]
13204    fn parkinson_volatility_is_registered_for_cpu_and_cuda_batch() {
13205        assert!(supplemental_supports_cpu_batch("parkinson_volatility"));
13206        assert!(supplemental_supports_cuda_batch("parkinson_volatility"));
13207        let info = get_indicator("parkinson_volatility").unwrap();
13208        assert_eq!(info.input_kind, IndicatorInputKind::HighLow);
13209        assert_eq!(info.outputs.len(), 2);
13210        assert_eq!(info.outputs[0].id, "volatility");
13211        assert_eq!(info.outputs[1].id, "variance");
13212        assert_eq!(info.params.len(), 1);
13213        assert_eq!(info.params[0].key, "period");
13214        assert!(info.capabilities.supports_cpu_single);
13215        assert!(info.capabilities.supports_cpu_batch);
13216        assert!(info.capabilities.supports_cuda_batch);
13217        assert!(info.capabilities.supports_cuda_vram);
13218    }
13219
13220    #[test]
13221    fn historical_volatility_is_registered_for_cpu_batch_only() {
13222        assert!(supplemental_supports_cpu_batch("historical_volatility"));
13223        assert!(!supplemental_supports_cuda_batch("historical_volatility"));
13224        let info = get_indicator("historical_volatility").unwrap();
13225        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13226        assert_eq!(info.outputs.len(), 1);
13227        assert_eq!(info.outputs[0].id, "value");
13228        assert_eq!(info.params.len(), 2);
13229        assert_eq!(info.params[0].key, "lookback");
13230        assert_eq!(info.params[1].key, "annualization_days");
13231        assert!(info.capabilities.supports_cpu_single);
13232        assert!(info.capabilities.supports_cpu_batch);
13233        assert!(!info.capabilities.supports_cuda_batch);
13234        assert!(!info.capabilities.supports_cuda_vram);
13235    }
13236
13237    #[test]
13238    fn advance_decline_line_is_registered_for_cpu_batch_only() {
13239        assert!(supplemental_supports_cpu_batch("advance_decline_line"));
13240        assert!(!supplemental_supports_cuda_batch("advance_decline_line"));
13241        let info = get_indicator("advance_decline_line").unwrap();
13242        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13243        assert_eq!(info.outputs.len(), 1);
13244        assert_eq!(info.outputs[0].id, "value");
13245        assert!(info.params.is_empty());
13246        assert!(info.capabilities.supports_cpu_single);
13247        assert!(info.capabilities.supports_cpu_batch);
13248        assert!(!info.capabilities.supports_cuda_batch);
13249        assert!(!info.capabilities.supports_cuda_vram);
13250    }
13251
13252    #[test]
13253    fn decisionpoint_breadth_swenlin_trading_oscillator_is_registered_for_cpu_batch_only() {
13254        assert!(supplemental_supports_cpu_batch(
13255            "decisionpoint_breadth_swenlin_trading_oscillator"
13256        ));
13257        assert!(!supplemental_supports_cuda_batch(
13258            "decisionpoint_breadth_swenlin_trading_oscillator"
13259        ));
13260        let info = get_indicator("decisionpoint_breadth_swenlin_trading_oscillator").unwrap();
13261        assert_eq!(info.input_kind, IndicatorInputKind::HighLow);
13262        assert_eq!(info.outputs.len(), 1);
13263        assert_eq!(info.outputs[0].id, "value");
13264        assert!(info.params.is_empty());
13265        assert!(info.capabilities.supports_cpu_single);
13266        assert!(info.capabilities.supports_cpu_batch);
13267        assert!(!info.capabilities.supports_cuda_batch);
13268        assert!(!info.capabilities.supports_cuda_vram);
13269    }
13270
13271    #[test]
13272    fn velocity_acceleration_indicator_is_registered_for_cpu_batch_only() {
13273        assert!(supplemental_supports_cpu_batch(
13274            "velocity_acceleration_indicator"
13275        ));
13276        assert!(!supplemental_supports_cuda_batch(
13277            "velocity_acceleration_indicator"
13278        ));
13279        let info = get_indicator("velocity_acceleration_indicator").unwrap();
13280        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13281        assert_eq!(info.outputs.len(), 1);
13282        assert_eq!(info.outputs[0].id, "value");
13283        assert_eq!(info.params.len(), 3);
13284        assert_eq!(info.params[0].key, "length");
13285        assert_eq!(info.params[1].key, "smooth_length");
13286        assert_eq!(info.params[2].key, "source");
13287        assert!(info.capabilities.supports_cpu_single);
13288        assert!(info.capabilities.supports_cpu_batch);
13289        assert!(!info.capabilities.supports_cuda_batch);
13290        assert!(!info.capabilities.supports_cuda_vram);
13291    }
13292
13293    #[test]
13294    fn normalized_resonator_is_registered_for_cpu_batch_only() {
13295        assert!(supplemental_supports_cpu_batch("normalized_resonator"));
13296        assert!(!supplemental_supports_cuda_batch("normalized_resonator"));
13297        let info = get_indicator("normalized_resonator").unwrap();
13298        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13299        assert_eq!(info.outputs.len(), 2);
13300        assert_eq!(info.outputs[0].id, "oscillator");
13301        assert_eq!(info.outputs[1].id, "signal");
13302        assert_eq!(info.params.len(), 5);
13303        assert_eq!(info.params[0].key, "period");
13304        assert_eq!(info.params[1].key, "delta");
13305        assert_eq!(info.params[2].key, "lookback_mult");
13306        assert_eq!(info.params[3].key, "signal_length");
13307        assert_eq!(info.params[4].key, "source");
13308        assert!(info.capabilities.supports_cpu_single);
13309        assert!(info.capabilities.supports_cpu_batch);
13310        assert!(!info.capabilities.supports_cuda_batch);
13311        assert!(!info.capabilities.supports_cuda_vram);
13312    }
13313
13314    #[test]
13315    fn monotonicity_index_is_registered_for_cpu_batch_only() {
13316        assert!(supplemental_supports_cpu_batch("monotonicity_index"));
13317        assert!(!supplemental_supports_cuda_batch("monotonicity_index"));
13318        let info = get_indicator("monotonicity_index").unwrap();
13319        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13320        assert_eq!(info.outputs.len(), 3);
13321        assert_eq!(info.outputs[0].id, "index");
13322        assert_eq!(info.outputs[1].id, "cumulative_mean");
13323        assert_eq!(info.outputs[2].id, "upper_bound");
13324        assert_eq!(info.params.len(), 4);
13325        assert_eq!(info.params[0].key, "length");
13326        assert_eq!(info.params[1].key, "mode");
13327        assert_eq!(info.params[2].key, "index_smooth");
13328        assert_eq!(info.params[3].key, "source");
13329        assert!(info.capabilities.supports_cpu_single);
13330        assert!(info.capabilities.supports_cpu_batch);
13331        assert!(!info.capabilities.supports_cuda_batch);
13332        assert!(!info.capabilities.supports_cuda_vram);
13333    }
13334
13335    #[test]
13336    fn half_causal_estimator_is_registered_for_cpu_batch_only() {
13337        assert!(supplemental_supports_cpu_batch("half_causal_estimator"));
13338        assert!(!supplemental_supports_cuda_batch("half_causal_estimator"));
13339        let info = get_indicator("half_causal_estimator").unwrap();
13340        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13341        assert_eq!(info.outputs.len(), 2);
13342        assert_eq!(info.outputs[0].id, "estimate");
13343        assert_eq!(info.outputs[1].id, "expected_value");
13344        assert_eq!(info.params.len(), 10);
13345        assert_eq!(info.params[0].key, "slots_per_day");
13346        assert_eq!(info.params[1].key, "data_period");
13347        assert_eq!(info.params[9].key, "source");
13348        assert!(info.capabilities.supports_cpu_single);
13349        assert!(info.capabilities.supports_cpu_batch);
13350        assert!(!info.capabilities.supports_cuda_batch);
13351        assert!(!info.capabilities.supports_cuda_vram);
13352    }
13353
13354    #[test]
13355    fn bull_power_vs_bear_power_is_registered_for_cpu_batch_only() {
13356        assert!(supplemental_supports_cpu_batch("bull_power_vs_bear_power"));
13357        assert!(!supplemental_supports_cuda_batch(
13358            "bull_power_vs_bear_power"
13359        ));
13360        let info = get_indicator("bull_power_vs_bear_power").unwrap();
13361        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13362        assert_eq!(info.outputs.len(), 1);
13363        assert_eq!(info.outputs[0].id, "value");
13364        assert_eq!(info.params.len(), 1);
13365        assert_eq!(info.params[0].key, "period");
13366        assert!(info.capabilities.supports_cpu_single);
13367        assert!(info.capabilities.supports_cpu_batch);
13368        assert!(!info.capabilities.supports_cuda_batch);
13369        assert!(!info.capabilities.supports_cuda_vram);
13370    }
13371
13372    #[test]
13373    fn didi_index_is_registered_for_cpu_batch_only() {
13374        assert!(supplemental_supports_cpu_batch("didi_index"));
13375        assert!(!supplemental_supports_cuda_batch("didi_index"));
13376        let info = get_indicator("didi_index").unwrap();
13377        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13378        assert_eq!(info.outputs.len(), 4);
13379        assert_eq!(info.outputs[0].id, "short");
13380        assert_eq!(info.outputs[1].id, "long");
13381        assert_eq!(info.outputs[2].id, "crossover");
13382        assert_eq!(info.outputs[3].id, "crossunder");
13383        assert_eq!(info.params.len(), 3);
13384        assert!(info.capabilities.supports_cpu_single);
13385        assert!(info.capabilities.supports_cpu_batch);
13386        assert!(!info.capabilities.supports_cuda_batch);
13387        assert!(!info.capabilities.supports_cuda_vram);
13388    }
13389
13390    #[test]
13391    fn ehlers_autocorrelation_periodogram_is_registered_for_cpu_batch_only() {
13392        assert!(supplemental_supports_cpu_batch(
13393            "ehlers_autocorrelation_periodogram"
13394        ));
13395        assert!(!supplemental_supports_cuda_batch(
13396            "ehlers_autocorrelation_periodogram"
13397        ));
13398        let info = get_indicator("ehlers_autocorrelation_periodogram").unwrap();
13399        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13400        assert_eq!(info.outputs.len(), 2);
13401        assert_eq!(info.outputs[0].id, "dominant_cycle");
13402        assert_eq!(info.outputs[1].id, "normalized_power");
13403        assert_eq!(info.params.len(), 4);
13404        assert_eq!(info.params[0].key, "min_period");
13405        assert_eq!(info.params[1].key, "max_period");
13406        assert_eq!(info.params[2].key, "avg_length");
13407        assert_eq!(info.params[3].key, "enhance");
13408        assert!(info.capabilities.supports_cpu_single);
13409        assert!(info.capabilities.supports_cpu_batch);
13410        assert!(!info.capabilities.supports_cuda_batch);
13411        assert!(!info.capabilities.supports_cuda_vram);
13412    }
13413
13414    #[test]
13415    fn ehlers_linear_extrapolation_predictor_is_registered_for_cpu_batch_only() {
13416        assert!(supplemental_supports_cpu_batch(
13417            "ehlers_linear_extrapolation_predictor"
13418        ));
13419        assert!(!supplemental_supports_cuda_batch(
13420            "ehlers_linear_extrapolation_predictor"
13421        ));
13422        let info = get_indicator("ehlers_linear_extrapolation_predictor").unwrap();
13423        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13424        assert_eq!(info.outputs.len(), 5);
13425        assert_eq!(info.outputs[0].id, "prediction");
13426        assert_eq!(info.outputs[1].id, "filter");
13427        assert_eq!(info.outputs[2].id, "state");
13428        assert_eq!(info.outputs[3].id, "go_long");
13429        assert_eq!(info.outputs[4].id, "go_short");
13430        assert_eq!(info.params.len(), 5);
13431        assert_eq!(info.params[0].key, "high_pass_length");
13432        assert_eq!(info.params[1].key, "low_pass_length");
13433        assert_eq!(info.params[2].key, "gain");
13434        assert_eq!(info.params[3].key, "bars_forward");
13435        assert_eq!(info.params[4].key, "signal_mode");
13436        assert!(info.capabilities.supports_cpu_single);
13437        assert!(info.capabilities.supports_cpu_batch);
13438        assert!(!info.capabilities.supports_cuda_batch);
13439        assert!(!info.capabilities.supports_cuda_vram);
13440    }
13441
13442    #[test]
13443    fn vertical_horizontal_filter_is_registered_for_cpu_batch_only() {
13444        assert!(supplemental_supports_cpu_batch(
13445            "vertical_horizontal_filter"
13446        ));
13447        assert!(!supplemental_supports_cuda_batch(
13448            "vertical_horizontal_filter"
13449        ));
13450        let info = get_indicator("vertical_horizontal_filter").unwrap();
13451        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13452        assert_eq!(info.outputs.len(), 1);
13453        assert_eq!(info.outputs[0].id, "value");
13454        assert_eq!(info.params.len(), 1);
13455        assert_eq!(info.params[0].key, "length");
13456        assert!(info.capabilities.supports_cpu_single);
13457        assert!(info.capabilities.supports_cpu_batch);
13458        assert!(!info.capabilities.supports_cuda_batch);
13459        assert!(!info.capabilities.supports_cuda_vram);
13460    }
13461
13462    #[test]
13463    fn squeeze_index_is_registered_for_cpu_batch_only() {
13464        assert!(supplemental_supports_cpu_batch("squeeze_index"));
13465        assert!(!supplemental_supports_cuda_batch("squeeze_index"));
13466        let info = get_indicator("squeeze_index").unwrap();
13467        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13468        assert_eq!(info.outputs.len(), 1);
13469        assert_eq!(info.outputs[0].id, "value");
13470        assert_eq!(info.params.len(), 2);
13471        assert_eq!(info.params[0].key, "conv");
13472        assert_eq!(info.params[1].key, "length");
13473        assert!(info.capabilities.supports_cpu_single);
13474        assert!(info.capabilities.supports_cpu_batch);
13475        assert!(!info.capabilities.supports_cuda_batch);
13476        assert!(!info.capabilities.supports_cuda_vram);
13477    }
13478
13479    #[test]
13480    fn stochastic_distance_is_registered_for_cpu_batch_only() {
13481        assert!(supplemental_supports_cpu_batch("stochastic_distance"));
13482        assert!(!supplemental_supports_cuda_batch("stochastic_distance"));
13483        let info = get_indicator("stochastic_distance").unwrap();
13484        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13485        assert_eq!(info.outputs.len(), 2);
13486        assert_eq!(info.outputs[0].id, "oscillator");
13487        assert_eq!(info.outputs[1].id, "signal");
13488        assert_eq!(info.params.len(), 5);
13489        assert_eq!(info.params[0].key, "lookback_length");
13490        assert_eq!(info.params[1].key, "length1");
13491        assert_eq!(info.params[2].key, "length2");
13492        assert_eq!(info.params[3].key, "ob_level");
13493        assert_eq!(info.params[4].key, "os_level");
13494        assert!(info.capabilities.supports_cpu_single);
13495        assert!(info.capabilities.supports_cpu_batch);
13496        assert!(!info.capabilities.supports_cuda_batch);
13497        assert!(!info.capabilities.supports_cuda_vram);
13498    }
13499
13500    #[test]
13501    fn adaptive_bandpass_trigger_oscillator_is_registered_for_cpu_batch_only() {
13502        assert!(supplemental_supports_cpu_batch(
13503            "adaptive_bandpass_trigger_oscillator"
13504        ));
13505        assert!(!supplemental_supports_cuda_batch(
13506            "adaptive_bandpass_trigger_oscillator"
13507        ));
13508        let info = get_indicator("adaptive_bandpass_trigger_oscillator").unwrap();
13509        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13510        assert_eq!(info.outputs.len(), 2);
13511        assert_eq!(info.outputs[0].id, "in_phase");
13512        assert_eq!(info.outputs[1].id, "lead");
13513        assert_eq!(info.params.len(), 2);
13514        assert_eq!(info.params[0].key, "delta");
13515        assert_eq!(info.params[1].key, "alpha");
13516        assert!(info.capabilities.supports_cpu_single);
13517        assert!(info.capabilities.supports_cpu_batch);
13518        assert!(!info.capabilities.supports_cuda_batch);
13519        assert!(!info.capabilities.supports_cuda_vram);
13520    }
13521
13522    #[test]
13523    fn absolute_strength_index_oscillator_is_registered_for_cpu_batch_only() {
13524        assert!(supplemental_supports_cpu_batch(
13525            "absolute_strength_index_oscillator"
13526        ));
13527        assert!(!supplemental_supports_cuda_batch(
13528            "absolute_strength_index_oscillator"
13529        ));
13530        let info = get_indicator("absolute_strength_index_oscillator").unwrap();
13531        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13532        assert_eq!(info.outputs.len(), 3);
13533        assert_eq!(info.outputs[0].id, "oscillator");
13534        assert_eq!(info.outputs[1].id, "signal");
13535        assert_eq!(info.outputs[2].id, "histogram");
13536        assert_eq!(info.params.len(), 2);
13537        assert_eq!(info.params[0].key, "ema_length");
13538        assert_eq!(info.params[1].key, "signal_length");
13539        assert!(info.capabilities.supports_cpu_single);
13540        assert!(info.capabilities.supports_cpu_batch);
13541        assert!(!info.capabilities.supports_cuda_batch);
13542        assert!(!info.capabilities.supports_cuda_vram);
13543    }
13544
13545    #[test]
13546    fn premier_rsi_oscillator_is_registered_for_cpu_batch_only() {
13547        assert!(supplemental_supports_cpu_batch("premier_rsi_oscillator"));
13548        assert!(!supplemental_supports_cuda_batch("premier_rsi_oscillator"));
13549        let info = get_indicator("premier_rsi_oscillator").unwrap();
13550        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13551        assert_eq!(info.outputs.len(), 1);
13552        assert_eq!(info.outputs[0].id, "value");
13553        assert_eq!(info.params.len(), 3);
13554        assert_eq!(info.params[0].key, "rsi_length");
13555        assert_eq!(info.params[1].key, "stoch_length");
13556        assert_eq!(info.params[2].key, "smooth_length");
13557        assert!(info.capabilities.supports_cpu_single);
13558        assert!(info.capabilities.supports_cpu_batch);
13559        assert!(!info.capabilities.supports_cuda_batch);
13560        assert!(!info.capabilities.supports_cuda_vram);
13561    }
13562
13563    #[test]
13564    fn multi_length_stochastic_average_is_registered_for_cpu_batch_only() {
13565        assert!(supplemental_supports_cpu_batch(
13566            "multi_length_stochastic_average"
13567        ));
13568        assert!(!supplemental_supports_cuda_batch(
13569            "multi_length_stochastic_average"
13570        ));
13571        let info = get_indicator("multi_length_stochastic_average").unwrap();
13572        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13573        assert_eq!(info.outputs.len(), 1);
13574        assert_eq!(info.outputs[0].id, "value");
13575        assert_eq!(info.params.len(), 6);
13576        assert_eq!(info.params[0].key, "length");
13577        assert_eq!(info.params[1].key, "presmooth");
13578        assert_eq!(info.params[2].key, "premethod");
13579        assert_eq!(info.params[3].key, "postsmooth");
13580        assert_eq!(info.params[4].key, "postmethod");
13581        assert_eq!(info.params[5].key, "source");
13582        assert!(info.capabilities.supports_cpu_single);
13583        assert!(info.capabilities.supports_cpu_batch);
13584        assert!(!info.capabilities.supports_cuda_batch);
13585        assert!(!info.capabilities.supports_cuda_vram);
13586    }
13587
13588    #[test]
13589    fn hull_butterfly_oscillator_is_registered_for_cpu_batch_only() {
13590        assert!(supplemental_supports_cpu_batch("hull_butterfly_oscillator"));
13591        assert!(!supplemental_supports_cuda_batch(
13592            "hull_butterfly_oscillator"
13593        ));
13594        let info = get_indicator("hull_butterfly_oscillator").unwrap();
13595        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13596        assert_eq!(info.outputs.len(), 3);
13597        assert_eq!(info.outputs[0].id, "oscillator");
13598        assert_eq!(info.outputs[1].id, "cumulative_mean");
13599        assert_eq!(info.outputs[2].id, "signal");
13600        assert_eq!(info.params.len(), 3);
13601        assert_eq!(info.params[0].key, "length");
13602        assert_eq!(info.params[1].key, "mult");
13603        assert_eq!(info.params[2].key, "source");
13604        assert!(info.capabilities.supports_cpu_single);
13605        assert!(info.capabilities.supports_cpu_batch);
13606        assert!(!info.capabilities.supports_cuda_batch);
13607        assert!(!info.capabilities.supports_cuda_vram);
13608    }
13609
13610    #[test]
13611    fn fibonacci_trailing_stop_is_registered_for_cpu_batch_only() {
13612        assert!(supplemental_supports_cpu_batch("fibonacci_trailing_stop"));
13613        assert!(!supplemental_supports_cuda_batch("fibonacci_trailing_stop"));
13614        let info = get_indicator("fibonacci_trailing_stop").unwrap();
13615        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13616        assert_eq!(info.outputs.len(), 4);
13617        assert_eq!(info.outputs[0].id, "trailing_stop");
13618        assert_eq!(info.outputs[1].id, "long_stop");
13619        assert_eq!(info.outputs[2].id, "short_stop");
13620        assert_eq!(info.outputs[3].id, "direction");
13621        assert_eq!(info.params.len(), 4);
13622        assert_eq!(info.params[0].key, "left_bars");
13623        assert_eq!(info.params[1].key, "right_bars");
13624        assert_eq!(info.params[2].key, "level");
13625        assert_eq!(info.params[3].key, "trigger");
13626        assert!(info.capabilities.supports_cpu_single);
13627        assert!(info.capabilities.supports_cpu_batch);
13628        assert!(!info.capabilities.supports_cuda_batch);
13629        assert!(!info.capabilities.supports_cuda_vram);
13630    }
13631
13632    #[test]
13633    fn fibonacci_entry_bands_is_registered_for_cpu_batch_only() {
13634        assert!(supplemental_supports_cpu_batch("fibonacci_entry_bands"));
13635        assert!(!supplemental_supports_cuda_batch("fibonacci_entry_bands"));
13636        let info = get_indicator("fibonacci_entry_bands").unwrap();
13637        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13638        assert_eq!(info.outputs.len(), 18);
13639        assert_eq!(info.outputs[0].id, "middle");
13640        assert_eq!(info.outputs[1].id, "trend");
13641        assert_eq!(info.outputs[10].id, "tp_long_band");
13642        assert_eq!(info.outputs[11].id, "tp_short_band");
13643        assert_eq!(info.outputs[12].id, "go_long");
13644        assert_eq!(info.outputs[13].id, "go_short");
13645        assert_eq!(info.params.len(), 5);
13646        assert_eq!(info.params[0].key, "source");
13647        assert_eq!(info.params[1].key, "length");
13648        assert_eq!(info.params[2].key, "atr_length");
13649        assert_eq!(info.params[3].key, "use_atr");
13650        assert_eq!(info.params[4].key, "tp_aggressiveness");
13651        assert!(info.capabilities.supports_cpu_single);
13652        assert!(info.capabilities.supports_cpu_batch);
13653        assert!(!info.capabilities.supports_cuda_batch);
13654        assert!(!info.capabilities.supports_cuda_vram);
13655    }
13656
13657    #[test]
13658    fn volume_energy_reservoirs_is_registered_for_cpu_batch_only() {
13659        assert!(supplemental_supports_cpu_batch("volume_energy_reservoirs"));
13660        assert!(!supplemental_supports_cuda_batch(
13661            "volume_energy_reservoirs"
13662        ));
13663        let info = get_indicator("volume_energy_reservoirs").unwrap();
13664        assert_eq!(info.input_kind, IndicatorInputKind::Ohlcv);
13665        assert_eq!(info.outputs.len(), 6);
13666        assert_eq!(info.outputs[0].id, "momentum");
13667        assert_eq!(info.outputs[1].id, "reservoir");
13668        assert_eq!(info.outputs[2].id, "squeeze_active");
13669        assert_eq!(info.outputs[3].id, "squeeze_start");
13670        assert_eq!(info.outputs[4].id, "range_high");
13671        assert_eq!(info.outputs[5].id, "range_low");
13672        assert_eq!(info.params.len(), 2);
13673        assert_eq!(info.params[0].key, "length");
13674        assert_eq!(info.params[1].key, "sensitivity");
13675        assert!(info.capabilities.supports_cpu_single);
13676        assert!(info.capabilities.supports_cpu_batch);
13677        assert!(!info.capabilities.supports_cuda_batch);
13678        assert!(!info.capabilities.supports_cuda_vram);
13679    }
13680
13681    #[test]
13682    fn neighboring_trailing_stop_is_registered_for_cpu_batch_only() {
13683        assert!(supplemental_supports_cpu_batch("neighboring_trailing_stop"));
13684        assert!(!supplemental_supports_cuda_batch(
13685            "neighboring_trailing_stop"
13686        ));
13687        let info = get_indicator("neighboring_trailing_stop").unwrap();
13688        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13689        assert_eq!(info.outputs.len(), 6);
13690        assert_eq!(info.outputs[0].id, "trailing_stop");
13691        assert_eq!(info.outputs[1].id, "bullish_band");
13692        assert_eq!(info.outputs[2].id, "bearish_band");
13693        assert_eq!(info.outputs[3].id, "direction");
13694        assert_eq!(info.outputs[4].id, "discovery_bull");
13695        assert_eq!(info.outputs[5].id, "discovery_bear");
13696        assert_eq!(info.params.len(), 4);
13697        assert_eq!(info.params[0].key, "buffer_size");
13698        assert_eq!(info.params[1].key, "k");
13699        assert_eq!(info.params[2].key, "percentile");
13700        assert_eq!(info.params[3].key, "smooth");
13701        assert!(info.capabilities.supports_cpu_single);
13702        assert!(info.capabilities.supports_cpu_batch);
13703        assert!(!info.capabilities.supports_cuda_batch);
13704        assert!(!info.capabilities.supports_cuda_vram);
13705    }
13706
13707    #[test]
13708    fn macd_wave_signal_pro_is_registered_for_cpu_batch_only() {
13709        assert!(supplemental_supports_cpu_batch("macd_wave_signal_pro"));
13710        assert!(!supplemental_supports_cuda_batch("macd_wave_signal_pro"));
13711        let info = get_indicator("macd_wave_signal_pro").unwrap();
13712        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13713        assert_eq!(info.outputs.len(), 6);
13714        assert_eq!(info.outputs[0].id, "diff");
13715        assert_eq!(info.outputs[1].id, "dea");
13716        assert_eq!(info.outputs[2].id, "macd_histogram");
13717        assert_eq!(info.outputs[3].id, "line_convergence");
13718        assert_eq!(info.outputs[4].id, "buy_signal");
13719        assert_eq!(info.outputs[5].id, "sell_signal");
13720        assert!(info.params.is_empty());
13721        assert!(info.capabilities.supports_cpu_single);
13722        assert!(info.capabilities.supports_cpu_batch);
13723        assert!(!info.capabilities.supports_cuda_batch);
13724        assert!(!info.capabilities.supports_cuda_vram);
13725    }
13726
13727    #[test]
13728    fn hema_trend_levels_is_registered_for_cpu_batch_only() {
13729        assert!(supplemental_supports_cpu_batch("hema_trend_levels"));
13730        assert!(!supplemental_supports_cuda_batch("hema_trend_levels"));
13731        let info = get_indicator("hema_trend_levels").unwrap();
13732        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13733        assert_eq!(info.outputs.len(), 15);
13734        assert_eq!(info.outputs[0].id, "fast_hema");
13735        assert_eq!(info.outputs[1].id, "slow_hema");
13736        assert_eq!(info.outputs[2].id, "trend_direction");
13737        assert_eq!(info.outputs[3].id, "bar_state");
13738        assert_eq!(info.outputs[4].id, "bullish_crossover");
13739        assert_eq!(info.outputs[5].id, "bearish_crossunder");
13740        assert_eq!(info.outputs[6].id, "box_offset");
13741        assert_eq!(info.outputs[7].id, "bull_box_top");
13742        assert_eq!(info.outputs[8].id, "bull_box_bottom");
13743        assert_eq!(info.outputs[9].id, "bear_box_top");
13744        assert_eq!(info.outputs[10].id, "bear_box_bottom");
13745        assert_eq!(info.outputs[11].id, "bullish_test");
13746        assert_eq!(info.outputs[12].id, "bearish_test");
13747        assert_eq!(info.outputs[13].id, "bullish_test_level");
13748        assert_eq!(info.outputs[14].id, "bearish_test_level");
13749        assert_eq!(info.params.len(), 2);
13750        assert!(info.capabilities.supports_cpu_single);
13751        assert!(info.capabilities.supports_cpu_batch);
13752        assert!(!info.capabilities.supports_cuda_batch);
13753        assert!(!info.capabilities.supports_cuda_vram);
13754    }
13755
13756    #[test]
13757    fn grover_llorens_cycle_oscillator_is_registered_for_cpu_batch_only() {
13758        assert!(supplemental_supports_cpu_batch(
13759            "grover_llorens_cycle_oscillator"
13760        ));
13761        assert!(!supplemental_supports_cuda_batch(
13762            "grover_llorens_cycle_oscillator"
13763        ));
13764        let info = get_indicator("grover_llorens_cycle_oscillator").unwrap();
13765        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13766        assert_eq!(info.outputs.len(), 1);
13767        assert_eq!(info.outputs[0].id, "value");
13768        assert_eq!(info.params.len(), 5);
13769        assert_eq!(info.params[0].key, "length");
13770        assert_eq!(info.params[1].key, "mult");
13771        assert_eq!(info.params[2].key, "source");
13772        assert_eq!(info.params[3].key, "smooth");
13773        assert_eq!(info.params[4].key, "rsi_period");
13774        assert!(info.capabilities.supports_cpu_single);
13775        assert!(info.capabilities.supports_cpu_batch);
13776        assert!(!info.capabilities.supports_cuda_batch);
13777        assert!(!info.capabilities.supports_cuda_vram);
13778    }
13779
13780    #[test]
13781    fn intraday_momentum_index_is_registered_for_cpu_batch_only() {
13782        assert!(supplemental_supports_cpu_batch("intraday_momentum_index"));
13783        assert!(!supplemental_supports_cuda_batch("intraday_momentum_index"));
13784        let info = get_indicator("intraday_momentum_index").unwrap();
13785        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13786        assert_eq!(info.outputs.len(), 4);
13787        assert_eq!(info.outputs[0].id, "imi");
13788        assert_eq!(info.outputs[1].id, "upper_hit");
13789        assert_eq!(info.outputs[2].id, "lower_hit");
13790        assert_eq!(info.outputs[3].id, "signal");
13791        assert_eq!(info.params.len(), 6);
13792        assert_eq!(info.params[0].key, "length");
13793        assert_eq!(info.params[1].key, "length_ma");
13794        assert_eq!(info.params[2].key, "mult");
13795        assert_eq!(info.params[3].key, "length_bb");
13796        assert_eq!(info.params[4].key, "apply_smoothing");
13797        assert_eq!(info.params[5].key, "low_band");
13798        assert!(info.capabilities.supports_cpu_single);
13799        assert!(info.capabilities.supports_cpu_batch);
13800        assert!(!info.capabilities.supports_cuda_batch);
13801        assert!(!info.capabilities.supports_cuda_vram);
13802    }
13803
13804    #[test]
13805    fn vwap_zscore_with_signals_is_registered_for_cpu_batch_only() {
13806        assert!(supplemental_supports_cpu_batch("vwap_zscore_with_signals"));
13807        assert!(!supplemental_supports_cuda_batch(
13808            "vwap_zscore_with_signals"
13809        ));
13810        let info = get_indicator("vwap_zscore_with_signals").unwrap();
13811        assert_eq!(info.input_kind, IndicatorInputKind::CloseVolume);
13812        assert_eq!(info.outputs.len(), 3);
13813        assert_eq!(info.outputs[0].id, "zvwap");
13814        assert_eq!(info.outputs[1].id, "support_signal");
13815        assert_eq!(info.outputs[2].id, "resistance_signal");
13816        assert_eq!(info.params.len(), 3);
13817        assert_eq!(info.params[0].key, "length");
13818        assert_eq!(info.params[1].key, "upper_bottom");
13819        assert_eq!(info.params[2].key, "lower_bottom");
13820        assert!(info.capabilities.supports_cpu_single);
13821        assert!(info.capabilities.supports_cpu_batch);
13822        assert!(!info.capabilities.supports_cuda_batch);
13823        assert!(!info.capabilities.supports_cuda_vram);
13824    }
13825
13826    #[test]
13827    fn atr_percentile_is_registered_for_cpu_batch_only() {
13828        assert!(supplemental_supports_cpu_batch("atr_percentile"));
13829        assert!(!supplemental_supports_cuda_batch("atr_percentile"));
13830        let info = get_indicator("atr_percentile").unwrap();
13831        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13832        assert_eq!(info.outputs.len(), 1);
13833        assert_eq!(info.outputs[0].id, "value");
13834        assert_eq!(info.params.len(), 2);
13835        assert_eq!(info.params[0].key, "atr_length");
13836        assert_eq!(info.params[1].key, "percentile_length");
13837        assert!(info.capabilities.supports_cpu_single);
13838        assert!(info.capabilities.supports_cpu_batch);
13839        assert!(!info.capabilities.supports_cuda_batch);
13840        assert!(!info.capabilities.supports_cuda_vram);
13841    }
13842
13843    #[test]
13844    fn gopalakrishnan_range_index_is_registered_for_cpu_batch_only() {
13845        assert!(supplemental_supports_cpu_batch(
13846            "gopalakrishnan_range_index"
13847        ));
13848        assert!(!supplemental_supports_cuda_batch(
13849            "gopalakrishnan_range_index"
13850        ));
13851        let info = get_indicator("gopalakrishnan_range_index").unwrap();
13852        assert_eq!(info.input_kind, IndicatorInputKind::HighLow);
13853        assert_eq!(info.outputs.len(), 1);
13854        assert_eq!(info.outputs[0].id, "value");
13855        assert_eq!(info.params.len(), 1);
13856        assert_eq!(info.params[0].key, "length");
13857        assert!(info.capabilities.supports_cpu_single);
13858        assert!(info.capabilities.supports_cpu_batch);
13859        assert!(!info.capabilities.supports_cuda_batch);
13860        assert!(!info.capabilities.supports_cuda_vram);
13861    }
13862
13863    #[test]
13864    fn demand_index_is_registered_for_cpu_batch_only() {
13865        assert!(supplemental_supports_cpu_batch("demand_index"));
13866        assert!(!supplemental_supports_cuda_batch("demand_index"));
13867        let info = get_indicator("demand_index").unwrap();
13868        assert_eq!(info.input_kind, IndicatorInputKind::Ohlcv);
13869        assert_eq!(info.outputs.len(), 2);
13870        assert_eq!(info.outputs[0].id, "demand_index");
13871        assert_eq!(info.outputs[1].id, "signal");
13872        assert_eq!(info.params.len(), 4);
13873        assert_eq!(info.params[0].key, "len_bs");
13874        assert_eq!(info.params[1].key, "len_bs_ma");
13875        assert_eq!(info.params[2].key, "len_di_ma");
13876        assert_eq!(info.params[3].key, "ma_type");
13877        assert!(info.capabilities.supports_cpu_single);
13878        assert!(info.capabilities.supports_cpu_batch);
13879        assert!(!info.capabilities.supports_cuda_batch);
13880        assert!(!info.capabilities.supports_cuda_vram);
13881    }
13882}