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"];
198const ENUM_VALUES_VDO_SESSION_MODE: &[&str] =
199    &["4_hours", "daily", "weekly", "rolling_bars", "rolling_days"];
200const ENUM_VALUES_VDO_DEVIATION_MODE: &[&str] = &["percent", "absolute", "zscore"];
201const ENUM_VALUES_ICHI_NORMALIZE_MODE: &[&str] = &["all", "window", "disabled"];
202const ENUM_VALUES_STATISTICAL_TRAILING_STOP_BASE_LEVEL: &[&str] =
203    &["level0", "level1", "level2", "level3"];
204const ENUM_VALUES_EDCT3_OUTPUT: &[&str] = &["corrected", "t3"];
205const ENUM_VALUES_NORMALIZED_VOLUME_TRUE_RANGE_OUTPUT: &[&str] = &[
206    "normalized_volume",
207    "normalized_true_range",
208    "baseline",
209    "atr",
210    "average_volume",
211];
212const ENUM_VALUES_MOVING_AVERAGE_CROSS_PROBABILITY_MA_TYPE: &[&str] = &["ema", "sma"];
213const ENUM_VALUES_BULLS_V_BEARS_MA_TYPE: &[&str] = &["ema", "sma", "wma"];
214const ENUM_VALUES_BULLS_V_BEARS_CALCULATION_METHOD: &[&str] = &["normalized", "raw"];
215const ENUM_VALUES_SMOOTH_THEIL_SEN_STAT_STYLE: &[&str] =
216    &["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_GOPALAKRISHNAN_RANGE_INDEX: &[IndicatorParamInfo] = &[IndicatorParamInfo {
6559    key: "length",
6560    label: "Length",
6561    kind: IndicatorParamKind::Int,
6562    required: false,
6563    default: Some(ParamValueStatic::Int(5)),
6564    min: Some(2.0),
6565    max: None,
6566    step: Some(1.0),
6567    enum_values: EMPTY_ENUM_VALUES,
6568    notes: None,
6569}];
6570
6571const PARAM_ATR_PERCENTILE: &[IndicatorParamInfo] = &[
6572    IndicatorParamInfo {
6573        key: "atr_length",
6574        label: "ATR Length",
6575        kind: IndicatorParamKind::Int,
6576        required: false,
6577        default: Some(ParamValueStatic::Int(10)),
6578        min: Some(1.0),
6579        max: None,
6580        step: Some(1.0),
6581        enum_values: EMPTY_ENUM_VALUES,
6582        notes: None,
6583    },
6584    IndicatorParamInfo {
6585        key: "percentile_length",
6586        label: "Percentile Length",
6587        kind: IndicatorParamKind::Int,
6588        required: false,
6589        default: Some(ParamValueStatic::Int(50)),
6590        min: Some(1.0),
6591        max: None,
6592        step: Some(1.0),
6593        enum_values: EMPTY_ENUM_VALUES,
6594        notes: None,
6595    },
6596];
6597
6598const PARAM_HISTORICAL_VOLATILITY: &[IndicatorParamInfo] = &[
6599    IndicatorParamInfo {
6600        key: "lookback",
6601        label: "Lookback",
6602        kind: IndicatorParamKind::Int,
6603        required: false,
6604        default: Some(ParamValueStatic::Int(20)),
6605        min: Some(1.0),
6606        max: None,
6607        step: Some(1.0),
6608        enum_values: EMPTY_ENUM_VALUES,
6609        notes: None,
6610    },
6611    IndicatorParamInfo {
6612        key: "annualization_days",
6613        label: "Annualization Days",
6614        kind: IndicatorParamKind::Float,
6615        required: false,
6616        default: Some(ParamValueStatic::Float(250.0)),
6617        min: Some(0.0),
6618        max: None,
6619        step: None,
6620        enum_values: EMPTY_ENUM_VALUES,
6621        notes: None,
6622    },
6623];
6624
6625const PARAM_VELOCITY_ACCELERATION_INDICATOR: &[IndicatorParamInfo] = &[
6626    IndicatorParamInfo {
6627        key: "length",
6628        label: "Length",
6629        kind: IndicatorParamKind::Int,
6630        required: false,
6631        default: Some(ParamValueStatic::Int(21)),
6632        min: Some(2.0),
6633        max: None,
6634        step: Some(1.0),
6635        enum_values: EMPTY_ENUM_VALUES,
6636        notes: None,
6637    },
6638    IndicatorParamInfo {
6639        key: "smooth_length",
6640        label: "Smooth Length",
6641        kind: IndicatorParamKind::Int,
6642        required: false,
6643        default: Some(ParamValueStatic::Int(5)),
6644        min: Some(1.0),
6645        max: None,
6646        step: Some(1.0),
6647        enum_values: EMPTY_ENUM_VALUES,
6648        notes: None,
6649    },
6650    IndicatorParamInfo {
6651        key: "source",
6652        label: "Source",
6653        kind: IndicatorParamKind::EnumString,
6654        required: false,
6655        default: Some(ParamValueStatic::EnumString("hlcc4")),
6656        min: None,
6657        max: None,
6658        step: None,
6659        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
6660        notes: None,
6661    },
6662];
6663
6664const PARAM_NORMALIZED_RESONATOR: &[IndicatorParamInfo] = &[
6665    IndicatorParamInfo {
6666        key: "period",
6667        label: "Period",
6668        kind: IndicatorParamKind::Int,
6669        required: false,
6670        default: Some(ParamValueStatic::Int(100)),
6671        min: Some(2.0),
6672        max: None,
6673        step: Some(1.0),
6674        enum_values: EMPTY_ENUM_VALUES,
6675        notes: None,
6676    },
6677    IndicatorParamInfo {
6678        key: "delta",
6679        label: "Delta",
6680        kind: IndicatorParamKind::Float,
6681        required: false,
6682        default: Some(ParamValueStatic::Float(0.5)),
6683        min: Some(0.01),
6684        max: Some(1.0),
6685        step: Some(0.05),
6686        enum_values: EMPTY_ENUM_VALUES,
6687        notes: None,
6688    },
6689    IndicatorParamInfo {
6690        key: "lookback_mult",
6691        label: "Lookback Multiplier",
6692        kind: IndicatorParamKind::Float,
6693        required: false,
6694        default: Some(ParamValueStatic::Float(1.0)),
6695        min: Some(0.1),
6696        max: None,
6697        step: Some(0.1),
6698        enum_values: EMPTY_ENUM_VALUES,
6699        notes: None,
6700    },
6701    IndicatorParamInfo {
6702        key: "signal_length",
6703        label: "Signal Length",
6704        kind: IndicatorParamKind::Int,
6705        required: false,
6706        default: Some(ParamValueStatic::Int(9)),
6707        min: Some(1.0),
6708        max: None,
6709        step: Some(1.0),
6710        enum_values: EMPTY_ENUM_VALUES,
6711        notes: None,
6712    },
6713    IndicatorParamInfo {
6714        key: "source",
6715        label: "Source",
6716        kind: IndicatorParamKind::EnumString,
6717        required: false,
6718        default: Some(ParamValueStatic::EnumString("hl2")),
6719        min: None,
6720        max: None,
6721        step: None,
6722        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
6723        notes: None,
6724    },
6725];
6726
6727const PARAM_MONOTONICITY_INDEX: &[IndicatorParamInfo] = &[
6728    IndicatorParamInfo {
6729        key: "length",
6730        label: "Period",
6731        kind: IndicatorParamKind::Int,
6732        required: false,
6733        default: Some(ParamValueStatic::Int(20)),
6734        min: Some(2.0),
6735        max: None,
6736        step: Some(1.0),
6737        enum_values: EMPTY_ENUM_VALUES,
6738        notes: None,
6739    },
6740    IndicatorParamInfo {
6741        key: "mode",
6742        label: "Mode",
6743        kind: IndicatorParamKind::EnumString,
6744        required: false,
6745        default: Some(ParamValueStatic::EnumString("efficiency")),
6746        min: None,
6747        max: None,
6748        step: None,
6749        enum_values: ENUM_VALUES_MONOTONICITY_INDEX_MODE,
6750        notes: None,
6751    },
6752    IndicatorParamInfo {
6753        key: "index_smooth",
6754        label: "Index Smoothing",
6755        kind: IndicatorParamKind::Int,
6756        required: false,
6757        default: Some(ParamValueStatic::Int(5)),
6758        min: Some(1.0),
6759        max: None,
6760        step: Some(1.0),
6761        enum_values: EMPTY_ENUM_VALUES,
6762        notes: None,
6763    },
6764    IndicatorParamInfo {
6765        key: "source",
6766        label: "Source",
6767        kind: IndicatorParamKind::EnumString,
6768        required: false,
6769        default: Some(ParamValueStatic::EnumString("close")),
6770        min: None,
6771        max: None,
6772        step: None,
6773        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
6774        notes: None,
6775    },
6776];
6777
6778const PARAM_HALF_CAUSAL_ESTIMATOR: &[IndicatorParamInfo] = &[
6779    IndicatorParamInfo {
6780        key: "slots_per_day",
6781        label: "Slots Per Day",
6782        kind: IndicatorParamKind::Int,
6783        required: false,
6784        default: None,
6785        min: Some(2.0),
6786        max: None,
6787        step: Some(1.0),
6788        enum_values: EMPTY_ENUM_VALUES,
6789        notes: Some("Required for raw-slice dispatch; candle dispatch infers this when omitted."),
6790    },
6791    IndicatorParamInfo {
6792        key: "data_period",
6793        label: "Data Period",
6794        kind: IndicatorParamKind::Int,
6795        required: false,
6796        default: Some(ParamValueStatic::Int(5)),
6797        min: Some(0.0),
6798        max: None,
6799        step: Some(1.0),
6800        enum_values: EMPTY_ENUM_VALUES,
6801        notes: None,
6802    },
6803    IndicatorParamInfo {
6804        key: "filter_length",
6805        label: "Filter Length",
6806        kind: IndicatorParamKind::Int,
6807        required: false,
6808        default: Some(ParamValueStatic::Int(20)),
6809        min: Some(2.0),
6810        max: None,
6811        step: Some(1.0),
6812        enum_values: EMPTY_ENUM_VALUES,
6813        notes: None,
6814    },
6815    IndicatorParamInfo {
6816        key: "kernel_width",
6817        label: "Kernel Width",
6818        kind: IndicatorParamKind::Float,
6819        required: false,
6820        default: Some(ParamValueStatic::Float(20.0)),
6821        min: Some(0.125),
6822        max: None,
6823        step: Some(0.125),
6824        enum_values: EMPTY_ENUM_VALUES,
6825        notes: None,
6826    },
6827    IndicatorParamInfo {
6828        key: "kernel_type",
6829        label: "Kernel Type",
6830        kind: IndicatorParamKind::EnumString,
6831        required: false,
6832        default: Some(ParamValueStatic::EnumString("epanechnikov")),
6833        min: None,
6834        max: None,
6835        step: None,
6836        enum_values: ENUM_VALUES_HALF_CAUSAL_ESTIMATOR_KERNEL_TYPE,
6837        notes: None,
6838    },
6839    IndicatorParamInfo {
6840        key: "confidence_adjust",
6841        label: "Confidence Adjust",
6842        kind: IndicatorParamKind::EnumString,
6843        required: false,
6844        default: Some(ParamValueStatic::EnumString("symmetric")),
6845        min: None,
6846        max: None,
6847        step: None,
6848        enum_values: ENUM_VALUES_HALF_CAUSAL_ESTIMATOR_CONFIDENCE_ADJUST,
6849        notes: None,
6850    },
6851    IndicatorParamInfo {
6852        key: "maximum_confidence_adjust",
6853        label: "Maximum Confidence Adjust",
6854        kind: IndicatorParamKind::Float,
6855        required: false,
6856        default: Some(ParamValueStatic::Float(100.0)),
6857        min: Some(0.0),
6858        max: Some(100.0),
6859        step: Some(1.0),
6860        enum_values: EMPTY_ENUM_VALUES,
6861        notes: None,
6862    },
6863    IndicatorParamInfo {
6864        key: "enable_expected_value",
6865        label: "Enable Expected Value",
6866        kind: IndicatorParamKind::Bool,
6867        required: false,
6868        default: Some(ParamValueStatic::Bool(false)),
6869        min: None,
6870        max: None,
6871        step: None,
6872        enum_values: ENUM_VALUES_TRUE_FALSE,
6873        notes: None,
6874    },
6875    IndicatorParamInfo {
6876        key: "extra_smoothing",
6877        label: "Extra Smoothing",
6878        kind: IndicatorParamKind::Int,
6879        required: false,
6880        default: Some(ParamValueStatic::Int(0)),
6881        min: Some(0.0),
6882        max: None,
6883        step: Some(1.0),
6884        enum_values: EMPTY_ENUM_VALUES,
6885        notes: None,
6886    },
6887    IndicatorParamInfo {
6888        key: "source",
6889        label: "Source",
6890        kind: IndicatorParamKind::EnumString,
6891        required: false,
6892        default: Some(ParamValueStatic::EnumString("volume")),
6893        min: None,
6894        max: None,
6895        step: None,
6896        enum_values: ENUM_VALUES_HALF_CAUSAL_ESTIMATOR_SOURCE,
6897        notes: None,
6898    },
6899];
6900
6901const PARAM_ABSOLUTE_STRENGTH_INDEX_OSCILLATOR: &[IndicatorParamInfo] = &[
6902    IndicatorParamInfo {
6903        key: "ema_length",
6904        label: "EMA Length",
6905        kind: IndicatorParamKind::Int,
6906        required: false,
6907        default: Some(ParamValueStatic::Int(21)),
6908        min: Some(1.0),
6909        max: None,
6910        step: Some(1.0),
6911        enum_values: EMPTY_ENUM_VALUES,
6912        notes: None,
6913    },
6914    IndicatorParamInfo {
6915        key: "signal_length",
6916        label: "Signal Length",
6917        kind: IndicatorParamKind::Int,
6918        required: false,
6919        default: Some(ParamValueStatic::Int(34)),
6920        min: Some(2.0),
6921        max: None,
6922        step: Some(1.0),
6923        enum_values: EMPTY_ENUM_VALUES,
6924        notes: None,
6925    },
6926];
6927
6928const PARAM_PREMIER_RSI_OSCILLATOR: &[IndicatorParamInfo] = &[
6929    IndicatorParamInfo {
6930        key: "rsi_length",
6931        label: "RSI Length",
6932        kind: IndicatorParamKind::Int,
6933        required: false,
6934        default: Some(ParamValueStatic::Int(14)),
6935        min: Some(1.0),
6936        max: None,
6937        step: Some(1.0),
6938        enum_values: EMPTY_ENUM_VALUES,
6939        notes: None,
6940    },
6941    IndicatorParamInfo {
6942        key: "stoch_length",
6943        label: "Stoch Length",
6944        kind: IndicatorParamKind::Int,
6945        required: false,
6946        default: Some(ParamValueStatic::Int(8)),
6947        min: Some(1.0),
6948        max: None,
6949        step: Some(1.0),
6950        enum_values: EMPTY_ENUM_VALUES,
6951        notes: None,
6952    },
6953    IndicatorParamInfo {
6954        key: "smooth_length",
6955        label: "Smooth Length",
6956        kind: IndicatorParamKind::Int,
6957        required: false,
6958        default: Some(ParamValueStatic::Int(25)),
6959        min: Some(1.0),
6960        max: None,
6961        step: Some(1.0),
6962        enum_values: EMPTY_ENUM_VALUES,
6963        notes: None,
6964    },
6965];
6966
6967const PARAM_MULTI_LENGTH_STOCHASTIC_AVERAGE: &[IndicatorParamInfo] = &[
6968    IndicatorParamInfo {
6969        key: "length",
6970        label: "Length",
6971        kind: IndicatorParamKind::Int,
6972        required: false,
6973        default: Some(ParamValueStatic::Int(14)),
6974        min: Some(4.0),
6975        max: None,
6976        step: Some(1.0),
6977        enum_values: EMPTY_ENUM_VALUES,
6978        notes: None,
6979    },
6980    IndicatorParamInfo {
6981        key: "presmooth",
6982        label: "Pre-Smoothing",
6983        kind: IndicatorParamKind::Int,
6984        required: false,
6985        default: Some(ParamValueStatic::Int(10)),
6986        min: Some(1.0),
6987        max: None,
6988        step: Some(1.0),
6989        enum_values: EMPTY_ENUM_VALUES,
6990        notes: None,
6991    },
6992    IndicatorParamInfo {
6993        key: "premethod",
6994        label: "Pre-Smoothing Method",
6995        kind: IndicatorParamKind::EnumString,
6996        required: false,
6997        default: Some(ParamValueStatic::EnumString("sma")),
6998        min: None,
6999        max: None,
7000        step: None,
7001        enum_values: ENUM_VALUES_MULTI_LENGTH_STOCHASTIC_AVERAGE_METHOD,
7002        notes: None,
7003    },
7004    IndicatorParamInfo {
7005        key: "postsmooth",
7006        label: "Post-Smoothing",
7007        kind: IndicatorParamKind::Int,
7008        required: false,
7009        default: Some(ParamValueStatic::Int(10)),
7010        min: Some(1.0),
7011        max: None,
7012        step: Some(1.0),
7013        enum_values: EMPTY_ENUM_VALUES,
7014        notes: None,
7015    },
7016    IndicatorParamInfo {
7017        key: "postmethod",
7018        label: "Post-Smoothing Method",
7019        kind: IndicatorParamKind::EnumString,
7020        required: false,
7021        default: Some(ParamValueStatic::EnumString("sma")),
7022        min: None,
7023        max: None,
7024        step: None,
7025        enum_values: ENUM_VALUES_MULTI_LENGTH_STOCHASTIC_AVERAGE_METHOD,
7026        notes: None,
7027    },
7028    IndicatorParamInfo {
7029        key: "source",
7030        label: "Source",
7031        kind: IndicatorParamKind::EnumString,
7032        required: false,
7033        default: Some(ParamValueStatic::EnumString("close")),
7034        min: None,
7035        max: None,
7036        step: None,
7037        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
7038        notes: None,
7039    },
7040];
7041
7042const PARAM_HULL_BUTTERFLY_OSCILLATOR: &[IndicatorParamInfo] = &[
7043    IndicatorParamInfo {
7044        key: "length",
7045        label: "Length",
7046        kind: IndicatorParamKind::Int,
7047        required: false,
7048        default: Some(ParamValueStatic::Int(14)),
7049        min: Some(2.0),
7050        max: None,
7051        step: Some(1.0),
7052        enum_values: EMPTY_ENUM_VALUES,
7053        notes: None,
7054    },
7055    IndicatorParamInfo {
7056        key: "mult",
7057        label: "Levels Multiplier",
7058        kind: IndicatorParamKind::Float,
7059        required: false,
7060        default: Some(ParamValueStatic::Float(2.0)),
7061        min: None,
7062        max: None,
7063        step: Some(0.1),
7064        enum_values: EMPTY_ENUM_VALUES,
7065        notes: None,
7066    },
7067    IndicatorParamInfo {
7068        key: "source",
7069        label: "Source",
7070        kind: IndicatorParamKind::EnumString,
7071        required: false,
7072        default: Some(ParamValueStatic::EnumString("close")),
7073        min: None,
7074        max: None,
7075        step: None,
7076        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
7077        notes: None,
7078    },
7079];
7080
7081const PARAM_FIBONACCI_TRAILING_STOP: &[IndicatorParamInfo] = &[
7082    IndicatorParamInfo {
7083        key: "left_bars",
7084        label: "Left Bars",
7085        kind: IndicatorParamKind::Int,
7086        required: false,
7087        default: Some(ParamValueStatic::Int(20)),
7088        min: Some(1.0),
7089        max: None,
7090        step: Some(1.0),
7091        enum_values: EMPTY_ENUM_VALUES,
7092        notes: None,
7093    },
7094    IndicatorParamInfo {
7095        key: "right_bars",
7096        label: "Right Bars",
7097        kind: IndicatorParamKind::Int,
7098        required: false,
7099        default: Some(ParamValueStatic::Int(1)),
7100        min: Some(1.0),
7101        max: None,
7102        step: Some(1.0),
7103        enum_values: EMPTY_ENUM_VALUES,
7104        notes: None,
7105    },
7106    IndicatorParamInfo {
7107        key: "level",
7108        label: "Level",
7109        kind: IndicatorParamKind::Float,
7110        required: false,
7111        default: Some(ParamValueStatic::Float(-0.382)),
7112        min: None,
7113        max: None,
7114        step: Some(0.001),
7115        enum_values: EMPTY_ENUM_VALUES,
7116        notes: Some("Finite Fibonacci extension/retracement factor"),
7117    },
7118    IndicatorParamInfo {
7119        key: "trigger",
7120        label: "Trigger",
7121        kind: IndicatorParamKind::EnumString,
7122        required: false,
7123        default: Some(ParamValueStatic::EnumString("close")),
7124        min: None,
7125        max: None,
7126        step: None,
7127        enum_values: ENUM_VALUES_FIBONACCI_TRAILING_STOP_TRIGGER,
7128        notes: None,
7129    },
7130];
7131const PARAM_FIBONACCI_ENTRY_BANDS: &[IndicatorParamInfo] = &[
7132    IndicatorParamInfo {
7133        key: "source",
7134        label: "Source",
7135        kind: IndicatorParamKind::EnumString,
7136        required: false,
7137        default: Some(ParamValueStatic::EnumString("hlc3")),
7138        min: None,
7139        max: None,
7140        step: None,
7141        enum_values: ENUM_VALUES_FIBONACCI_ENTRY_BANDS_SOURCE,
7142        notes: None,
7143    },
7144    IndicatorParamInfo {
7145        key: "length",
7146        label: "Length",
7147        kind: IndicatorParamKind::Int,
7148        required: false,
7149        default: Some(ParamValueStatic::Int(21)),
7150        min: Some(1.0),
7151        max: None,
7152        step: Some(1.0),
7153        enum_values: EMPTY_ENUM_VALUES,
7154        notes: None,
7155    },
7156    IndicatorParamInfo {
7157        key: "atr_length",
7158        label: "ATR Length",
7159        kind: IndicatorParamKind::Int,
7160        required: false,
7161        default: Some(ParamValueStatic::Int(14)),
7162        min: Some(1.0),
7163        max: None,
7164        step: Some(1.0),
7165        enum_values: EMPTY_ENUM_VALUES,
7166        notes: None,
7167    },
7168    IndicatorParamInfo {
7169        key: "use_atr",
7170        label: "Use ATR",
7171        kind: IndicatorParamKind::Bool,
7172        required: false,
7173        default: Some(ParamValueStatic::Bool(true)),
7174        min: None,
7175        max: None,
7176        step: None,
7177        enum_values: ENUM_VALUES_TRUE_FALSE,
7178        notes: None,
7179    },
7180    IndicatorParamInfo {
7181        key: "tp_aggressiveness",
7182        label: "TP Aggressiveness",
7183        kind: IndicatorParamKind::EnumString,
7184        required: false,
7185        default: Some(ParamValueStatic::EnumString("low")),
7186        min: None,
7187        max: None,
7188        step: None,
7189        enum_values: ENUM_VALUES_FIBONACCI_ENTRY_BANDS_TP_AGGRESSIVENESS,
7190        notes: None,
7191    },
7192];
7193
7194const PARAM_VOLUME_ENERGY_RESERVOIRS: &[IndicatorParamInfo] = &[
7195    IndicatorParamInfo {
7196        key: "length",
7197        label: "Energy Horizon",
7198        kind: IndicatorParamKind::Int,
7199        required: false,
7200        default: Some(ParamValueStatic::Int(20)),
7201        min: Some(5.0),
7202        max: None,
7203        step: Some(1.0),
7204        enum_values: EMPTY_ENUM_VALUES,
7205        notes: Some("Lookback for price stability and midpoint range."),
7206    },
7207    IndicatorParamInfo {
7208        key: "sensitivity",
7209        label: "Energy Sensitivity",
7210        kind: IndicatorParamKind::Float,
7211        required: false,
7212        default: Some(ParamValueStatic::Float(1.5)),
7213        min: Some(0.5),
7214        max: None,
7215        step: Some(0.1),
7216        enum_values: EMPTY_ENUM_VALUES,
7217        notes: Some("Controls how quickly reservoir energy is released on volume spikes."),
7218    },
7219];
7220
7221const PARAM_NEIGHBORING_TRAILING_STOP: &[IndicatorParamInfo] = &[
7222    IndicatorParamInfo {
7223        key: "buffer_size",
7224        label: "Historical Buffer",
7225        kind: IndicatorParamKind::Int,
7226        required: false,
7227        default: Some(ParamValueStatic::Int(200)),
7228        min: Some(100.0),
7229        max: Some(20000.0),
7230        step: Some(1.0),
7231        enum_values: EMPTY_ENUM_VALUES,
7232        notes: Some("Number of historical closes retained in the sorted neighborhood buffer."),
7233    },
7234    IndicatorParamInfo {
7235        key: "k",
7236        label: "Neighboring Range",
7237        kind: IndicatorParamKind::Int,
7238        required: false,
7239        default: Some(ParamValueStatic::Int(50)),
7240        min: Some(5.0),
7241        max: None,
7242        step: Some(1.0),
7243        enum_values: EMPTY_ENUM_VALUES,
7244        notes: Some("Number of neighboring closes examined on each side of the insertion point."),
7245    },
7246    IndicatorParamInfo {
7247        key: "percentile",
7248        label: "Percentile",
7249        kind: IndicatorParamKind::Float,
7250        required: false,
7251        default: Some(ParamValueStatic::Float(90.0)),
7252        min: Some(1.0),
7253        max: Some(99.0),
7254        step: Some(1.0),
7255        enum_values: EMPTY_ENUM_VALUES,
7256        notes: Some("Percentile rank used for the lower and upper neighborhood bands."),
7257    },
7258    IndicatorParamInfo {
7259        key: "smooth",
7260        label: "Smoothing",
7261        kind: IndicatorParamKind::Int,
7262        required: false,
7263        default: Some(ParamValueStatic::Int(5)),
7264        min: Some(1.0),
7265        max: None,
7266        step: Some(1.0),
7267        enum_values: EMPTY_ENUM_VALUES,
7268        notes: Some("SMA smoothing applied to the neighborhood bands before stop updates."),
7269    },
7270];
7271
7272const PARAM_GROVER_LLORENS_CYCLE_OSCILLATOR: &[IndicatorParamInfo] = &[
7273    IndicatorParamInfo {
7274        key: "length",
7275        label: "Length",
7276        kind: IndicatorParamKind::Int,
7277        required: false,
7278        default: Some(ParamValueStatic::Int(100)),
7279        min: Some(1.0),
7280        max: None,
7281        step: Some(1.0),
7282        enum_values: EMPTY_ENUM_VALUES,
7283        notes: None,
7284    },
7285    IndicatorParamInfo {
7286        key: "mult",
7287        label: "Multiplier",
7288        kind: IndicatorParamKind::Float,
7289        required: false,
7290        default: Some(ParamValueStatic::Float(10.0)),
7291        min: None,
7292        max: None,
7293        step: None,
7294        enum_values: EMPTY_ENUM_VALUES,
7295        notes: None,
7296    },
7297    IndicatorParamInfo {
7298        key: "source",
7299        label: "Source",
7300        kind: IndicatorParamKind::EnumString,
7301        required: false,
7302        default: Some(ParamValueStatic::EnumString("close")),
7303        min: None,
7304        max: None,
7305        step: None,
7306        enum_values: ENUM_VALUES_GROVER_LLORENS_CYCLE_OSCILLATOR_SOURCE,
7307        notes: None,
7308    },
7309    IndicatorParamInfo {
7310        key: "smooth",
7311        label: "Smooth",
7312        kind: IndicatorParamKind::Bool,
7313        required: false,
7314        default: Some(ParamValueStatic::Bool(true)),
7315        min: None,
7316        max: None,
7317        step: None,
7318        enum_values: ENUM_VALUES_TRUE_FALSE,
7319        notes: None,
7320    },
7321    IndicatorParamInfo {
7322        key: "rsi_period",
7323        label: "RSI Period",
7324        kind: IndicatorParamKind::Int,
7325        required: false,
7326        default: Some(ParamValueStatic::Int(20)),
7327        min: Some(1.0),
7328        max: None,
7329        step: Some(1.0),
7330        enum_values: EMPTY_ENUM_VALUES,
7331        notes: None,
7332    },
7333];
7334
7335const PARAM_EHLERS_LINEAR_EXTRAPOLATION_PREDICTOR: &[IndicatorParamInfo] = &[
7336    IndicatorParamInfo {
7337        key: "high_pass_length",
7338        label: "High-Pass Length",
7339        kind: IndicatorParamKind::Int,
7340        required: false,
7341        default: Some(ParamValueStatic::Int(125)),
7342        min: Some(1.0),
7343        max: None,
7344        step: Some(1.0),
7345        enum_values: EMPTY_ENUM_VALUES,
7346        notes: None,
7347    },
7348    IndicatorParamInfo {
7349        key: "low_pass_length",
7350        label: "Low-Pass Length",
7351        kind: IndicatorParamKind::Int,
7352        required: false,
7353        default: Some(ParamValueStatic::Int(12)),
7354        min: Some(1.0),
7355        max: None,
7356        step: Some(1.0),
7357        enum_values: EMPTY_ENUM_VALUES,
7358        notes: None,
7359    },
7360    IndicatorParamInfo {
7361        key: "gain",
7362        label: "Gain",
7363        kind: IndicatorParamKind::Float,
7364        required: false,
7365        default: Some(ParamValueStatic::Float(0.7)),
7366        min: None,
7367        max: None,
7368        step: None,
7369        enum_values: EMPTY_ENUM_VALUES,
7370        notes: None,
7371    },
7372    IndicatorParamInfo {
7373        key: "bars_forward",
7374        label: "Bars Forward",
7375        kind: IndicatorParamKind::Int,
7376        required: false,
7377        default: Some(ParamValueStatic::Int(5)),
7378        min: Some(0.0),
7379        max: Some(10.0),
7380        step: Some(1.0),
7381        enum_values: EMPTY_ENUM_VALUES,
7382        notes: Some("Faithful core supports 0..10 forward bars."),
7383    },
7384    IndicatorParamInfo {
7385        key: "signal_mode",
7386        label: "Signal Mode",
7387        kind: IndicatorParamKind::EnumString,
7388        required: false,
7389        default: Some(ParamValueStatic::EnumString("predict_filter_crosses")),
7390        min: None,
7391        max: None,
7392        step: None,
7393        enum_values: ENUM_VALUES_EHLERS_LINEAR_EXTRAPOLATION_SIGNAL_MODE,
7394        notes: None,
7395    },
7396];
7397
7398const PARAM_BULL_POWER_VS_BEAR_POWER: &[IndicatorParamInfo] = &[IndicatorParamInfo {
7399    key: "period",
7400    label: "Period",
7401    kind: IndicatorParamKind::Int,
7402    required: false,
7403    default: Some(ParamValueStatic::Int(5)),
7404    min: Some(1.0),
7405    max: None,
7406    step: Some(1.0),
7407    enum_values: EMPTY_ENUM_VALUES,
7408    notes: None,
7409}];
7410
7411const PARAM_VERTICAL_HORIZONTAL_FILTER: &[IndicatorParamInfo] = &[IndicatorParamInfo {
7412    key: "length",
7413    label: "Length",
7414    kind: IndicatorParamKind::Int,
7415    required: false,
7416    default: Some(ParamValueStatic::Int(28)),
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_SQUEEZE_INDEX: &[IndicatorParamInfo] = &[
7425    IndicatorParamInfo {
7426        key: "conv",
7427        label: "Convergence Factor",
7428        kind: IndicatorParamKind::Float,
7429        required: false,
7430        default: Some(ParamValueStatic::Float(50.0)),
7431        min: Some(1.0),
7432        max: None,
7433        step: Some(1.0),
7434        enum_values: EMPTY_ENUM_VALUES,
7435        notes: None,
7436    },
7437    IndicatorParamInfo {
7438        key: "length",
7439        label: "Length",
7440        kind: IndicatorParamKind::Int,
7441        required: false,
7442        default: Some(ParamValueStatic::Int(20)),
7443        min: Some(1.0),
7444        max: None,
7445        step: Some(1.0),
7446        enum_values: EMPTY_ENUM_VALUES,
7447        notes: None,
7448    },
7449];
7450
7451const PARAM_STOCHASTIC_DISTANCE: &[IndicatorParamInfo] = &[
7452    IndicatorParamInfo {
7453        key: "lookback_length",
7454        label: "Lookback Length",
7455        kind: IndicatorParamKind::Int,
7456        required: false,
7457        default: Some(ParamValueStatic::Int(200)),
7458        min: Some(1.0),
7459        max: None,
7460        step: Some(1.0),
7461        enum_values: EMPTY_ENUM_VALUES,
7462        notes: None,
7463    },
7464    IndicatorParamInfo {
7465        key: "length1",
7466        label: "Length 1",
7467        kind: IndicatorParamKind::Int,
7468        required: false,
7469        default: Some(ParamValueStatic::Int(12)),
7470        min: Some(1.0),
7471        max: None,
7472        step: Some(1.0),
7473        enum_values: EMPTY_ENUM_VALUES,
7474        notes: None,
7475    },
7476    IndicatorParamInfo {
7477        key: "length2",
7478        label: "Length 2",
7479        kind: IndicatorParamKind::Int,
7480        required: false,
7481        default: Some(ParamValueStatic::Int(3)),
7482        min: Some(1.0),
7483        max: None,
7484        step: Some(1.0),
7485        enum_values: EMPTY_ENUM_VALUES,
7486        notes: None,
7487    },
7488    IndicatorParamInfo {
7489        key: "ob_level",
7490        label: "Overbought Level",
7491        kind: IndicatorParamKind::Int,
7492        required: false,
7493        default: Some(ParamValueStatic::Int(40)),
7494        min: Some(0.0),
7495        max: Some(100.0),
7496        step: Some(1.0),
7497        enum_values: EMPTY_ENUM_VALUES,
7498        notes: None,
7499    },
7500    IndicatorParamInfo {
7501        key: "os_level",
7502        label: "Oversold Level",
7503        kind: IndicatorParamKind::Int,
7504        required: false,
7505        default: Some(ParamValueStatic::Int(-40)),
7506        min: Some(-100.0),
7507        max: Some(0.0),
7508        step: Some(1.0),
7509        enum_values: EMPTY_ENUM_VALUES,
7510        notes: None,
7511    },
7512];
7513
7514const PARAM_ADAPTIVE_BANDPASS_TRIGGER_OSCILLATOR: &[IndicatorParamInfo] = &[
7515    IndicatorParamInfo {
7516        key: "delta",
7517        label: "Delta",
7518        kind: IndicatorParamKind::Float,
7519        required: false,
7520        default: Some(ParamValueStatic::Float(0.1)),
7521        min: Some(0.0000001),
7522        max: Some(0.9999999),
7523        step: Some(0.01),
7524        enum_values: EMPTY_ENUM_VALUES,
7525        notes: None,
7526    },
7527    IndicatorParamInfo {
7528        key: "alpha",
7529        label: "Alpha",
7530        kind: IndicatorParamKind::Float,
7531        required: false,
7532        default: Some(ParamValueStatic::Float(0.07)),
7533        min: Some(0.0000001),
7534        max: Some(0.9999999),
7535        step: Some(0.01),
7536        enum_values: EMPTY_ENUM_VALUES,
7537        notes: None,
7538    },
7539];
7540
7541const PARAM_DIDI_INDEX: &[IndicatorParamInfo] = &[
7542    IndicatorParamInfo {
7543        key: "short_length",
7544        label: "Short Length",
7545        kind: IndicatorParamKind::Int,
7546        required: false,
7547        default: Some(ParamValueStatic::Int(3)),
7548        min: Some(1.0),
7549        max: None,
7550        step: Some(1.0),
7551        enum_values: EMPTY_ENUM_VALUES,
7552        notes: None,
7553    },
7554    IndicatorParamInfo {
7555        key: "medium_length",
7556        label: "Medium Length",
7557        kind: IndicatorParamKind::Int,
7558        required: false,
7559        default: Some(ParamValueStatic::Int(8)),
7560        min: Some(1.0),
7561        max: None,
7562        step: Some(1.0),
7563        enum_values: EMPTY_ENUM_VALUES,
7564        notes: None,
7565    },
7566    IndicatorParamInfo {
7567        key: "long_length",
7568        label: "Long Length",
7569        kind: IndicatorParamKind::Int,
7570        required: false,
7571        default: Some(ParamValueStatic::Int(20)),
7572        min: Some(1.0),
7573        max: None,
7574        step: Some(1.0),
7575        enum_values: EMPTY_ENUM_VALUES,
7576        notes: None,
7577    },
7578];
7579
7580const PARAM_EHLERS_AUTOCORRELATION_PERIODOGRAM: &[IndicatorParamInfo] = &[
7581    IndicatorParamInfo {
7582        key: "min_period",
7583        label: "Min Period",
7584        kind: IndicatorParamKind::Int,
7585        required: false,
7586        default: Some(ParamValueStatic::Int(8)),
7587        min: Some(3.0),
7588        max: None,
7589        step: Some(1.0),
7590        enum_values: EMPTY_ENUM_VALUES,
7591        notes: None,
7592    },
7593    IndicatorParamInfo {
7594        key: "max_period",
7595        label: "Max Period",
7596        kind: IndicatorParamKind::Int,
7597        required: false,
7598        default: Some(ParamValueStatic::Int(48)),
7599        min: Some(4.0),
7600        max: None,
7601        step: Some(1.0),
7602        enum_values: EMPTY_ENUM_VALUES,
7603        notes: None,
7604    },
7605    IndicatorParamInfo {
7606        key: "avg_length",
7607        label: "Autocorrelation Length",
7608        kind: IndicatorParamKind::Int,
7609        required: false,
7610        default: Some(ParamValueStatic::Int(3)),
7611        min: Some(0.0),
7612        max: None,
7613        step: Some(1.0),
7614        enum_values: EMPTY_ENUM_VALUES,
7615        notes: None,
7616    },
7617    IndicatorParamInfo {
7618        key: "enhance",
7619        label: "Enhance Resolution",
7620        kind: IndicatorParamKind::Bool,
7621        required: false,
7622        default: Some(ParamValueStatic::Bool(true)),
7623        min: None,
7624        max: None,
7625        step: None,
7626        enum_values: ENUM_VALUES_TRUE_FALSE,
7627        notes: None,
7628    },
7629];
7630
7631const PARAM_KASE_PEAK_OSCILLATOR_WITH_DIVERGENCES: &[IndicatorParamInfo] = &[
7632    IndicatorParamInfo {
7633        key: "deviations",
7634        label: "Deviations",
7635        kind: IndicatorParamKind::Float,
7636        required: false,
7637        default: Some(ParamValueStatic::Float(2.0)),
7638        min: Some(0.0),
7639        max: None,
7640        step: None,
7641        enum_values: EMPTY_ENUM_VALUES,
7642        notes: None,
7643    },
7644    IndicatorParamInfo {
7645        key: "short_cycle",
7646        label: "Short Cycle",
7647        kind: IndicatorParamKind::Int,
7648        required: false,
7649        default: Some(ParamValueStatic::Int(8)),
7650        min: Some(1.0),
7651        max: None,
7652        step: Some(1.0),
7653        enum_values: EMPTY_ENUM_VALUES,
7654        notes: None,
7655    },
7656    IndicatorParamInfo {
7657        key: "long_cycle",
7658        label: "Long Cycle",
7659        kind: IndicatorParamKind::Int,
7660        required: false,
7661        default: Some(ParamValueStatic::Int(65)),
7662        min: Some(2.0),
7663        max: None,
7664        step: Some(1.0),
7665        enum_values: EMPTY_ENUM_VALUES,
7666        notes: None,
7667    },
7668    IndicatorParamInfo {
7669        key: "sensitivity",
7670        label: "Sensitivity",
7671        kind: IndicatorParamKind::Float,
7672        required: false,
7673        default: Some(ParamValueStatic::Float(40.0)),
7674        min: None,
7675        max: None,
7676        step: None,
7677        enum_values: EMPTY_ENUM_VALUES,
7678        notes: None,
7679    },
7680    IndicatorParamInfo {
7681        key: "all_peaks_mode",
7682        label: "All Peaks Mode",
7683        kind: IndicatorParamKind::Bool,
7684        required: false,
7685        default: Some(ParamValueStatic::Bool(true)),
7686        min: None,
7687        max: None,
7688        step: None,
7689        enum_values: ENUM_VALUES_TRUE_FALSE,
7690        notes: None,
7691    },
7692    IndicatorParamInfo {
7693        key: "lb_r",
7694        label: "Pivot Right",
7695        kind: IndicatorParamKind::Int,
7696        required: false,
7697        default: Some(ParamValueStatic::Int(5)),
7698        min: Some(1.0),
7699        max: None,
7700        step: Some(1.0),
7701        enum_values: EMPTY_ENUM_VALUES,
7702        notes: None,
7703    },
7704    IndicatorParamInfo {
7705        key: "lb_l",
7706        label: "Pivot Left",
7707        kind: IndicatorParamKind::Int,
7708        required: false,
7709        default: Some(ParamValueStatic::Int(5)),
7710        min: Some(1.0),
7711        max: None,
7712        step: Some(1.0),
7713        enum_values: EMPTY_ENUM_VALUES,
7714        notes: None,
7715    },
7716    IndicatorParamInfo {
7717        key: "range_upper",
7718        label: "Range Upper",
7719        kind: IndicatorParamKind::Int,
7720        required: false,
7721        default: Some(ParamValueStatic::Int(60)),
7722        min: Some(1.0),
7723        max: None,
7724        step: Some(1.0),
7725        enum_values: EMPTY_ENUM_VALUES,
7726        notes: None,
7727    },
7728    IndicatorParamInfo {
7729        key: "range_lower",
7730        label: "Range Lower",
7731        kind: IndicatorParamKind::Int,
7732        required: false,
7733        default: Some(ParamValueStatic::Int(5)),
7734        min: Some(1.0),
7735        max: None,
7736        step: Some(1.0),
7737        enum_values: EMPTY_ENUM_VALUES,
7738        notes: None,
7739    },
7740    IndicatorParamInfo {
7741        key: "plot_bull",
7742        label: "Plot Bull",
7743        kind: IndicatorParamKind::Bool,
7744        required: false,
7745        default: Some(ParamValueStatic::Bool(true)),
7746        min: None,
7747        max: None,
7748        step: None,
7749        enum_values: ENUM_VALUES_TRUE_FALSE,
7750        notes: None,
7751    },
7752    IndicatorParamInfo {
7753        key: "plot_hidden_bull",
7754        label: "Plot Hidden Bull",
7755        kind: IndicatorParamKind::Bool,
7756        required: false,
7757        default: Some(ParamValueStatic::Bool(false)),
7758        min: None,
7759        max: None,
7760        step: None,
7761        enum_values: ENUM_VALUES_TRUE_FALSE,
7762        notes: None,
7763    },
7764    IndicatorParamInfo {
7765        key: "plot_bear",
7766        label: "Plot Bear",
7767        kind: IndicatorParamKind::Bool,
7768        required: false,
7769        default: Some(ParamValueStatic::Bool(true)),
7770        min: None,
7771        max: None,
7772        step: None,
7773        enum_values: ENUM_VALUES_TRUE_FALSE,
7774        notes: None,
7775    },
7776    IndicatorParamInfo {
7777        key: "plot_hidden_bear",
7778        label: "Plot Hidden Bear",
7779        kind: IndicatorParamKind::Bool,
7780        required: false,
7781        default: Some(ParamValueStatic::Bool(false)),
7782        min: None,
7783        max: None,
7784        step: None,
7785        enum_values: ENUM_VALUES_TRUE_FALSE,
7786        notes: None,
7787    },
7788];
7789
7790const PARAM_INTRADAY_MOMENTUM_INDEX: &[IndicatorParamInfo] = &[
7791    IndicatorParamInfo {
7792        key: "length",
7793        label: "IMI Length",
7794        kind: IndicatorParamKind::Int,
7795        required: false,
7796        default: Some(ParamValueStatic::Int(14)),
7797        min: Some(1.0),
7798        max: None,
7799        step: Some(1.0),
7800        enum_values: EMPTY_ENUM_VALUES,
7801        notes: None,
7802    },
7803    IndicatorParamInfo {
7804        key: "length_ma",
7805        label: "Signal Length",
7806        kind: IndicatorParamKind::Int,
7807        required: false,
7808        default: Some(ParamValueStatic::Int(6)),
7809        min: Some(1.0),
7810        max: None,
7811        step: Some(1.0),
7812        enum_values: EMPTY_ENUM_VALUES,
7813        notes: None,
7814    },
7815    IndicatorParamInfo {
7816        key: "mult",
7817        label: "Band StdDev Mult",
7818        kind: IndicatorParamKind::Float,
7819        required: false,
7820        default: Some(ParamValueStatic::Float(2.0)),
7821        min: Some(0.0),
7822        max: None,
7823        step: None,
7824        enum_values: EMPTY_ENUM_VALUES,
7825        notes: None,
7826    },
7827    IndicatorParamInfo {
7828        key: "length_bb",
7829        label: "Band Length",
7830        kind: IndicatorParamKind::Int,
7831        required: false,
7832        default: Some(ParamValueStatic::Int(20)),
7833        min: Some(1.0),
7834        max: None,
7835        step: Some(1.0),
7836        enum_values: EMPTY_ENUM_VALUES,
7837        notes: None,
7838    },
7839    IndicatorParamInfo {
7840        key: "apply_smoothing",
7841        label: "Apply Smoothing",
7842        kind: IndicatorParamKind::Bool,
7843        required: false,
7844        default: Some(ParamValueStatic::Bool(false)),
7845        min: None,
7846        max: None,
7847        step: None,
7848        enum_values: ENUM_VALUES_TRUE_FALSE,
7849        notes: None,
7850    },
7851    IndicatorParamInfo {
7852        key: "low_band",
7853        label: "Smoothing Lower Band",
7854        kind: IndicatorParamKind::Int,
7855        required: false,
7856        default: Some(ParamValueStatic::Int(10)),
7857        min: Some(1.0),
7858        max: None,
7859        step: Some(1.0),
7860        enum_values: EMPTY_ENUM_VALUES,
7861        notes: None,
7862    },
7863];
7864
7865const PARAM_DEMAND_INDEX: &[IndicatorParamInfo] = &[
7866    IndicatorParamInfo {
7867        key: "len_bs",
7868        label: "Buy/Sell Power Length",
7869        kind: IndicatorParamKind::Int,
7870        required: false,
7871        default: Some(ParamValueStatic::Int(19)),
7872        min: Some(1.0),
7873        max: None,
7874        step: Some(1.0),
7875        enum_values: EMPTY_ENUM_VALUES,
7876        notes: None,
7877    },
7878    IndicatorParamInfo {
7879        key: "len_bs_ma",
7880        label: "Buy/Sell Power MA Length",
7881        kind: IndicatorParamKind::Int,
7882        required: false,
7883        default: Some(ParamValueStatic::Int(19)),
7884        min: Some(1.0),
7885        max: None,
7886        step: Some(1.0),
7887        enum_values: EMPTY_ENUM_VALUES,
7888        notes: None,
7889    },
7890    IndicatorParamInfo {
7891        key: "len_di_ma",
7892        label: "Demand Index SMA Length",
7893        kind: IndicatorParamKind::Int,
7894        required: false,
7895        default: Some(ParamValueStatic::Int(19)),
7896        min: Some(1.0),
7897        max: None,
7898        step: Some(1.0),
7899        enum_values: EMPTY_ENUM_VALUES,
7900        notes: None,
7901    },
7902    IndicatorParamInfo {
7903        key: "ma_type",
7904        label: "MA Type",
7905        kind: IndicatorParamKind::EnumString,
7906        required: false,
7907        default: Some(ParamValueStatic::EnumString("ema")),
7908        min: None,
7909        max: None,
7910        step: None,
7911        enum_values: ENUM_VALUES_DEMAND_INDEX_MA_TYPE,
7912        notes: None,
7913    },
7914];
7915
7916const PARAM_VWAP_ZSCORE_WITH_SIGNALS: &[IndicatorParamInfo] = &[
7917    IndicatorParamInfo {
7918        key: "length",
7919        label: "Length",
7920        kind: IndicatorParamKind::Int,
7921        required: false,
7922        default: Some(ParamValueStatic::Int(20)),
7923        min: Some(1.0),
7924        max: None,
7925        step: Some(1.0),
7926        enum_values: EMPTY_ENUM_VALUES,
7927        notes: None,
7928    },
7929    IndicatorParamInfo {
7930        key: "upper_bottom",
7931        label: "Upper Threshold",
7932        kind: IndicatorParamKind::Float,
7933        required: false,
7934        default: Some(ParamValueStatic::Float(2.5)),
7935        min: None,
7936        max: None,
7937        step: None,
7938        enum_values: EMPTY_ENUM_VALUES,
7939        notes: None,
7940    },
7941    IndicatorParamInfo {
7942        key: "lower_bottom",
7943        label: "Lower Threshold",
7944        kind: IndicatorParamKind::Float,
7945        required: false,
7946        default: Some(ParamValueStatic::Float(-2.5)),
7947        min: None,
7948        max: None,
7949        step: None,
7950        enum_values: EMPTY_ENUM_VALUES,
7951        notes: None,
7952    },
7953];
7954
7955const PARAM_VI: &[IndicatorParamInfo] = &[IndicatorParamInfo {
7956    key: "period",
7957    label: "Period",
7958    kind: IndicatorParamKind::Int,
7959    required: false,
7960    default: Some(ParamValueStatic::Int(14)),
7961    min: Some(1.0),
7962    max: None,
7963    step: Some(1.0),
7964    enum_values: EMPTY_ENUM_VALUES,
7965    notes: None,
7966}];
7967
7968const PARAM_KDJ: &[IndicatorParamInfo] = &[
7969    IndicatorParamInfo {
7970        key: "fast_k_period",
7971        label: "Fast K Period",
7972        kind: IndicatorParamKind::Int,
7973        required: false,
7974        default: Some(ParamValueStatic::Int(9)),
7975        min: Some(1.0),
7976        max: None,
7977        step: Some(1.0),
7978        enum_values: EMPTY_ENUM_VALUES,
7979        notes: None,
7980    },
7981    IndicatorParamInfo {
7982        key: "slow_k_period",
7983        label: "Slow K Period",
7984        kind: IndicatorParamKind::Int,
7985        required: false,
7986        default: Some(ParamValueStatic::Int(3)),
7987        min: Some(1.0),
7988        max: None,
7989        step: Some(1.0),
7990        enum_values: EMPTY_ENUM_VALUES,
7991        notes: None,
7992    },
7993    IndicatorParamInfo {
7994        key: "slow_k_ma_type",
7995        label: "Slow K MA Type",
7996        kind: IndicatorParamKind::EnumString,
7997        required: false,
7998        default: Some(ParamValueStatic::EnumString("sma")),
7999        min: None,
8000        max: None,
8001        step: None,
8002        enum_values: EMPTY_ENUM_VALUES,
8003        notes: None,
8004    },
8005    IndicatorParamInfo {
8006        key: "slow_d_period",
8007        label: "Slow D Period",
8008        kind: IndicatorParamKind::Int,
8009        required: false,
8010        default: Some(ParamValueStatic::Int(3)),
8011        min: Some(1.0),
8012        max: None,
8013        step: Some(1.0),
8014        enum_values: EMPTY_ENUM_VALUES,
8015        notes: None,
8016    },
8017    IndicatorParamInfo {
8018        key: "slow_d_ma_type",
8019        label: "Slow D MA Type",
8020        kind: IndicatorParamKind::EnumString,
8021        required: false,
8022        default: Some(ParamValueStatic::EnumString("sma")),
8023        min: None,
8024        max: None,
8025        step: None,
8026        enum_values: EMPTY_ENUM_VALUES,
8027        notes: None,
8028    },
8029];
8030
8031const PARAM_ACOSC: &[IndicatorParamInfo] = PARAM_NONE;
8032
8033const PARAM_ALLIGATOR: &[IndicatorParamInfo] = &[
8034    IndicatorParamInfo {
8035        key: "jaw_period",
8036        label: "Jaw Period",
8037        kind: IndicatorParamKind::Int,
8038        required: false,
8039        default: Some(ParamValueStatic::Int(13)),
8040        min: Some(1.0),
8041        max: None,
8042        step: Some(1.0),
8043        enum_values: EMPTY_ENUM_VALUES,
8044        notes: None,
8045    },
8046    IndicatorParamInfo {
8047        key: "jaw_offset",
8048        label: "Jaw Offset",
8049        kind: IndicatorParamKind::Int,
8050        required: false,
8051        default: Some(ParamValueStatic::Int(8)),
8052        min: Some(0.0),
8053        max: None,
8054        step: Some(1.0),
8055        enum_values: EMPTY_ENUM_VALUES,
8056        notes: None,
8057    },
8058    IndicatorParamInfo {
8059        key: "teeth_period",
8060        label: "Teeth Period",
8061        kind: IndicatorParamKind::Int,
8062        required: false,
8063        default: Some(ParamValueStatic::Int(8)),
8064        min: Some(1.0),
8065        max: None,
8066        step: Some(1.0),
8067        enum_values: EMPTY_ENUM_VALUES,
8068        notes: None,
8069    },
8070    IndicatorParamInfo {
8071        key: "teeth_offset",
8072        label: "Teeth Offset",
8073        kind: IndicatorParamKind::Int,
8074        required: false,
8075        default: Some(ParamValueStatic::Int(5)),
8076        min: Some(0.0),
8077        max: None,
8078        step: Some(1.0),
8079        enum_values: EMPTY_ENUM_VALUES,
8080        notes: None,
8081    },
8082    IndicatorParamInfo {
8083        key: "lips_period",
8084        label: "Lips Period",
8085        kind: IndicatorParamKind::Int,
8086        required: false,
8087        default: Some(ParamValueStatic::Int(5)),
8088        min: Some(1.0),
8089        max: None,
8090        step: Some(1.0),
8091        enum_values: EMPTY_ENUM_VALUES,
8092        notes: None,
8093    },
8094    IndicatorParamInfo {
8095        key: "lips_offset",
8096        label: "Lips Offset",
8097        kind: IndicatorParamKind::Int,
8098        required: false,
8099        default: Some(ParamValueStatic::Int(3)),
8100        min: Some(0.0),
8101        max: None,
8102        step: Some(1.0),
8103        enum_values: EMPTY_ENUM_VALUES,
8104        notes: None,
8105    },
8106];
8107
8108const PARAM_ALPHATREND: &[IndicatorParamInfo] = &[
8109    IndicatorParamInfo {
8110        key: "coeff",
8111        label: "Coeff",
8112        kind: IndicatorParamKind::Float,
8113        required: false,
8114        default: Some(ParamValueStatic::Float(1.0)),
8115        min: Some(0.0),
8116        max: None,
8117        step: None,
8118        enum_values: EMPTY_ENUM_VALUES,
8119        notes: None,
8120    },
8121    IndicatorParamInfo {
8122        key: "period",
8123        label: "Period",
8124        kind: IndicatorParamKind::Int,
8125        required: false,
8126        default: Some(ParamValueStatic::Int(14)),
8127        min: Some(1.0),
8128        max: None,
8129        step: Some(1.0),
8130        enum_values: EMPTY_ENUM_VALUES,
8131        notes: None,
8132    },
8133    IndicatorParamInfo {
8134        key: "no_volume",
8135        label: "No Volume",
8136        kind: IndicatorParamKind::Bool,
8137        required: false,
8138        default: Some(ParamValueStatic::Bool(false)),
8139        min: None,
8140        max: None,
8141        step: None,
8142        enum_values: ENUM_VALUES_TRUE_FALSE,
8143        notes: None,
8144    },
8145];
8146
8147const PARAM_ASO: &[IndicatorParamInfo] = &[
8148    IndicatorParamInfo {
8149        key: "period",
8150        label: "Period",
8151        kind: IndicatorParamKind::Int,
8152        required: false,
8153        default: Some(ParamValueStatic::Int(10)),
8154        min: Some(1.0),
8155        max: None,
8156        step: Some(1.0),
8157        enum_values: EMPTY_ENUM_VALUES,
8158        notes: None,
8159    },
8160    IndicatorParamInfo {
8161        key: "mode",
8162        label: "Mode",
8163        kind: IndicatorParamKind::Int,
8164        required: false,
8165        default: Some(ParamValueStatic::Int(0)),
8166        min: Some(0.0),
8167        max: None,
8168        step: Some(1.0),
8169        enum_values: EMPTY_ENUM_VALUES,
8170        notes: None,
8171    },
8172];
8173
8174const PARAM_AVSL: &[IndicatorParamInfo] = &[
8175    IndicatorParamInfo {
8176        key: "fast_period",
8177        label: "Fast Period",
8178        kind: IndicatorParamKind::Int,
8179        required: false,
8180        default: Some(ParamValueStatic::Int(12)),
8181        min: Some(1.0),
8182        max: None,
8183        step: Some(1.0),
8184        enum_values: EMPTY_ENUM_VALUES,
8185        notes: None,
8186    },
8187    IndicatorParamInfo {
8188        key: "slow_period",
8189        label: "Slow Period",
8190        kind: IndicatorParamKind::Int,
8191        required: false,
8192        default: Some(ParamValueStatic::Int(26)),
8193        min: Some(1.0),
8194        max: None,
8195        step: Some(1.0),
8196        enum_values: EMPTY_ENUM_VALUES,
8197        notes: None,
8198    },
8199    IndicatorParamInfo {
8200        key: "multiplier",
8201        label: "Multiplier",
8202        kind: IndicatorParamKind::Float,
8203        required: false,
8204        default: Some(ParamValueStatic::Float(2.0)),
8205        min: Some(0.0),
8206        max: None,
8207        step: Some(0.1),
8208        enum_values: EMPTY_ENUM_VALUES,
8209        notes: None,
8210    },
8211];
8212
8213const PARAM_BANDPASS: &[IndicatorParamInfo] = &[
8214    IndicatorParamInfo {
8215        key: "period",
8216        label: "Period",
8217        kind: IndicatorParamKind::Int,
8218        required: false,
8219        default: Some(ParamValueStatic::Int(20)),
8220        min: Some(1.0),
8221        max: None,
8222        step: Some(1.0),
8223        enum_values: EMPTY_ENUM_VALUES,
8224        notes: None,
8225    },
8226    IndicatorParamInfo {
8227        key: "bandwidth",
8228        label: "Bandwidth",
8229        kind: IndicatorParamKind::Float,
8230        required: false,
8231        default: Some(ParamValueStatic::Float(0.3)),
8232        min: Some(0.0),
8233        max: None,
8234        step: None,
8235        enum_values: EMPTY_ENUM_VALUES,
8236        notes: None,
8237    },
8238];
8239
8240const PARAM_CHANDE: &[IndicatorParamInfo] = &[
8241    IndicatorParamInfo {
8242        key: "period",
8243        label: "Period",
8244        kind: IndicatorParamKind::Int,
8245        required: false,
8246        default: Some(ParamValueStatic::Int(22)),
8247        min: Some(1.0),
8248        max: None,
8249        step: Some(1.0),
8250        enum_values: EMPTY_ENUM_VALUES,
8251        notes: None,
8252    },
8253    IndicatorParamInfo {
8254        key: "mult",
8255        label: "Multiplier",
8256        kind: IndicatorParamKind::Float,
8257        required: false,
8258        default: Some(ParamValueStatic::Float(3.0)),
8259        min: Some(0.0),
8260        max: None,
8261        step: Some(0.1),
8262        enum_values: EMPTY_ENUM_VALUES,
8263        notes: None,
8264    },
8265    IndicatorParamInfo {
8266        key: "direction",
8267        label: "Direction",
8268        kind: IndicatorParamKind::EnumString,
8269        required: false,
8270        default: Some(ParamValueStatic::EnumString("long")),
8271        min: None,
8272        max: None,
8273        step: None,
8274        enum_values: &["long", "short"],
8275        notes: None,
8276    },
8277];
8278
8279const PARAM_CHANDELIER_EXIT: &[IndicatorParamInfo] = &[
8280    IndicatorParamInfo {
8281        key: "period",
8282        label: "Period",
8283        kind: IndicatorParamKind::Int,
8284        required: false,
8285        default: Some(ParamValueStatic::Int(22)),
8286        min: Some(1.0),
8287        max: None,
8288        step: Some(1.0),
8289        enum_values: EMPTY_ENUM_VALUES,
8290        notes: None,
8291    },
8292    IndicatorParamInfo {
8293        key: "mult",
8294        label: "Multiplier",
8295        kind: IndicatorParamKind::Float,
8296        required: false,
8297        default: Some(ParamValueStatic::Float(3.0)),
8298        min: Some(0.0),
8299        max: None,
8300        step: None,
8301        enum_values: EMPTY_ENUM_VALUES,
8302        notes: None,
8303    },
8304    IndicatorParamInfo {
8305        key: "use_close",
8306        label: "Use Close",
8307        kind: IndicatorParamKind::Bool,
8308        required: false,
8309        default: Some(ParamValueStatic::Bool(true)),
8310        min: None,
8311        max: None,
8312        step: None,
8313        enum_values: ENUM_VALUES_TRUE_FALSE,
8314        notes: None,
8315    },
8316];
8317
8318const PARAM_CKSP: &[IndicatorParamInfo] = &[
8319    IndicatorParamInfo {
8320        key: "p",
8321        label: "P",
8322        kind: IndicatorParamKind::Int,
8323        required: false,
8324        default: Some(ParamValueStatic::Int(10)),
8325        min: Some(1.0),
8326        max: None,
8327        step: Some(1.0),
8328        enum_values: EMPTY_ENUM_VALUES,
8329        notes: None,
8330    },
8331    IndicatorParamInfo {
8332        key: "x",
8333        label: "X",
8334        kind: IndicatorParamKind::Float,
8335        required: false,
8336        default: Some(ParamValueStatic::Float(1.0)),
8337        min: Some(0.0),
8338        max: None,
8339        step: None,
8340        enum_values: EMPTY_ENUM_VALUES,
8341        notes: None,
8342    },
8343    IndicatorParamInfo {
8344        key: "q",
8345        label: "Q",
8346        kind: IndicatorParamKind::Int,
8347        required: false,
8348        default: Some(ParamValueStatic::Int(9)),
8349        min: Some(1.0),
8350        max: None,
8351        step: Some(1.0),
8352        enum_values: EMPTY_ENUM_VALUES,
8353        notes: None,
8354    },
8355];
8356
8357const PARAM_CORRELATION_CYCLE: &[IndicatorParamInfo] = &[
8358    IndicatorParamInfo {
8359        key: "period",
8360        label: "Period",
8361        kind: IndicatorParamKind::Int,
8362        required: false,
8363        default: Some(ParamValueStatic::Int(20)),
8364        min: Some(1.0),
8365        max: None,
8366        step: Some(1.0),
8367        enum_values: EMPTY_ENUM_VALUES,
8368        notes: None,
8369    },
8370    IndicatorParamInfo {
8371        key: "threshold",
8372        label: "Threshold",
8373        kind: IndicatorParamKind::Float,
8374        required: false,
8375        default: Some(ParamValueStatic::Float(9.0)),
8376        min: None,
8377        max: None,
8378        step: None,
8379        enum_values: EMPTY_ENUM_VALUES,
8380        notes: None,
8381    },
8382];
8383
8384const PARAM_CORREL_HL: &[IndicatorParamInfo] = &[IndicatorParamInfo {
8385    key: "period",
8386    label: "Period",
8387    kind: IndicatorParamKind::Int,
8388    required: false,
8389    default: Some(ParamValueStatic::Int(9)),
8390    min: Some(1.0),
8391    max: None,
8392    step: Some(1.0),
8393    enum_values: EMPTY_ENUM_VALUES,
8394    notes: None,
8395}];
8396
8397const PARAM_DAMIANI_VOLATMETER: &[IndicatorParamInfo] = &[
8398    IndicatorParamInfo {
8399        key: "vis_atr",
8400        label: "Vis ATR",
8401        kind: IndicatorParamKind::Int,
8402        required: false,
8403        default: Some(ParamValueStatic::Int(13)),
8404        min: Some(1.0),
8405        max: None,
8406        step: Some(1.0),
8407        enum_values: EMPTY_ENUM_VALUES,
8408        notes: None,
8409    },
8410    IndicatorParamInfo {
8411        key: "vis_std",
8412        label: "Vis STD",
8413        kind: IndicatorParamKind::Int,
8414        required: false,
8415        default: Some(ParamValueStatic::Int(20)),
8416        min: Some(1.0),
8417        max: None,
8418        step: Some(1.0),
8419        enum_values: EMPTY_ENUM_VALUES,
8420        notes: None,
8421    },
8422    IndicatorParamInfo {
8423        key: "sed_atr",
8424        label: "Sed ATR",
8425        kind: IndicatorParamKind::Int,
8426        required: false,
8427        default: Some(ParamValueStatic::Int(40)),
8428        min: Some(1.0),
8429        max: None,
8430        step: Some(1.0),
8431        enum_values: EMPTY_ENUM_VALUES,
8432        notes: None,
8433    },
8434    IndicatorParamInfo {
8435        key: "sed_std",
8436        label: "Sed STD",
8437        kind: IndicatorParamKind::Int,
8438        required: false,
8439        default: Some(ParamValueStatic::Int(100)),
8440        min: Some(1.0),
8441        max: None,
8442        step: Some(1.0),
8443        enum_values: EMPTY_ENUM_VALUES,
8444        notes: None,
8445    },
8446    IndicatorParamInfo {
8447        key: "threshold",
8448        label: "Threshold",
8449        kind: IndicatorParamKind::Float,
8450        required: false,
8451        default: Some(ParamValueStatic::Float(1.4)),
8452        min: None,
8453        max: None,
8454        step: None,
8455        enum_values: EMPTY_ENUM_VALUES,
8456        notes: None,
8457    },
8458];
8459
8460const PARAM_DVDIQQE: &[IndicatorParamInfo] = &[
8461    IndicatorParamInfo {
8462        key: "period",
8463        label: "Period",
8464        kind: IndicatorParamKind::Int,
8465        required: false,
8466        default: Some(ParamValueStatic::Int(13)),
8467        min: Some(1.0),
8468        max: None,
8469        step: Some(1.0),
8470        enum_values: EMPTY_ENUM_VALUES,
8471        notes: None,
8472    },
8473    IndicatorParamInfo {
8474        key: "smoothing_period",
8475        label: "Smoothing Period",
8476        kind: IndicatorParamKind::Int,
8477        required: false,
8478        default: Some(ParamValueStatic::Int(6)),
8479        min: Some(1.0),
8480        max: None,
8481        step: Some(1.0),
8482        enum_values: EMPTY_ENUM_VALUES,
8483        notes: None,
8484    },
8485    IndicatorParamInfo {
8486        key: "fast_multiplier",
8487        label: "Fast Multiplier",
8488        kind: IndicatorParamKind::Float,
8489        required: false,
8490        default: Some(ParamValueStatic::Float(2.618)),
8491        min: Some(0.0),
8492        max: None,
8493        step: None,
8494        enum_values: EMPTY_ENUM_VALUES,
8495        notes: None,
8496    },
8497    IndicatorParamInfo {
8498        key: "slow_multiplier",
8499        label: "Slow Multiplier",
8500        kind: IndicatorParamKind::Float,
8501        required: false,
8502        default: Some(ParamValueStatic::Float(4.236)),
8503        min: Some(0.0),
8504        max: None,
8505        step: None,
8506        enum_values: EMPTY_ENUM_VALUES,
8507        notes: None,
8508    },
8509    IndicatorParamInfo {
8510        key: "volume_type",
8511        label: "Volume Type",
8512        kind: IndicatorParamKind::EnumString,
8513        required: false,
8514        default: Some(ParamValueStatic::EnumString("default")),
8515        min: None,
8516        max: None,
8517        step: None,
8518        enum_values: EMPTY_ENUM_VALUES,
8519        notes: None,
8520    },
8521    IndicatorParamInfo {
8522        key: "center_type",
8523        label: "Center Type",
8524        kind: IndicatorParamKind::EnumString,
8525        required: false,
8526        default: Some(ParamValueStatic::EnumString("dynamic")),
8527        min: None,
8528        max: None,
8529        step: None,
8530        enum_values: EMPTY_ENUM_VALUES,
8531        notes: None,
8532    },
8533    IndicatorParamInfo {
8534        key: "tick_size",
8535        label: "Tick Size",
8536        kind: IndicatorParamKind::Float,
8537        required: false,
8538        default: Some(ParamValueStatic::Float(0.01)),
8539        min: Some(0.0),
8540        max: None,
8541        step: None,
8542        enum_values: EMPTY_ENUM_VALUES,
8543        notes: None,
8544    },
8545];
8546
8547const PARAM_EMD: &[IndicatorParamInfo] = &[
8548    IndicatorParamInfo {
8549        key: "period",
8550        label: "Period",
8551        kind: IndicatorParamKind::Int,
8552        required: false,
8553        default: Some(ParamValueStatic::Int(20)),
8554        min: Some(1.0),
8555        max: None,
8556        step: Some(1.0),
8557        enum_values: EMPTY_ENUM_VALUES,
8558        notes: None,
8559    },
8560    IndicatorParamInfo {
8561        key: "delta",
8562        label: "Delta",
8563        kind: IndicatorParamKind::Float,
8564        required: false,
8565        default: Some(ParamValueStatic::Float(0.5)),
8566        min: Some(0.0),
8567        max: None,
8568        step: None,
8569        enum_values: EMPTY_ENUM_VALUES,
8570        notes: None,
8571    },
8572    IndicatorParamInfo {
8573        key: "fraction",
8574        label: "Fraction",
8575        kind: IndicatorParamKind::Float,
8576        required: false,
8577        default: Some(ParamValueStatic::Float(0.1)),
8578        min: Some(0.0),
8579        max: None,
8580        step: None,
8581        enum_values: EMPTY_ENUM_VALUES,
8582        notes: None,
8583    },
8584];
8585
8586const PARAM_ERI: &[IndicatorParamInfo] = &[
8587    IndicatorParamInfo {
8588        key: "period",
8589        label: "Period",
8590        kind: IndicatorParamKind::Int,
8591        required: false,
8592        default: Some(ParamValueStatic::Int(13)),
8593        min: Some(1.0),
8594        max: None,
8595        step: Some(1.0),
8596        enum_values: EMPTY_ENUM_VALUES,
8597        notes: None,
8598    },
8599    IndicatorParamInfo {
8600        key: "ma_type",
8601        label: "MA Type",
8602        kind: IndicatorParamKind::EnumString,
8603        required: false,
8604        default: Some(ParamValueStatic::EnumString("ema")),
8605        min: None,
8606        max: None,
8607        step: None,
8608        enum_values: EMPTY_ENUM_VALUES,
8609        notes: None,
8610    },
8611];
8612
8613const PARAM_FISHER: &[IndicatorParamInfo] = &[IndicatorParamInfo {
8614    key: "period",
8615    label: "Period",
8616    kind: IndicatorParamKind::Int,
8617    required: false,
8618    default: Some(ParamValueStatic::Int(9)),
8619    min: Some(1.0),
8620    max: None,
8621    step: Some(1.0),
8622    enum_values: EMPTY_ENUM_VALUES,
8623    notes: None,
8624}];
8625
8626const PARAM_FVG_TRAILING_STOP: &[IndicatorParamInfo] = &[
8627    IndicatorParamInfo {
8628        key: "unmitigated_fvg_lookback",
8629        label: "FVG Lookback",
8630        kind: IndicatorParamKind::Int,
8631        required: false,
8632        default: Some(ParamValueStatic::Int(5)),
8633        min: Some(1.0),
8634        max: None,
8635        step: Some(1.0),
8636        enum_values: EMPTY_ENUM_VALUES,
8637        notes: None,
8638    },
8639    IndicatorParamInfo {
8640        key: "smoothing_length",
8641        label: "Smoothing Length",
8642        kind: IndicatorParamKind::Int,
8643        required: false,
8644        default: Some(ParamValueStatic::Int(9)),
8645        min: Some(1.0),
8646        max: None,
8647        step: Some(1.0),
8648        enum_values: EMPTY_ENUM_VALUES,
8649        notes: None,
8650    },
8651    IndicatorParamInfo {
8652        key: "reset_on_cross",
8653        label: "Reset On Cross",
8654        kind: IndicatorParamKind::Bool,
8655        required: false,
8656        default: Some(ParamValueStatic::Bool(false)),
8657        min: None,
8658        max: None,
8659        step: None,
8660        enum_values: ENUM_VALUES_TRUE_FALSE,
8661        notes: None,
8662    },
8663];
8664
8665const PARAM_GATOROSC: &[IndicatorParamInfo] = &[
8666    IndicatorParamInfo {
8667        key: "jaws_length",
8668        label: "Jaws Length",
8669        kind: IndicatorParamKind::Int,
8670        required: false,
8671        default: Some(ParamValueStatic::Int(13)),
8672        min: Some(1.0),
8673        max: None,
8674        step: Some(1.0),
8675        enum_values: EMPTY_ENUM_VALUES,
8676        notes: None,
8677    },
8678    IndicatorParamInfo {
8679        key: "jaws_shift",
8680        label: "Jaws Shift",
8681        kind: IndicatorParamKind::Int,
8682        required: false,
8683        default: Some(ParamValueStatic::Int(8)),
8684        min: Some(0.0),
8685        max: None,
8686        step: Some(1.0),
8687        enum_values: EMPTY_ENUM_VALUES,
8688        notes: None,
8689    },
8690    IndicatorParamInfo {
8691        key: "teeth_length",
8692        label: "Teeth Length",
8693        kind: IndicatorParamKind::Int,
8694        required: false,
8695        default: Some(ParamValueStatic::Int(8)),
8696        min: Some(1.0),
8697        max: None,
8698        step: Some(1.0),
8699        enum_values: EMPTY_ENUM_VALUES,
8700        notes: None,
8701    },
8702    IndicatorParamInfo {
8703        key: "teeth_shift",
8704        label: "Teeth Shift",
8705        kind: IndicatorParamKind::Int,
8706        required: false,
8707        default: Some(ParamValueStatic::Int(5)),
8708        min: Some(0.0),
8709        max: None,
8710        step: Some(1.0),
8711        enum_values: EMPTY_ENUM_VALUES,
8712        notes: None,
8713    },
8714    IndicatorParamInfo {
8715        key: "lips_length",
8716        label: "Lips Length",
8717        kind: IndicatorParamKind::Int,
8718        required: false,
8719        default: Some(ParamValueStatic::Int(5)),
8720        min: Some(1.0),
8721        max: None,
8722        step: Some(1.0),
8723        enum_values: EMPTY_ENUM_VALUES,
8724        notes: None,
8725    },
8726    IndicatorParamInfo {
8727        key: "lips_shift",
8728        label: "Lips Shift",
8729        kind: IndicatorParamKind::Int,
8730        required: false,
8731        default: Some(ParamValueStatic::Int(3)),
8732        min: Some(0.0),
8733        max: None,
8734        step: Some(1.0),
8735        enum_values: EMPTY_ENUM_VALUES,
8736        notes: None,
8737    },
8738];
8739
8740const PARAM_HALFTREND: &[IndicatorParamInfo] = &[
8741    IndicatorParamInfo {
8742        key: "amplitude",
8743        label: "Amplitude",
8744        kind: IndicatorParamKind::Int,
8745        required: false,
8746        default: Some(ParamValueStatic::Int(2)),
8747        min: Some(1.0),
8748        max: None,
8749        step: Some(1.0),
8750        enum_values: EMPTY_ENUM_VALUES,
8751        notes: None,
8752    },
8753    IndicatorParamInfo {
8754        key: "channel_deviation",
8755        label: "Channel Deviation",
8756        kind: IndicatorParamKind::Float,
8757        required: false,
8758        default: Some(ParamValueStatic::Float(2.0)),
8759        min: Some(0.0),
8760        max: None,
8761        step: None,
8762        enum_values: EMPTY_ENUM_VALUES,
8763        notes: None,
8764    },
8765    IndicatorParamInfo {
8766        key: "atr_period",
8767        label: "ATR Period",
8768        kind: IndicatorParamKind::Int,
8769        required: false,
8770        default: Some(ParamValueStatic::Int(100)),
8771        min: Some(1.0),
8772        max: None,
8773        step: Some(1.0),
8774        enum_values: EMPTY_ENUM_VALUES,
8775        notes: None,
8776    },
8777];
8778
8779const PARAM_SAFEZONESTOP: &[IndicatorParamInfo] = &[
8780    IndicatorParamInfo {
8781        key: "period",
8782        label: "Period",
8783        kind: IndicatorParamKind::Int,
8784        required: false,
8785        default: Some(ParamValueStatic::Int(22)),
8786        min: Some(1.0),
8787        max: None,
8788        step: Some(1.0),
8789        enum_values: EMPTY_ENUM_VALUES,
8790        notes: None,
8791    },
8792    IndicatorParamInfo {
8793        key: "mult",
8794        label: "Multiplier",
8795        kind: IndicatorParamKind::Float,
8796        required: false,
8797        default: Some(ParamValueStatic::Float(2.5)),
8798        min: Some(0.0),
8799        max: None,
8800        step: None,
8801        enum_values: EMPTY_ENUM_VALUES,
8802        notes: None,
8803    },
8804    IndicatorParamInfo {
8805        key: "max_lookback",
8806        label: "Max Lookback",
8807        kind: IndicatorParamKind::Int,
8808        required: false,
8809        default: Some(ParamValueStatic::Int(3)),
8810        min: Some(1.0),
8811        max: None,
8812        step: Some(1.0),
8813        enum_values: EMPTY_ENUM_VALUES,
8814        notes: None,
8815    },
8816    IndicatorParamInfo {
8817        key: "direction",
8818        label: "Direction",
8819        kind: IndicatorParamKind::EnumString,
8820        required: false,
8821        default: Some(ParamValueStatic::EnumString("long")),
8822        min: None,
8823        max: None,
8824        step: None,
8825        enum_values: EMPTY_ENUM_VALUES,
8826        notes: None,
8827    },
8828];
8829
8830const PARAM_DEVSTOP: &[IndicatorParamInfo] = &[
8831    IndicatorParamInfo {
8832        key: "period",
8833        label: "Period",
8834        kind: IndicatorParamKind::Int,
8835        required: false,
8836        default: Some(ParamValueStatic::Int(20)),
8837        min: Some(1.0),
8838        max: None,
8839        step: Some(1.0),
8840        enum_values: EMPTY_ENUM_VALUES,
8841        notes: None,
8842    },
8843    IndicatorParamInfo {
8844        key: "mult",
8845        label: "Multiplier",
8846        kind: IndicatorParamKind::Float,
8847        required: false,
8848        default: Some(ParamValueStatic::Float(0.0)),
8849        min: Some(0.0),
8850        max: None,
8851        step: None,
8852        enum_values: EMPTY_ENUM_VALUES,
8853        notes: None,
8854    },
8855    IndicatorParamInfo {
8856        key: "devtype",
8857        label: "Dev Type",
8858        kind: IndicatorParamKind::Int,
8859        required: false,
8860        default: Some(ParamValueStatic::Int(0)),
8861        min: Some(0.0),
8862        max: None,
8863        step: Some(1.0),
8864        enum_values: EMPTY_ENUM_VALUES,
8865        notes: None,
8866    },
8867    IndicatorParamInfo {
8868        key: "direction",
8869        label: "Direction",
8870        kind: IndicatorParamKind::EnumString,
8871        required: false,
8872        default: Some(ParamValueStatic::EnumString("long")),
8873        min: None,
8874        max: None,
8875        step: None,
8876        enum_values: EMPTY_ENUM_VALUES,
8877        notes: None,
8878    },
8879    IndicatorParamInfo {
8880        key: "ma_type",
8881        label: "MA Type",
8882        kind: IndicatorParamKind::EnumString,
8883        required: false,
8884        default: Some(ParamValueStatic::EnumString("sma")),
8885        min: None,
8886        max: None,
8887        step: None,
8888        enum_values: EMPTY_ENUM_VALUES,
8889        notes: None,
8890    },
8891];
8892
8893const PARAM_MOD_GOD_MODE: &[IndicatorParamInfo] = &[
8894    IndicatorParamInfo {
8895        key: "n1",
8896        label: "N1",
8897        kind: IndicatorParamKind::Int,
8898        required: false,
8899        default: Some(ParamValueStatic::Int(17)),
8900        min: Some(1.0),
8901        max: None,
8902        step: Some(1.0),
8903        enum_values: EMPTY_ENUM_VALUES,
8904        notes: None,
8905    },
8906    IndicatorParamInfo {
8907        key: "n2",
8908        label: "N2",
8909        kind: IndicatorParamKind::Int,
8910        required: false,
8911        default: Some(ParamValueStatic::Int(6)),
8912        min: Some(1.0),
8913        max: None,
8914        step: Some(1.0),
8915        enum_values: EMPTY_ENUM_VALUES,
8916        notes: None,
8917    },
8918    IndicatorParamInfo {
8919        key: "n3",
8920        label: "N3",
8921        kind: IndicatorParamKind::Int,
8922        required: false,
8923        default: Some(ParamValueStatic::Int(4)),
8924        min: Some(1.0),
8925        max: None,
8926        step: Some(1.0),
8927        enum_values: EMPTY_ENUM_VALUES,
8928        notes: None,
8929    },
8930    IndicatorParamInfo {
8931        key: "mode",
8932        label: "Mode",
8933        kind: IndicatorParamKind::EnumString,
8934        required: false,
8935        default: Some(ParamValueStatic::EnumString("tradition_mg")),
8936        min: None,
8937        max: None,
8938        step: None,
8939        enum_values: EMPTY_ENUM_VALUES,
8940        notes: None,
8941    },
8942    IndicatorParamInfo {
8943        key: "use_volume",
8944        label: "Use Volume",
8945        kind: IndicatorParamKind::Bool,
8946        required: false,
8947        default: Some(ParamValueStatic::Bool(true)),
8948        min: None,
8949        max: None,
8950        step: None,
8951        enum_values: ENUM_VALUES_TRUE_FALSE,
8952        notes: None,
8953    },
8954];
8955
8956const PARAM_HEMA_TREND_LEVELS: &[IndicatorParamInfo] = &[
8957    IndicatorParamInfo {
8958        key: "fast_length",
8959        label: "Fast Length",
8960        kind: IndicatorParamKind::Int,
8961        required: false,
8962        default: Some(ParamValueStatic::Int(20)),
8963        min: Some(1.0),
8964        max: None,
8965        step: Some(1.0),
8966        enum_values: EMPTY_ENUM_VALUES,
8967        notes: None,
8968    },
8969    IndicatorParamInfo {
8970        key: "slow_length",
8971        label: "Slow Length",
8972        kind: IndicatorParamKind::Int,
8973        required: false,
8974        default: Some(ParamValueStatic::Int(40)),
8975        min: Some(1.0),
8976        max: None,
8977        step: Some(1.0),
8978        enum_values: EMPTY_ENUM_VALUES,
8979        notes: None,
8980    },
8981];
8982
8983const PARAM_KST: &[IndicatorParamInfo] = &[
8984    IndicatorParamInfo {
8985        key: "sma_period1",
8986        label: "SMA 1",
8987        kind: IndicatorParamKind::Int,
8988        required: false,
8989        default: Some(ParamValueStatic::Int(10)),
8990        min: Some(1.0),
8991        max: None,
8992        step: Some(1.0),
8993        enum_values: EMPTY_ENUM_VALUES,
8994        notes: None,
8995    },
8996    IndicatorParamInfo {
8997        key: "sma_period2",
8998        label: "SMA 2",
8999        kind: IndicatorParamKind::Int,
9000        required: false,
9001        default: Some(ParamValueStatic::Int(10)),
9002        min: Some(1.0),
9003        max: None,
9004        step: Some(1.0),
9005        enum_values: EMPTY_ENUM_VALUES,
9006        notes: None,
9007    },
9008    IndicatorParamInfo {
9009        key: "sma_period3",
9010        label: "SMA 3",
9011        kind: IndicatorParamKind::Int,
9012        required: false,
9013        default: Some(ParamValueStatic::Int(10)),
9014        min: Some(1.0),
9015        max: None,
9016        step: Some(1.0),
9017        enum_values: EMPTY_ENUM_VALUES,
9018        notes: None,
9019    },
9020    IndicatorParamInfo {
9021        key: "sma_period4",
9022        label: "SMA 4",
9023        kind: IndicatorParamKind::Int,
9024        required: false,
9025        default: Some(ParamValueStatic::Int(15)),
9026        min: Some(1.0),
9027        max: None,
9028        step: Some(1.0),
9029        enum_values: EMPTY_ENUM_VALUES,
9030        notes: None,
9031    },
9032    IndicatorParamInfo {
9033        key: "roc_period1",
9034        label: "ROC 1",
9035        kind: IndicatorParamKind::Int,
9036        required: false,
9037        default: Some(ParamValueStatic::Int(10)),
9038        min: Some(1.0),
9039        max: None,
9040        step: Some(1.0),
9041        enum_values: EMPTY_ENUM_VALUES,
9042        notes: None,
9043    },
9044    IndicatorParamInfo {
9045        key: "roc_period2",
9046        label: "ROC 2",
9047        kind: IndicatorParamKind::Int,
9048        required: false,
9049        default: Some(ParamValueStatic::Int(15)),
9050        min: Some(1.0),
9051        max: None,
9052        step: Some(1.0),
9053        enum_values: EMPTY_ENUM_VALUES,
9054        notes: None,
9055    },
9056    IndicatorParamInfo {
9057        key: "roc_period3",
9058        label: "ROC 3",
9059        kind: IndicatorParamKind::Int,
9060        required: false,
9061        default: Some(ParamValueStatic::Int(20)),
9062        min: Some(1.0),
9063        max: None,
9064        step: Some(1.0),
9065        enum_values: EMPTY_ENUM_VALUES,
9066        notes: None,
9067    },
9068    IndicatorParamInfo {
9069        key: "roc_period4",
9070        label: "ROC 4",
9071        kind: IndicatorParamKind::Int,
9072        required: false,
9073        default: Some(ParamValueStatic::Int(30)),
9074        min: Some(1.0),
9075        max: None,
9076        step: Some(1.0),
9077        enum_values: EMPTY_ENUM_VALUES,
9078        notes: None,
9079    },
9080    IndicatorParamInfo {
9081        key: "signal_period",
9082        label: "Signal Period",
9083        kind: IndicatorParamKind::Int,
9084        required: false,
9085        default: Some(ParamValueStatic::Int(9)),
9086        min: Some(1.0),
9087        max: None,
9088        step: Some(1.0),
9089        enum_values: EMPTY_ENUM_VALUES,
9090        notes: None,
9091    },
9092];
9093
9094const PARAM_KAUFMANSTOP: &[IndicatorParamInfo] = &[
9095    IndicatorParamInfo {
9096        key: "period",
9097        label: "Period",
9098        kind: IndicatorParamKind::Int,
9099        required: false,
9100        default: Some(ParamValueStatic::Int(22)),
9101        min: Some(1.0),
9102        max: None,
9103        step: Some(1.0),
9104        enum_values: EMPTY_ENUM_VALUES,
9105        notes: None,
9106    },
9107    IndicatorParamInfo {
9108        key: "mult",
9109        label: "Multiplier",
9110        kind: IndicatorParamKind::Float,
9111        required: false,
9112        default: Some(ParamValueStatic::Float(2.0)),
9113        min: Some(0.0),
9114        max: None,
9115        step: None,
9116        enum_values: EMPTY_ENUM_VALUES,
9117        notes: None,
9118    },
9119    IndicatorParamInfo {
9120        key: "direction",
9121        label: "Direction",
9122        kind: IndicatorParamKind::EnumString,
9123        required: false,
9124        default: Some(ParamValueStatic::EnumString("long")),
9125        min: None,
9126        max: None,
9127        step: None,
9128        enum_values: EMPTY_ENUM_VALUES,
9129        notes: None,
9130    },
9131    IndicatorParamInfo {
9132        key: "ma_type",
9133        label: "MA Type",
9134        kind: IndicatorParamKind::EnumString,
9135        required: false,
9136        default: Some(ParamValueStatic::EnumString("sma")),
9137        min: None,
9138        max: None,
9139        step: None,
9140        enum_values: EMPTY_ENUM_VALUES,
9141        notes: None,
9142    },
9143];
9144
9145const PARAM_LPC: &[IndicatorParamInfo] = &[
9146    IndicatorParamInfo {
9147        key: "cutoff_type",
9148        label: "Cutoff Type",
9149        kind: IndicatorParamKind::EnumString,
9150        required: false,
9151        default: Some(ParamValueStatic::EnumString("adaptive")),
9152        min: None,
9153        max: None,
9154        step: None,
9155        enum_values: EMPTY_ENUM_VALUES,
9156        notes: None,
9157    },
9158    IndicatorParamInfo {
9159        key: "fixed_period",
9160        label: "Fixed Period",
9161        kind: IndicatorParamKind::Int,
9162        required: false,
9163        default: Some(ParamValueStatic::Int(20)),
9164        min: Some(1.0),
9165        max: None,
9166        step: Some(1.0),
9167        enum_values: EMPTY_ENUM_VALUES,
9168        notes: None,
9169    },
9170    IndicatorParamInfo {
9171        key: "max_cycle_limit",
9172        label: "Max Cycle Limit",
9173        kind: IndicatorParamKind::Int,
9174        required: false,
9175        default: Some(ParamValueStatic::Int(60)),
9176        min: Some(1.0),
9177        max: None,
9178        step: Some(1.0),
9179        enum_values: EMPTY_ENUM_VALUES,
9180        notes: None,
9181    },
9182    IndicatorParamInfo {
9183        key: "cycle_mult",
9184        label: "Cycle Mult",
9185        kind: IndicatorParamKind::Float,
9186        required: false,
9187        default: Some(ParamValueStatic::Float(1.0)),
9188        min: Some(0.0),
9189        max: None,
9190        step: None,
9191        enum_values: EMPTY_ENUM_VALUES,
9192        notes: None,
9193    },
9194    IndicatorParamInfo {
9195        key: "tr_mult",
9196        label: "TR Mult",
9197        kind: IndicatorParamKind::Float,
9198        required: false,
9199        default: Some(ParamValueStatic::Float(1.0)),
9200        min: Some(0.0),
9201        max: None,
9202        step: None,
9203        enum_values: EMPTY_ENUM_VALUES,
9204        notes: None,
9205    },
9206];
9207
9208const PARAM_MAB: &[IndicatorParamInfo] = &[
9209    IndicatorParamInfo {
9210        key: "fast_period",
9211        label: "Fast Period",
9212        kind: IndicatorParamKind::Int,
9213        required: false,
9214        default: Some(ParamValueStatic::Int(10)),
9215        min: Some(1.0),
9216        max: None,
9217        step: Some(1.0),
9218        enum_values: EMPTY_ENUM_VALUES,
9219        notes: None,
9220    },
9221    IndicatorParamInfo {
9222        key: "slow_period",
9223        label: "Slow Period",
9224        kind: IndicatorParamKind::Int,
9225        required: false,
9226        default: Some(ParamValueStatic::Int(50)),
9227        min: Some(1.0),
9228        max: None,
9229        step: Some(1.0),
9230        enum_values: EMPTY_ENUM_VALUES,
9231        notes: None,
9232    },
9233    IndicatorParamInfo {
9234        key: "devup",
9235        label: "Dev Up",
9236        kind: IndicatorParamKind::Float,
9237        required: false,
9238        default: Some(ParamValueStatic::Float(1.0)),
9239        min: Some(0.0),
9240        max: None,
9241        step: None,
9242        enum_values: EMPTY_ENUM_VALUES,
9243        notes: None,
9244    },
9245    IndicatorParamInfo {
9246        key: "devdn",
9247        label: "Dev Down",
9248        kind: IndicatorParamKind::Float,
9249        required: false,
9250        default: Some(ParamValueStatic::Float(1.0)),
9251        min: Some(0.0),
9252        max: None,
9253        step: None,
9254        enum_values: EMPTY_ENUM_VALUES,
9255        notes: None,
9256    },
9257    IndicatorParamInfo {
9258        key: "fast_ma_type",
9259        label: "Fast MA Type",
9260        kind: IndicatorParamKind::EnumString,
9261        required: false,
9262        default: Some(ParamValueStatic::EnumString("sma")),
9263        min: None,
9264        max: None,
9265        step: None,
9266        enum_values: EMPTY_ENUM_VALUES,
9267        notes: None,
9268    },
9269    IndicatorParamInfo {
9270        key: "slow_ma_type",
9271        label: "Slow MA Type",
9272        kind: IndicatorParamKind::EnumString,
9273        required: false,
9274        default: Some(ParamValueStatic::EnumString("sma")),
9275        min: None,
9276        max: None,
9277        step: None,
9278        enum_values: EMPTY_ENUM_VALUES,
9279        notes: None,
9280    },
9281];
9282
9283const PARAM_MACZ: &[IndicatorParamInfo] = &[
9284    IndicatorParamInfo {
9285        key: "fast_length",
9286        label: "Fast Length",
9287        kind: IndicatorParamKind::Int,
9288        required: false,
9289        default: Some(ParamValueStatic::Int(12)),
9290        min: Some(1.0),
9291        max: None,
9292        step: Some(1.0),
9293        enum_values: EMPTY_ENUM_VALUES,
9294        notes: None,
9295    },
9296    IndicatorParamInfo {
9297        key: "slow_length",
9298        label: "Slow Length",
9299        kind: IndicatorParamKind::Int,
9300        required: false,
9301        default: Some(ParamValueStatic::Int(25)),
9302        min: Some(1.0),
9303        max: None,
9304        step: Some(1.0),
9305        enum_values: EMPTY_ENUM_VALUES,
9306        notes: None,
9307    },
9308    IndicatorParamInfo {
9309        key: "signal_length",
9310        label: "Signal Length",
9311        kind: IndicatorParamKind::Int,
9312        required: false,
9313        default: Some(ParamValueStatic::Int(9)),
9314        min: Some(1.0),
9315        max: None,
9316        step: Some(1.0),
9317        enum_values: EMPTY_ENUM_VALUES,
9318        notes: None,
9319    },
9320    IndicatorParamInfo {
9321        key: "lengthz",
9322        label: "Length Z",
9323        kind: IndicatorParamKind::Int,
9324        required: false,
9325        default: Some(ParamValueStatic::Int(20)),
9326        min: Some(1.0),
9327        max: None,
9328        step: Some(1.0),
9329        enum_values: EMPTY_ENUM_VALUES,
9330        notes: None,
9331    },
9332    IndicatorParamInfo {
9333        key: "length_stdev",
9334        label: "Length StdDev",
9335        kind: IndicatorParamKind::Int,
9336        required: false,
9337        default: Some(ParamValueStatic::Int(25)),
9338        min: Some(1.0),
9339        max: None,
9340        step: Some(1.0),
9341        enum_values: EMPTY_ENUM_VALUES,
9342        notes: None,
9343    },
9344    IndicatorParamInfo {
9345        key: "a",
9346        label: "A",
9347        kind: IndicatorParamKind::Float,
9348        required: false,
9349        default: Some(ParamValueStatic::Float(1.0)),
9350        min: None,
9351        max: None,
9352        step: None,
9353        enum_values: EMPTY_ENUM_VALUES,
9354        notes: None,
9355    },
9356    IndicatorParamInfo {
9357        key: "b",
9358        label: "B",
9359        kind: IndicatorParamKind::Float,
9360        required: false,
9361        default: Some(ParamValueStatic::Float(1.0)),
9362        min: None,
9363        max: None,
9364        step: None,
9365        enum_values: EMPTY_ENUM_VALUES,
9366        notes: None,
9367    },
9368    IndicatorParamInfo {
9369        key: "use_lag",
9370        label: "Use Lag",
9371        kind: IndicatorParamKind::Bool,
9372        required: false,
9373        default: Some(ParamValueStatic::Bool(false)),
9374        min: None,
9375        max: None,
9376        step: None,
9377        enum_values: ENUM_VALUES_TRUE_FALSE,
9378        notes: None,
9379    },
9380    IndicatorParamInfo {
9381        key: "gamma",
9382        label: "Gamma",
9383        kind: IndicatorParamKind::Float,
9384        required: false,
9385        default: Some(ParamValueStatic::Float(0.02)),
9386        min: None,
9387        max: None,
9388        step: None,
9389        enum_values: EMPTY_ENUM_VALUES,
9390        notes: None,
9391    },
9392];
9393
9394const PARAM_MINMAX: &[IndicatorParamInfo] = &[IndicatorParamInfo {
9395    key: "order",
9396    label: "Order",
9397    kind: IndicatorParamKind::Int,
9398    required: false,
9399    default: Some(ParamValueStatic::Int(3)),
9400    min: Some(1.0),
9401    max: None,
9402    step: Some(1.0),
9403    enum_values: EMPTY_ENUM_VALUES,
9404    notes: None,
9405}];
9406
9407const PARAM_MSW: &[IndicatorParamInfo] = &[IndicatorParamInfo {
9408    key: "period",
9409    label: "Period",
9410    kind: IndicatorParamKind::Int,
9411    required: false,
9412    default: Some(ParamValueStatic::Int(5)),
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_NWE: &[IndicatorParamInfo] = &[
9421    IndicatorParamInfo {
9422        key: "bandwidth",
9423        label: "Bandwidth",
9424        kind: IndicatorParamKind::Float,
9425        required: false,
9426        default: Some(ParamValueStatic::Float(8.0)),
9427        min: Some(0.0),
9428        max: None,
9429        step: None,
9430        enum_values: EMPTY_ENUM_VALUES,
9431        notes: None,
9432    },
9433    IndicatorParamInfo {
9434        key: "multiplier",
9435        label: "Multiplier",
9436        kind: IndicatorParamKind::Float,
9437        required: false,
9438        default: Some(ParamValueStatic::Float(3.0)),
9439        min: Some(0.0),
9440        max: None,
9441        step: None,
9442        enum_values: EMPTY_ENUM_VALUES,
9443        notes: None,
9444    },
9445    IndicatorParamInfo {
9446        key: "lookback",
9447        label: "Lookback",
9448        kind: IndicatorParamKind::Int,
9449        required: false,
9450        default: Some(ParamValueStatic::Int(500)),
9451        min: Some(1.0),
9452        max: None,
9453        step: Some(1.0),
9454        enum_values: EMPTY_ENUM_VALUES,
9455        notes: None,
9456    },
9457];
9458
9459const PARAM_OTT: &[IndicatorParamInfo] = &[
9460    IndicatorParamInfo {
9461        key: "period",
9462        label: "Period",
9463        kind: IndicatorParamKind::Int,
9464        required: false,
9465        default: Some(ParamValueStatic::Int(2)),
9466        min: Some(1.0),
9467        max: None,
9468        step: Some(1.0),
9469        enum_values: EMPTY_ENUM_VALUES,
9470        notes: None,
9471    },
9472    IndicatorParamInfo {
9473        key: "percent",
9474        label: "Percent",
9475        kind: IndicatorParamKind::Float,
9476        required: false,
9477        default: Some(ParamValueStatic::Float(1.4)),
9478        min: Some(0.0),
9479        max: None,
9480        step: None,
9481        enum_values: EMPTY_ENUM_VALUES,
9482        notes: None,
9483    },
9484    IndicatorParamInfo {
9485        key: "ma_type",
9486        label: "MA Type",
9487        kind: IndicatorParamKind::EnumString,
9488        required: false,
9489        default: Some(ParamValueStatic::EnumString("VAR")),
9490        min: None,
9491        max: None,
9492        step: None,
9493        enum_values: EMPTY_ENUM_VALUES,
9494        notes: None,
9495    },
9496];
9497
9498const PARAM_OTTO: &[IndicatorParamInfo] = &[
9499    IndicatorParamInfo {
9500        key: "ott_period",
9501        label: "OTT Period",
9502        kind: IndicatorParamKind::Int,
9503        required: false,
9504        default: Some(ParamValueStatic::Int(2)),
9505        min: Some(1.0),
9506        max: None,
9507        step: Some(1.0),
9508        enum_values: EMPTY_ENUM_VALUES,
9509        notes: None,
9510    },
9511    IndicatorParamInfo {
9512        key: "ott_percent",
9513        label: "OTT Percent",
9514        kind: IndicatorParamKind::Float,
9515        required: false,
9516        default: Some(ParamValueStatic::Float(0.6)),
9517        min: Some(0.0),
9518        max: None,
9519        step: None,
9520        enum_values: EMPTY_ENUM_VALUES,
9521        notes: None,
9522    },
9523    IndicatorParamInfo {
9524        key: "fast_vidya_length",
9525        label: "Fast VIDYA Length",
9526        kind: IndicatorParamKind::Int,
9527        required: false,
9528        default: Some(ParamValueStatic::Int(10)),
9529        min: Some(1.0),
9530        max: None,
9531        step: Some(1.0),
9532        enum_values: EMPTY_ENUM_VALUES,
9533        notes: None,
9534    },
9535    IndicatorParamInfo {
9536        key: "slow_vidya_length",
9537        label: "Slow VIDYA Length",
9538        kind: IndicatorParamKind::Int,
9539        required: false,
9540        default: Some(ParamValueStatic::Int(25)),
9541        min: Some(1.0),
9542        max: None,
9543        step: Some(1.0),
9544        enum_values: EMPTY_ENUM_VALUES,
9545        notes: None,
9546    },
9547    IndicatorParamInfo {
9548        key: "correcting_constant",
9549        label: "Correcting Constant",
9550        kind: IndicatorParamKind::Float,
9551        required: false,
9552        default: Some(ParamValueStatic::Float(100000.0)),
9553        min: Some(0.0),
9554        max: None,
9555        step: None,
9556        enum_values: EMPTY_ENUM_VALUES,
9557        notes: None,
9558    },
9559    IndicatorParamInfo {
9560        key: "ma_type",
9561        label: "MA Type",
9562        kind: IndicatorParamKind::EnumString,
9563        required: false,
9564        default: Some(ParamValueStatic::EnumString("VAR")),
9565        min: None,
9566        max: None,
9567        step: None,
9568        enum_values: EMPTY_ENUM_VALUES,
9569        notes: None,
9570    },
9571];
9572
9573const PARAM_PMA: &[IndicatorParamInfo] = PARAM_NONE;
9574
9575const PARAM_EHLERS_ADAPTIVE_CG: &[IndicatorParamInfo] = &[
9576    IndicatorParamInfo {
9577        key: "alpha",
9578        label: "Alpha",
9579        kind: IndicatorParamKind::Float,
9580        required: false,
9581        default: Some(ParamValueStatic::Float(0.07)),
9582        min: Some(0.0),
9583        max: Some(1.0),
9584        step: None,
9585        enum_values: EMPTY_ENUM_VALUES,
9586        notes: None,
9587    },
9588    PARAM_OUTPUT_EHLERS_ADAPTIVE_CG,
9589];
9590
9591const PARAM_PRB: &[IndicatorParamInfo] = &[
9592    IndicatorParamInfo {
9593        key: "smooth_data",
9594        label: "Smooth Data",
9595        kind: IndicatorParamKind::Bool,
9596        required: false,
9597        default: Some(ParamValueStatic::Bool(true)),
9598        min: None,
9599        max: None,
9600        step: None,
9601        enum_values: ENUM_VALUES_TRUE_FALSE,
9602        notes: None,
9603    },
9604    IndicatorParamInfo {
9605        key: "smooth_period",
9606        label: "Smooth Period",
9607        kind: IndicatorParamKind::Int,
9608        required: false,
9609        default: Some(ParamValueStatic::Int(10)),
9610        min: Some(1.0),
9611        max: None,
9612        step: Some(1.0),
9613        enum_values: EMPTY_ENUM_VALUES,
9614        notes: None,
9615    },
9616    IndicatorParamInfo {
9617        key: "regression_period",
9618        label: "Regression Period",
9619        kind: IndicatorParamKind::Int,
9620        required: false,
9621        default: Some(ParamValueStatic::Int(100)),
9622        min: Some(1.0),
9623        max: None,
9624        step: Some(1.0),
9625        enum_values: EMPTY_ENUM_VALUES,
9626        notes: None,
9627    },
9628    IndicatorParamInfo {
9629        key: "polynomial_order",
9630        label: "Polynomial Order",
9631        kind: IndicatorParamKind::Int,
9632        required: false,
9633        default: Some(ParamValueStatic::Int(2)),
9634        min: Some(1.0),
9635        max: None,
9636        step: Some(1.0),
9637        enum_values: EMPTY_ENUM_VALUES,
9638        notes: None,
9639    },
9640    IndicatorParamInfo {
9641        key: "regression_offset",
9642        label: "Regression Offset",
9643        kind: IndicatorParamKind::Int,
9644        required: false,
9645        default: Some(ParamValueStatic::Int(0)),
9646        min: None,
9647        max: None,
9648        step: Some(1.0),
9649        enum_values: EMPTY_ENUM_VALUES,
9650        notes: None,
9651    },
9652    IndicatorParamInfo {
9653        key: "ndev",
9654        label: "NDev",
9655        kind: IndicatorParamKind::Float,
9656        required: false,
9657        default: Some(ParamValueStatic::Float(2.0)),
9658        min: Some(0.0),
9659        max: None,
9660        step: None,
9661        enum_values: EMPTY_ENUM_VALUES,
9662        notes: None,
9663    },
9664    IndicatorParamInfo {
9665        key: "equ_from",
9666        label: "Equ From",
9667        kind: IndicatorParamKind::Int,
9668        required: false,
9669        default: Some(ParamValueStatic::Int(0)),
9670        min: Some(0.0),
9671        max: None,
9672        step: Some(1.0),
9673        enum_values: EMPTY_ENUM_VALUES,
9674        notes: None,
9675    },
9676];
9677
9678const PARAM_POLYNOMIAL_REGRESSION_EXTRAPOLATION: &[IndicatorParamInfo] = &[
9679    IndicatorParamInfo {
9680        key: "length",
9681        label: "Length",
9682        kind: IndicatorParamKind::Int,
9683        required: false,
9684        default: Some(ParamValueStatic::Int(100)),
9685        min: Some(1.0),
9686        max: None,
9687        step: Some(1.0),
9688        enum_values: EMPTY_ENUM_VALUES,
9689        notes: None,
9690    },
9691    IndicatorParamInfo {
9692        key: "extrapolate",
9693        label: "Extrapolate",
9694        kind: IndicatorParamKind::Int,
9695        required: false,
9696        default: Some(ParamValueStatic::Int(10)),
9697        min: Some(0.0),
9698        max: None,
9699        step: Some(1.0),
9700        enum_values: EMPTY_ENUM_VALUES,
9701        notes: None,
9702    },
9703    IndicatorParamInfo {
9704        key: "degree",
9705        label: "Degree",
9706        kind: IndicatorParamKind::Int,
9707        required: false,
9708        default: Some(ParamValueStatic::Int(3)),
9709        min: Some(0.0),
9710        max: Some(8.0),
9711        step: Some(1.0),
9712        enum_values: EMPTY_ENUM_VALUES,
9713        notes: Some("Must satisfy degree + 1 <= length"),
9714    },
9715];
9716
9717const PARAM_STATISTICAL_TRAILING_STOP: &[IndicatorParamInfo] = &[
9718    IndicatorParamInfo {
9719        key: "data_length",
9720        label: "Data Length",
9721        kind: IndicatorParamKind::Int,
9722        required: false,
9723        default: Some(ParamValueStatic::Int(10)),
9724        min: Some(1.0),
9725        max: None,
9726        step: Some(1.0),
9727        enum_values: EMPTY_ENUM_VALUES,
9728        notes: Some("Corrected from the provided source so the data_length input controls the true-range window"),
9729    },
9730    IndicatorParamInfo {
9731        key: "normalization_length",
9732        label: "Distribution Length",
9733        kind: IndicatorParamKind::Int,
9734        required: false,
9735        default: Some(ParamValueStatic::Int(100)),
9736        min: Some(10.0),
9737        max: Some(5000.0),
9738        step: Some(1.0),
9739        enum_values: EMPTY_ENUM_VALUES,
9740        notes: None,
9741    },
9742    IndicatorParamInfo {
9743        key: "base_level",
9744        label: "Base Level",
9745        kind: IndicatorParamKind::EnumString,
9746        required: false,
9747        default: Some(ParamValueStatic::EnumString("level2")),
9748        min: None,
9749        max: None,
9750        step: None,
9751        enum_values: ENUM_VALUES_STATISTICAL_TRAILING_STOP_BASE_LEVEL,
9752        notes: None,
9753    },
9754];
9755
9756const PARAM_GEOMETRIC_BIAS_OSCILLATOR: &[IndicatorParamInfo] = &[
9757    IndicatorParamInfo {
9758        key: "length",
9759        label: "Window Size",
9760        kind: IndicatorParamKind::Int,
9761        required: false,
9762        default: Some(ParamValueStatic::Int(100)),
9763        min: Some(10.0),
9764        max: Some(500.0),
9765        step: Some(1.0),
9766        enum_values: EMPTY_ENUM_VALUES,
9767        notes: None,
9768    },
9769    IndicatorParamInfo {
9770        key: "multiplier",
9771        label: "ATR Multiplier",
9772        kind: IndicatorParamKind::Float,
9773        required: false,
9774        default: Some(ParamValueStatic::Float(2.0)),
9775        min: Some(0.1),
9776        max: None,
9777        step: Some(0.1),
9778        enum_values: EMPTY_ENUM_VALUES,
9779        notes: Some(
9780            "Used as the RDP simplification threshold against ATR-normalized price geometry",
9781        ),
9782    },
9783    IndicatorParamInfo {
9784        key: "atr_length",
9785        label: "ATR Length",
9786        kind: IndicatorParamKind::Int,
9787        required: false,
9788        default: Some(ParamValueStatic::Int(14)),
9789        min: Some(1.0),
9790        max: None,
9791        step: Some(1.0),
9792        enum_values: EMPTY_ENUM_VALUES,
9793        notes: None,
9794    },
9795    IndicatorParamInfo {
9796        key: "smooth",
9797        label: "Smoothing",
9798        kind: IndicatorParamKind::Int,
9799        required: false,
9800        default: Some(ParamValueStatic::Int(1)),
9801        min: Some(1.0),
9802        max: None,
9803        step: Some(1.0),
9804        enum_values: EMPTY_ENUM_VALUES,
9805        notes: None,
9806    },
9807];
9808
9809const PARAM_VDUBUS_DIVERGENCE_WAVE_PATTERN_GENERATOR: &[IndicatorParamInfo] = &[
9810    IndicatorParamInfo {
9811        key: "fast_depth",
9812        label: "Fast Depth",
9813        kind: IndicatorParamKind::Int,
9814        required: false,
9815        default: Some(ParamValueStatic::Int(9)),
9816        min: Some(1.0),
9817        max: None,
9818        step: Some(1.0),
9819        enum_values: EMPTY_ENUM_VALUES,
9820        notes: None,
9821    },
9822    IndicatorParamInfo {
9823        key: "slow_depth",
9824        label: "Slow Depth",
9825        kind: IndicatorParamKind::Int,
9826        required: false,
9827        default: Some(ParamValueStatic::Int(24)),
9828        min: Some(1.0),
9829        max: None,
9830        step: Some(1.0),
9831        enum_values: EMPTY_ENUM_VALUES,
9832        notes: None,
9833    },
9834    IndicatorParamInfo {
9835        key: "fast_length",
9836        label: "Fast Length",
9837        kind: IndicatorParamKind::Int,
9838        required: false,
9839        default: Some(ParamValueStatic::Int(21)),
9840        min: Some(1.0),
9841        max: None,
9842        step: Some(1.0),
9843        enum_values: EMPTY_ENUM_VALUES,
9844        notes: None,
9845    },
9846    IndicatorParamInfo {
9847        key: "slow_length",
9848        label: "Slow Length",
9849        kind: IndicatorParamKind::Int,
9850        required: false,
9851        default: Some(ParamValueStatic::Int(34)),
9852        min: Some(1.0),
9853        max: None,
9854        step: Some(1.0),
9855        enum_values: EMPTY_ENUM_VALUES,
9856        notes: None,
9857    },
9858    IndicatorParamInfo {
9859        key: "signal_length",
9860        label: "Signal Length",
9861        kind: IndicatorParamKind::Int,
9862        required: false,
9863        default: Some(ParamValueStatic::Int(5)),
9864        min: Some(1.0),
9865        max: None,
9866        step: Some(1.0),
9867        enum_values: EMPTY_ENUM_VALUES,
9868        notes: None,
9869    },
9870    IndicatorParamInfo {
9871        key: "lookback",
9872        label: "Momentum Pivot Lookback",
9873        kind: IndicatorParamKind::Int,
9874        required: false,
9875        default: Some(ParamValueStatic::Int(3)),
9876        min: Some(1.0),
9877        max: None,
9878        step: Some(1.0),
9879        enum_values: EMPTY_ENUM_VALUES,
9880        notes: None,
9881    },
9882    IndicatorParamInfo {
9883        key: "err_tol",
9884        label: "Harmonic Tolerance",
9885        kind: IndicatorParamKind::Float,
9886        required: false,
9887        default: Some(ParamValueStatic::Float(0.15)),
9888        min: Some(0.01),
9889        max: Some(0.5),
9890        step: Some(0.01),
9891        enum_values: EMPTY_ENUM_VALUES,
9892        notes: Some(
9893            "Uses corrected XAD ratio instead of the constant 1.27 shown in the provided source",
9894        ),
9895    },
9896    IndicatorParamInfo {
9897        key: "show_standard",
9898        label: "Show Standard",
9899        kind: IndicatorParamKind::Bool,
9900        required: false,
9901        default: Some(ParamValueStatic::Bool(true)),
9902        min: None,
9903        max: None,
9904        step: None,
9905        enum_values: ENUM_VALUES_TRUE_FALSE,
9906        notes: None,
9907    },
9908    IndicatorParamInfo {
9909        key: "show_climax",
9910        label: "Show Climax",
9911        kind: IndicatorParamKind::Bool,
9912        required: false,
9913        default: Some(ParamValueStatic::Bool(true)),
9914        min: None,
9915        max: None,
9916        step: None,
9917        enum_values: ENUM_VALUES_TRUE_FALSE,
9918        notes: None,
9919    },
9920    IndicatorParamInfo {
9921        key: "show_rounded",
9922        label: "Show Rounded",
9923        kind: IndicatorParamKind::Bool,
9924        required: false,
9925        default: Some(ParamValueStatic::Bool(true)),
9926        min: None,
9927        max: None,
9928        step: None,
9929        enum_values: ENUM_VALUES_TRUE_FALSE,
9930        notes: None,
9931    },
9932    IndicatorParamInfo {
9933        key: "show_predator",
9934        label: "Show Predator",
9935        kind: IndicatorParamKind::Bool,
9936        required: false,
9937        default: Some(ParamValueStatic::Bool(true)),
9938        min: None,
9939        max: None,
9940        step: None,
9941        enum_values: ENUM_VALUES_TRUE_FALSE,
9942        notes: None,
9943    },
9944    IndicatorParamInfo {
9945        key: "show_gartley",
9946        label: "Show Gartley",
9947        kind: IndicatorParamKind::Bool,
9948        required: false,
9949        default: Some(ParamValueStatic::Bool(false)),
9950        min: None,
9951        max: None,
9952        step: None,
9953        enum_values: ENUM_VALUES_TRUE_FALSE,
9954        notes: None,
9955    },
9956    IndicatorParamInfo {
9957        key: "show_bat",
9958        label: "Show Bat",
9959        kind: IndicatorParamKind::Bool,
9960        required: false,
9961        default: Some(ParamValueStatic::Bool(false)),
9962        min: None,
9963        max: None,
9964        step: None,
9965        enum_values: ENUM_VALUES_TRUE_FALSE,
9966        notes: None,
9967    },
9968    IndicatorParamInfo {
9969        key: "show_butterfly",
9970        label: "Show Butterfly",
9971        kind: IndicatorParamKind::Bool,
9972        required: false,
9973        default: Some(ParamValueStatic::Bool(false)),
9974        min: None,
9975        max: None,
9976        step: None,
9977        enum_values: ENUM_VALUES_TRUE_FALSE,
9978        notes: None,
9979    },
9980    IndicatorParamInfo {
9981        key: "show_crab",
9982        label: "Show Crab",
9983        kind: IndicatorParamKind::Bool,
9984        required: false,
9985        default: Some(ParamValueStatic::Bool(false)),
9986        min: None,
9987        max: None,
9988        step: None,
9989        enum_values: ENUM_VALUES_TRUE_FALSE,
9990        notes: None,
9991    },
9992    IndicatorParamInfo {
9993        key: "show_deep",
9994        label: "Show Deep",
9995        kind: IndicatorParamKind::Bool,
9996        required: false,
9997        default: Some(ParamValueStatic::Bool(false)),
9998        min: None,
9999        max: None,
10000        step: None,
10001        enum_values: ENUM_VALUES_TRUE_FALSE,
10002        notes: None,
10003    },
10004    IndicatorParamInfo {
10005        key: "show_hs",
10006        label: "Show H&S",
10007        kind: IndicatorParamKind::Bool,
10008        required: false,
10009        default: Some(ParamValueStatic::Bool(true)),
10010        min: None,
10011        max: None,
10012        step: None,
10013        enum_values: ENUM_VALUES_TRUE_FALSE,
10014        notes: None,
10015    },
10016];
10017
10018const PARAM_QQE: &[IndicatorParamInfo] = &[
10019    IndicatorParamInfo {
10020        key: "rsi_period",
10021        label: "RSI Period",
10022        kind: IndicatorParamKind::Int,
10023        required: false,
10024        default: Some(ParamValueStatic::Int(14)),
10025        min: Some(1.0),
10026        max: None,
10027        step: Some(1.0),
10028        enum_values: EMPTY_ENUM_VALUES,
10029        notes: None,
10030    },
10031    IndicatorParamInfo {
10032        key: "smoothing_factor",
10033        label: "Smoothing Factor",
10034        kind: IndicatorParamKind::Int,
10035        required: false,
10036        default: Some(ParamValueStatic::Int(5)),
10037        min: Some(1.0),
10038        max: None,
10039        step: Some(1.0),
10040        enum_values: EMPTY_ENUM_VALUES,
10041        notes: None,
10042    },
10043    IndicatorParamInfo {
10044        key: "fast_factor",
10045        label: "Fast Factor",
10046        kind: IndicatorParamKind::Float,
10047        required: false,
10048        default: Some(ParamValueStatic::Float(4.236)),
10049        min: Some(0.0),
10050        max: None,
10051        step: None,
10052        enum_values: EMPTY_ENUM_VALUES,
10053        notes: None,
10054    },
10055];
10056
10057const PARAM_QQE_WEIGHTED_OSCILLATOR: &[IndicatorParamInfo] = &[
10058    IndicatorParamInfo {
10059        key: "length",
10060        label: "Length",
10061        kind: IndicatorParamKind::Int,
10062        required: false,
10063        default: Some(ParamValueStatic::Int(14)),
10064        min: Some(1.0),
10065        max: None,
10066        step: Some(1.0),
10067        enum_values: EMPTY_ENUM_VALUES,
10068        notes: None,
10069    },
10070    IndicatorParamInfo {
10071        key: "factor",
10072        label: "Factor",
10073        kind: IndicatorParamKind::Float,
10074        required: false,
10075        default: Some(ParamValueStatic::Float(4.236)),
10076        min: Some(0.0),
10077        max: None,
10078        step: None,
10079        enum_values: EMPTY_ENUM_VALUES,
10080        notes: None,
10081    },
10082    IndicatorParamInfo {
10083        key: "smooth",
10084        label: "Smooth",
10085        kind: IndicatorParamKind::Int,
10086        required: false,
10087        default: Some(ParamValueStatic::Int(5)),
10088        min: Some(1.0),
10089        max: None,
10090        step: Some(1.0),
10091        enum_values: EMPTY_ENUM_VALUES,
10092        notes: None,
10093    },
10094    IndicatorParamInfo {
10095        key: "weight",
10096        label: "Weight",
10097        kind: IndicatorParamKind::Float,
10098        required: false,
10099        default: Some(ParamValueStatic::Float(2.0)),
10100        min: None,
10101        max: None,
10102        step: None,
10103        enum_values: EMPTY_ENUM_VALUES,
10104        notes: None,
10105    },
10106];
10107
10108const PARAM_FORWARD_BACKWARD_EXPONENTIAL_OSCILLATOR: &[IndicatorParamInfo] = &[
10109    IndicatorParamInfo {
10110        key: "length",
10111        label: "Length",
10112        kind: IndicatorParamKind::Int,
10113        required: false,
10114        default: Some(ParamValueStatic::Int(20)),
10115        min: Some(1.0),
10116        max: None,
10117        step: Some(1.0),
10118        enum_values: EMPTY_ENUM_VALUES,
10119        notes: None,
10120    },
10121    IndicatorParamInfo {
10122        key: "smooth",
10123        label: "Smoothing",
10124        kind: IndicatorParamKind::Int,
10125        required: false,
10126        default: Some(ParamValueStatic::Int(10)),
10127        min: Some(1.0),
10128        max: None,
10129        step: Some(1.0),
10130        enum_values: EMPTY_ENUM_VALUES,
10131        notes: None,
10132    },
10133];
10134
10135const PARAM_ADAPTIVE_BOUNDS_RSI: &[IndicatorParamInfo] = &[
10136    IndicatorParamInfo {
10137        key: "rsi_length",
10138        label: "RSI Length",
10139        kind: IndicatorParamKind::Int,
10140        required: false,
10141        default: Some(ParamValueStatic::Int(14)),
10142        min: Some(1.0),
10143        max: None,
10144        step: Some(1.0),
10145        enum_values: EMPTY_ENUM_VALUES,
10146        notes: None,
10147    },
10148    IndicatorParamInfo {
10149        key: "alpha",
10150        label: "Learning Rate",
10151        kind: IndicatorParamKind::Float,
10152        required: false,
10153        default: Some(ParamValueStatic::Float(0.1)),
10154        min: Some(0.001),
10155        max: Some(1.0),
10156        step: Some(0.001),
10157        enum_values: EMPTY_ENUM_VALUES,
10158        notes: None,
10159    },
10160];
10161
10162const PARAM_RANGE_OSCILLATOR: &[IndicatorParamInfo] = &[
10163    IndicatorParamInfo {
10164        key: "length",
10165        label: "Length",
10166        kind: IndicatorParamKind::Int,
10167        required: false,
10168        default: Some(ParamValueStatic::Int(50)),
10169        min: Some(1.0),
10170        max: None,
10171        step: Some(1.0),
10172        enum_values: EMPTY_ENUM_VALUES,
10173        notes: None,
10174    },
10175    IndicatorParamInfo {
10176        key: "mult",
10177        label: "Multiplier",
10178        kind: IndicatorParamKind::Float,
10179        required: false,
10180        default: Some(ParamValueStatic::Float(2.0)),
10181        min: Some(0.1),
10182        max: None,
10183        step: Some(0.1),
10184        enum_values: EMPTY_ENUM_VALUES,
10185        notes: None,
10186    },
10187];
10188const PARAM_RANGE_FILTERED_TREND_SIGNALS: &[IndicatorParamInfo] = &[
10189    IndicatorParamInfo {
10190        key: "kalman_alpha",
10191        label: "Kalman Alpha",
10192        kind: IndicatorParamKind::Float,
10193        required: false,
10194        default: Some(ParamValueStatic::Float(0.01)),
10195        min: Some(0.0),
10196        max: None,
10197        step: Some(0.01),
10198        enum_values: EMPTY_ENUM_VALUES,
10199        notes: None,
10200    },
10201    IndicatorParamInfo {
10202        key: "kalman_beta",
10203        label: "Kalman Beta",
10204        kind: IndicatorParamKind::Float,
10205        required: false,
10206        default: Some(ParamValueStatic::Float(0.1)),
10207        min: Some(0.0),
10208        max: None,
10209        step: Some(0.1),
10210        enum_values: EMPTY_ENUM_VALUES,
10211        notes: None,
10212    },
10213    IndicatorParamInfo {
10214        key: "kalman_period",
10215        label: "Kalman Period",
10216        kind: IndicatorParamKind::Int,
10217        required: false,
10218        default: Some(ParamValueStatic::Int(77)),
10219        min: Some(1.0),
10220        max: None,
10221        step: Some(1.0),
10222        enum_values: EMPTY_ENUM_VALUES,
10223        notes: None,
10224    },
10225    IndicatorParamInfo {
10226        key: "dev",
10227        label: "Deviation",
10228        kind: IndicatorParamKind::Float,
10229        required: false,
10230        default: Some(ParamValueStatic::Float(1.2)),
10231        min: Some(0.0),
10232        max: None,
10233        step: Some(0.1),
10234        enum_values: EMPTY_ENUM_VALUES,
10235        notes: None,
10236    },
10237    IndicatorParamInfo {
10238        key: "supertrend_factor",
10239        label: "Supertrend Factor",
10240        kind: IndicatorParamKind::Float,
10241        required: false,
10242        default: Some(ParamValueStatic::Float(0.7)),
10243        min: Some(0.0),
10244        max: None,
10245        step: Some(0.1),
10246        enum_values: EMPTY_ENUM_VALUES,
10247        notes: None,
10248    },
10249    IndicatorParamInfo {
10250        key: "supertrend_atr_period",
10251        label: "Supertrend ATR Period",
10252        kind: IndicatorParamKind::Int,
10253        required: false,
10254        default: Some(ParamValueStatic::Int(7)),
10255        min: Some(1.0),
10256        max: None,
10257        step: Some(1.0),
10258        enum_values: EMPTY_ENUM_VALUES,
10259        notes: None,
10260    },
10261];
10262const ENUM_VALUES_MSC_BOS_CONFIRMATION: &[&str] = &["Candle Close", "Wicks"];
10263const PARAM_MARKET_STRUCTURE_CONFLUENCE: &[IndicatorParamInfo] = &[
10264    IndicatorParamInfo {
10265        key: "swing_size",
10266        label: "Time Horizon",
10267        kind: IndicatorParamKind::Int,
10268        required: false,
10269        default: Some(ParamValueStatic::Int(10)),
10270        min: Some(2.0),
10271        max: None,
10272        step: Some(1.0),
10273        enum_values: EMPTY_ENUM_VALUES,
10274        notes: None,
10275    },
10276    IndicatorParamInfo {
10277        key: "bos_confirmation",
10278        label: "BOS Confirmation",
10279        kind: IndicatorParamKind::EnumString,
10280        required: false,
10281        default: Some(ParamValueStatic::EnumString("Candle Close")),
10282        min: None,
10283        max: None,
10284        step: None,
10285        enum_values: ENUM_VALUES_MSC_BOS_CONFIRMATION,
10286        notes: None,
10287    },
10288    IndicatorParamInfo {
10289        key: "basis_length",
10290        label: "Basis Length",
10291        kind: IndicatorParamKind::Int,
10292        required: false,
10293        default: Some(ParamValueStatic::Int(100)),
10294        min: Some(1.0),
10295        max: None,
10296        step: Some(1.0),
10297        enum_values: EMPTY_ENUM_VALUES,
10298        notes: None,
10299    },
10300    IndicatorParamInfo {
10301        key: "atr_length",
10302        label: "ATR Length",
10303        kind: IndicatorParamKind::Int,
10304        required: false,
10305        default: Some(ParamValueStatic::Int(14)),
10306        min: Some(1.0),
10307        max: None,
10308        step: Some(1.0),
10309        enum_values: EMPTY_ENUM_VALUES,
10310        notes: None,
10311    },
10312    IndicatorParamInfo {
10313        key: "atr_smooth",
10314        label: "ATR Smoothing",
10315        kind: IndicatorParamKind::Int,
10316        required: false,
10317        default: Some(ParamValueStatic::Int(21)),
10318        min: Some(1.0),
10319        max: None,
10320        step: Some(1.0),
10321        enum_values: EMPTY_ENUM_VALUES,
10322        notes: None,
10323    },
10324    IndicatorParamInfo {
10325        key: "vol_mult",
10326        label: "Volatility Multiplier",
10327        kind: IndicatorParamKind::Float,
10328        required: false,
10329        default: Some(ParamValueStatic::Float(2.0)),
10330        min: Some(0.0),
10331        max: None,
10332        step: Some(0.1),
10333        enum_values: EMPTY_ENUM_VALUES,
10334        notes: None,
10335    },
10336];
10337const ENUM_VALUES_VWRSI_MA_TYPE: &[&str] = &["EMA", "SMA", "HMA", "SMMA (RMA)", "WMA", "VWMA"];
10338const PARAM_VOLUME_WEIGHTED_RELATIVE_STRENGTH_INDEX: &[IndicatorParamInfo] = &[
10339    IndicatorParamInfo {
10340        key: "rsi_length",
10341        label: "RSI Length",
10342        kind: IndicatorParamKind::Int,
10343        required: false,
10344        default: Some(ParamValueStatic::Int(14)),
10345        min: Some(1.0),
10346        max: None,
10347        step: Some(1.0),
10348        enum_values: EMPTY_ENUM_VALUES,
10349        notes: None,
10350    },
10351    IndicatorParamInfo {
10352        key: "range_length",
10353        label: "Consolidation Length",
10354        kind: IndicatorParamKind::Int,
10355        required: false,
10356        default: Some(ParamValueStatic::Int(10)),
10357        min: Some(1.0),
10358        max: None,
10359        step: Some(1.0),
10360        enum_values: EMPTY_ENUM_VALUES,
10361        notes: None,
10362    },
10363    IndicatorParamInfo {
10364        key: "ma_length",
10365        label: "RSI MA Length",
10366        kind: IndicatorParamKind::Int,
10367        required: false,
10368        default: Some(ParamValueStatic::Int(14)),
10369        min: Some(1.0),
10370        max: None,
10371        step: Some(1.0),
10372        enum_values: EMPTY_ENUM_VALUES,
10373        notes: None,
10374    },
10375    IndicatorParamInfo {
10376        key: "ma_type",
10377        label: "RSI MA Type",
10378        kind: IndicatorParamKind::EnumString,
10379        required: false,
10380        default: Some(ParamValueStatic::EnumString("EMA")),
10381        min: None,
10382        max: None,
10383        step: None,
10384        enum_values: ENUM_VALUES_VWRSI_MA_TYPE,
10385        notes: None,
10386    },
10387];
10388
10389const PARAM_RANGE_FILTER: &[IndicatorParamInfo] = &[
10390    IndicatorParamInfo {
10391        key: "range_size",
10392        label: "Range Size",
10393        kind: IndicatorParamKind::Float,
10394        required: false,
10395        default: Some(ParamValueStatic::Float(2.618)),
10396        min: Some(0.0),
10397        max: None,
10398        step: None,
10399        enum_values: EMPTY_ENUM_VALUES,
10400        notes: None,
10401    },
10402    IndicatorParamInfo {
10403        key: "range_period",
10404        label: "Range Period",
10405        kind: IndicatorParamKind::Int,
10406        required: false,
10407        default: Some(ParamValueStatic::Int(14)),
10408        min: Some(1.0),
10409        max: None,
10410        step: Some(1.0),
10411        enum_values: EMPTY_ENUM_VALUES,
10412        notes: None,
10413    },
10414    IndicatorParamInfo {
10415        key: "smooth_range",
10416        label: "Smooth Range",
10417        kind: IndicatorParamKind::Bool,
10418        required: false,
10419        default: Some(ParamValueStatic::Bool(true)),
10420        min: None,
10421        max: None,
10422        step: None,
10423        enum_values: ENUM_VALUES_TRUE_FALSE,
10424        notes: None,
10425    },
10426    IndicatorParamInfo {
10427        key: "smooth_period",
10428        label: "Smooth Period",
10429        kind: IndicatorParamKind::Int,
10430        required: false,
10431        default: Some(ParamValueStatic::Int(27)),
10432        min: Some(1.0),
10433        max: None,
10434        step: Some(1.0),
10435        enum_values: EMPTY_ENUM_VALUES,
10436        notes: None,
10437    },
10438];
10439
10440const PARAM_RSMK: &[IndicatorParamInfo] = &[
10441    IndicatorParamInfo {
10442        key: "lookback",
10443        label: "Lookback",
10444        kind: IndicatorParamKind::Int,
10445        required: false,
10446        default: Some(ParamValueStatic::Int(90)),
10447        min: Some(1.0),
10448        max: None,
10449        step: Some(1.0),
10450        enum_values: EMPTY_ENUM_VALUES,
10451        notes: None,
10452    },
10453    IndicatorParamInfo {
10454        key: "period",
10455        label: "Period",
10456        kind: IndicatorParamKind::Int,
10457        required: false,
10458        default: Some(ParamValueStatic::Int(3)),
10459        min: Some(1.0),
10460        max: None,
10461        step: Some(1.0),
10462        enum_values: EMPTY_ENUM_VALUES,
10463        notes: None,
10464    },
10465    IndicatorParamInfo {
10466        key: "signal_period",
10467        label: "Signal Period",
10468        kind: IndicatorParamKind::Int,
10469        required: false,
10470        default: Some(ParamValueStatic::Int(20)),
10471        min: Some(1.0),
10472        max: None,
10473        step: Some(1.0),
10474        enum_values: EMPTY_ENUM_VALUES,
10475        notes: None,
10476    },
10477    IndicatorParamInfo {
10478        key: "matype",
10479        label: "MA Type",
10480        kind: IndicatorParamKind::EnumString,
10481        required: false,
10482        default: Some(ParamValueStatic::EnumString("ema")),
10483        min: None,
10484        max: None,
10485        step: None,
10486        enum_values: EMPTY_ENUM_VALUES,
10487        notes: None,
10488    },
10489    IndicatorParamInfo {
10490        key: "signal_matype",
10491        label: "Signal MA Type",
10492        kind: IndicatorParamKind::EnumString,
10493        required: false,
10494        default: Some(ParamValueStatic::EnumString("ema")),
10495        min: None,
10496        max: None,
10497        step: None,
10498        enum_values: EMPTY_ENUM_VALUES,
10499        notes: None,
10500    },
10501];
10502
10503const PARAM_VOSS: &[IndicatorParamInfo] = &[
10504    IndicatorParamInfo {
10505        key: "period",
10506        label: "Period",
10507        kind: IndicatorParamKind::Int,
10508        required: false,
10509        default: Some(ParamValueStatic::Int(20)),
10510        min: Some(1.0),
10511        max: None,
10512        step: Some(1.0),
10513        enum_values: EMPTY_ENUM_VALUES,
10514        notes: None,
10515    },
10516    IndicatorParamInfo {
10517        key: "predict",
10518        label: "Predict",
10519        kind: IndicatorParamKind::Int,
10520        required: false,
10521        default: Some(ParamValueStatic::Int(3)),
10522        min: Some(1.0),
10523        max: None,
10524        step: Some(1.0),
10525        enum_values: EMPTY_ENUM_VALUES,
10526        notes: None,
10527    },
10528    IndicatorParamInfo {
10529        key: "bandwidth",
10530        label: "Bandwidth",
10531        kind: IndicatorParamKind::Float,
10532        required: false,
10533        default: Some(ParamValueStatic::Float(0.25)),
10534        min: Some(0.0),
10535        max: None,
10536        step: None,
10537        enum_values: EMPTY_ENUM_VALUES,
10538        notes: None,
10539    },
10540];
10541
10542const PARAM_STC: &[IndicatorParamInfo] = &[
10543    IndicatorParamInfo {
10544        key: "fast_period",
10545        label: "Fast Period",
10546        kind: IndicatorParamKind::Int,
10547        required: false,
10548        default: Some(ParamValueStatic::Int(23)),
10549        min: Some(1.0),
10550        max: None,
10551        step: Some(1.0),
10552        enum_values: EMPTY_ENUM_VALUES,
10553        notes: None,
10554    },
10555    IndicatorParamInfo {
10556        key: "slow_period",
10557        label: "Slow Period",
10558        kind: IndicatorParamKind::Int,
10559        required: false,
10560        default: Some(ParamValueStatic::Int(50)),
10561        min: Some(1.0),
10562        max: None,
10563        step: Some(1.0),
10564        enum_values: EMPTY_ENUM_VALUES,
10565        notes: None,
10566    },
10567    IndicatorParamInfo {
10568        key: "k_period",
10569        label: "K Period",
10570        kind: IndicatorParamKind::Int,
10571        required: false,
10572        default: Some(ParamValueStatic::Int(10)),
10573        min: Some(1.0),
10574        max: None,
10575        step: Some(1.0),
10576        enum_values: EMPTY_ENUM_VALUES,
10577        notes: None,
10578    },
10579    IndicatorParamInfo {
10580        key: "d_period",
10581        label: "D Period",
10582        kind: IndicatorParamKind::Int,
10583        required: false,
10584        default: Some(ParamValueStatic::Int(3)),
10585        min: Some(1.0),
10586        max: None,
10587        step: Some(1.0),
10588        enum_values: EMPTY_ENUM_VALUES,
10589        notes: None,
10590    },
10591];
10592
10593const PARAM_RVI: &[IndicatorParamInfo] = &[
10594    IndicatorParamInfo {
10595        key: "period",
10596        label: "Period",
10597        kind: IndicatorParamKind::Int,
10598        required: false,
10599        default: Some(ParamValueStatic::Int(10)),
10600        min: Some(1.0),
10601        max: None,
10602        step: Some(1.0),
10603        enum_values: EMPTY_ENUM_VALUES,
10604        notes: None,
10605    },
10606    IndicatorParamInfo {
10607        key: "ma_len",
10608        label: "MA Length",
10609        kind: IndicatorParamKind::Int,
10610        required: false,
10611        default: Some(ParamValueStatic::Int(14)),
10612        min: Some(1.0),
10613        max: None,
10614        step: Some(1.0),
10615        enum_values: EMPTY_ENUM_VALUES,
10616        notes: None,
10617    },
10618    IndicatorParamInfo {
10619        key: "matype",
10620        label: "MA Type",
10621        kind: IndicatorParamKind::Int,
10622        required: false,
10623        default: Some(ParamValueStatic::Int(1)),
10624        min: Some(0.0),
10625        max: None,
10626        step: Some(1.0),
10627        enum_values: EMPTY_ENUM_VALUES,
10628        notes: None,
10629    },
10630    IndicatorParamInfo {
10631        key: "devtype",
10632        label: "Deviation Type",
10633        kind: IndicatorParamKind::Int,
10634        required: false,
10635        default: Some(ParamValueStatic::Int(0)),
10636        min: Some(0.0),
10637        max: None,
10638        step: Some(1.0),
10639        enum_values: EMPTY_ENUM_VALUES,
10640        notes: None,
10641    },
10642];
10643
10644const PARAM_COPPOCK: &[IndicatorParamInfo] = &[
10645    IndicatorParamInfo {
10646        key: "short_roc_period",
10647        label: "Short ROC Period",
10648        kind: IndicatorParamKind::Int,
10649        required: false,
10650        default: Some(ParamValueStatic::Int(11)),
10651        min: Some(1.0),
10652        max: None,
10653        step: Some(1.0),
10654        enum_values: EMPTY_ENUM_VALUES,
10655        notes: None,
10656    },
10657    IndicatorParamInfo {
10658        key: "long_roc_period",
10659        label: "Long ROC Period",
10660        kind: IndicatorParamKind::Int,
10661        required: false,
10662        default: Some(ParamValueStatic::Int(14)),
10663        min: Some(1.0),
10664        max: None,
10665        step: Some(1.0),
10666        enum_values: EMPTY_ENUM_VALUES,
10667        notes: None,
10668    },
10669    IndicatorParamInfo {
10670        key: "ma_period",
10671        label: "MA Period",
10672        kind: IndicatorParamKind::Int,
10673        required: false,
10674        default: Some(ParamValueStatic::Int(10)),
10675        min: Some(1.0),
10676        max: None,
10677        step: Some(1.0),
10678        enum_values: EMPTY_ENUM_VALUES,
10679        notes: None,
10680    },
10681];
10682
10683const PARAM_PIVOT: &[IndicatorParamInfo] = &[IndicatorParamInfo {
10684    key: "mode",
10685    label: "Mode",
10686    kind: IndicatorParamKind::Int,
10687    required: false,
10688    default: Some(ParamValueStatic::Int(3)),
10689    min: Some(0.0),
10690    max: None,
10691    step: Some(1.0),
10692    enum_values: EMPTY_ENUM_VALUES,
10693    notes: None,
10694}];
10695
10696const SUPPLEMENTAL_SEED_NOTE: &str =
10697    "Phase 1 seed metadata; parameter and capability metadata will expand.";
10698
10699struct SupplementalIndicatorSeed {
10700    id: &'static str,
10701    label: &'static str,
10702    category: &'static str,
10703    input_kind: IndicatorInputKind,
10704    outputs: &'static [IndicatorOutputInfo],
10705    params: &'static [IndicatorParamInfo],
10706}
10707
10708const SUPPLEMENTAL_INDICATORS: &[SupplementalIndicatorSeed] = &[
10709    SupplementalIndicatorSeed {
10710        id: "adx",
10711        label: "ADX",
10712        category: "trend",
10713        input_kind: IndicatorInputKind::Ohlc,
10714        outputs: OUTPUTS_VALUE_F64,
10715        params: PARAM_ADX_PERIOD,
10716    },
10717    SupplementalIndicatorSeed {
10718        id: "adxr",
10719        label: "ADXR",
10720        category: "trend",
10721        input_kind: IndicatorInputKind::Ohlc,
10722        outputs: OUTPUTS_VALUE_F64,
10723        params: PARAM_ADX_PERIOD,
10724    },
10725    SupplementalIndicatorSeed {
10726        id: "dx",
10727        label: "DX",
10728        category: "trend",
10729        input_kind: IndicatorInputKind::Ohlc,
10730        outputs: OUTPUTS_VALUE_F64,
10731        params: PARAM_DX_PERIOD,
10732    },
10733    SupplementalIndicatorSeed {
10734        id: "di",
10735        label: "DI",
10736        category: "trend",
10737        input_kind: IndicatorInputKind::Ohlc,
10738        outputs: OUTPUTS_PLUS_MINUS,
10739        params: PARAM_DI,
10740    },
10741    SupplementalIndicatorSeed {
10742        id: "dm",
10743        label: "DM",
10744        category: "trend",
10745        input_kind: IndicatorInputKind::HighLow,
10746        outputs: OUTPUTS_PLUS_MINUS,
10747        params: PARAM_DM,
10748    },
10749    SupplementalIndicatorSeed {
10750        id: "vi",
10751        label: "VI",
10752        category: "trend",
10753        input_kind: IndicatorInputKind::Ohlc,
10754        outputs: OUTPUTS_PLUS_MINUS,
10755        params: PARAM_VI,
10756    },
10757    SupplementalIndicatorSeed {
10758        id: "donchian",
10759        label: "Donchian",
10760        category: "volatility",
10761        input_kind: IndicatorInputKind::HighLow,
10762        outputs: OUTPUTS_BOLLINGER,
10763        params: PARAM_DONCHIAN,
10764    },
10765    SupplementalIndicatorSeed {
10766        id: "supertrend",
10767        label: "SuperTrend",
10768        category: "trend",
10769        input_kind: IndicatorInputKind::Ohlc,
10770        outputs: OUTPUTS_TREND_CHANGED,
10771        params: PARAM_SUPERTREND,
10772    },
10773    SupplementalIndicatorSeed {
10774        id: "adjustable_ma_alternating_extremities",
10775        label: "Adjustable MA & Alternating Extremities",
10776        category: "trend",
10777        input_kind: IndicatorInputKind::Ohlc,
10778        outputs: OUTPUTS_ADJUSTABLE_MA_ALTERNATING_EXTREMITIES,
10779        params: PARAM_ADJUSTABLE_MA_ALTERNATING_EXTREMITIES,
10780    },
10781    SupplementalIndicatorSeed {
10782        id: "supertrend_recovery",
10783        label: "SuperTrend Recovery",
10784        category: "trend",
10785        input_kind: IndicatorInputKind::Ohlc,
10786        outputs: OUTPUTS_SUPERTREND_RECOVERY,
10787        params: PARAM_SUPERTREND_RECOVERY,
10788    },
10789    SupplementalIndicatorSeed {
10790        id: "keltner",
10791        label: "Keltner",
10792        category: "volatility",
10793        input_kind: IndicatorInputKind::Ohlc,
10794        outputs: OUTPUTS_BOLLINGER,
10795        params: PARAM_KELTNER,
10796    },
10797    SupplementalIndicatorSeed {
10798        id: "aroon",
10799        label: "Aroon",
10800        category: "trend",
10801        input_kind: IndicatorInputKind::HighLow,
10802        outputs: OUTPUTS_UP_DOWN,
10803        params: PARAM_AROON,
10804    },
10805    SupplementalIndicatorSeed {
10806        id: "aroonosc",
10807        label: "Aroon Oscillator",
10808        category: "momentum",
10809        input_kind: IndicatorInputKind::HighLow,
10810        outputs: OUTPUTS_VALUE_F64,
10811        params: PARAM_AROON,
10812    },
10813    SupplementalIndicatorSeed {
10814        id: "srsi",
10815        label: "Stochastic RSI",
10816        category: "momentum",
10817        input_kind: IndicatorInputKind::Slice,
10818        outputs: OUTPUTS_STOCH,
10819        params: PARAM_SRSI,
10820    },
10821    SupplementalIndicatorSeed {
10822        id: "stochastic_connors_rsi",
10823        label: "Stochastic Connors RSI",
10824        category: "momentum",
10825        input_kind: IndicatorInputKind::Slice,
10826        outputs: OUTPUTS_STOCH,
10827        params: PARAM_STOCHASTIC_CONNORS_RSI,
10828    },
10829    SupplementalIndicatorSeed {
10830        id: "kdj",
10831        label: "KDJ",
10832        category: "momentum",
10833        input_kind: IndicatorInputKind::Ohlc,
10834        outputs: OUTPUTS_KDJ,
10835        params: PARAM_KDJ,
10836    },
10837    SupplementalIndicatorSeed {
10838        id: "squeeze_momentum",
10839        label: "Squeeze Momentum",
10840        category: "momentum",
10841        input_kind: IndicatorInputKind::Ohlc,
10842        outputs: OUTPUTS_SQUEEZE_MOMENTUM,
10843        params: PARAM_SQUEEZE_MOMENTUM,
10844    },
10845    SupplementalIndicatorSeed {
10846        id: "wavetrend",
10847        label: "WaveTrend",
10848        category: "momentum",
10849        input_kind: IndicatorInputKind::Slice,
10850        outputs: OUTPUTS_WAVETREND,
10851        params: PARAM_WAVETREND,
10852    },
10853    SupplementalIndicatorSeed {
10854        id: "wto",
10855        label: "WTO",
10856        category: "momentum",
10857        input_kind: IndicatorInputKind::Slice,
10858        outputs: OUTPUTS_WTO,
10859        params: PARAM_WTO,
10860    },
10861    SupplementalIndicatorSeed {
10862        id: "accumulation_swing_index",
10863        label: "Accumulation Swing Index",
10864        category: "volatility",
10865        input_kind: IndicatorInputKind::Ohlc,
10866        outputs: OUTPUTS_VALUE_F64,
10867        params: PARAM_ACCUMULATION_SWING_INDEX,
10868    },
10869    SupplementalIndicatorSeed {
10870        id: "daily_factor",
10871        label: "Daily Factor",
10872        category: "momentum",
10873        input_kind: IndicatorInputKind::Ohlc,
10874        outputs: OUTPUTS_DAILY_FACTOR,
10875        params: PARAM_DAILY_FACTOR,
10876    },
10877    SupplementalIndicatorSeed {
10878        id: "moving_average_cross_probability",
10879        label: "Moving Average Cross Probability",
10880        category: "momentum",
10881        input_kind: IndicatorInputKind::Candles,
10882        outputs: OUTPUTS_MOVING_AVERAGE_CROSS_PROBABILITY,
10883        params: PARAM_MOVING_AVERAGE_CROSS_PROBABILITY,
10884    },
10885    SupplementalIndicatorSeed {
10886        id: "bulls_v_bears",
10887        label: "Bulls v Bears",
10888        category: "momentum",
10889        input_kind: IndicatorInputKind::Ohlc,
10890        outputs: OUTPUTS_BULLS_V_BEARS,
10891        params: PARAM_BULLS_V_BEARS,
10892    },
10893    SupplementalIndicatorSeed {
10894        id: "regression_slope_oscillator",
10895        label: "Regression Slope Oscillator",
10896        category: "momentum",
10897        input_kind: IndicatorInputKind::Candles,
10898        outputs: OUTPUTS_REGRESSION_SLOPE_OSCILLATOR,
10899        params: PARAM_REGRESSION_SLOPE_OSCILLATOR,
10900    },
10901    SupplementalIndicatorSeed {
10902        id: "smooth_theil_sen",
10903        label: "Smooth Theil-Sen",
10904        category: "trend",
10905        input_kind: IndicatorInputKind::Candles,
10906        outputs: OUTPUTS_SMOOTH_THEIL_SEN,
10907        params: PARAM_SMOOTH_THEIL_SEN,
10908    },
10909    SupplementalIndicatorSeed {
10910        id: "l2_ehlers_signal_to_noise",
10911        label: "L2 Ehlers Signal to Noise",
10912        category: "cycle",
10913        input_kind: IndicatorInputKind::Candles,
10914        outputs: OUTPUTS_VALUE_F64,
10915        params: PARAM_L2_EHLERS_SIGNAL_TO_NOISE,
10916    },
10917    SupplementalIndicatorSeed {
10918        id: "ehlers_smoothed_adaptive_momentum",
10919        label: "Ehlers Smoothed Adaptive Momentum",
10920        category: "cycle",
10921        input_kind: IndicatorInputKind::Candles,
10922        outputs: OUTPUTS_VALUE_F64,
10923        params: PARAM_EHLERS_SMOOTHED_ADAPTIVE_MOMENTUM,
10924    },
10925    SupplementalIndicatorSeed {
10926        id: "ehlers_adaptive_cyber_cycle",
10927        label: "Ehlers Adaptive Cyber Cycle",
10928        category: "cycle",
10929        input_kind: IndicatorInputKind::Candles,
10930        outputs: OUTPUTS_EHLERS_SIMPLE_CYCLE_INDICATOR,
10931        params: PARAM_EHLERS_ADAPTIVE_CYBER_CYCLE,
10932    },
10933    SupplementalIndicatorSeed {
10934        id: "ehlers_simple_cycle_indicator",
10935        label: "Ehlers Simple Cycle Indicator",
10936        category: "cycle",
10937        input_kind: IndicatorInputKind::Candles,
10938        outputs: OUTPUTS_EHLERS_SIMPLE_CYCLE_INDICATOR,
10939        params: PARAM_EHLERS_SIMPLE_CYCLE_INDICATOR,
10940    },
10941    SupplementalIndicatorSeed {
10942        id: "l1_ehlers_phasor",
10943        label: "L1 Ehlers Phasor",
10944        category: "cycle",
10945        input_kind: IndicatorInputKind::Candles,
10946        outputs: OUTPUTS_VALUE_F64,
10947        params: PARAM_L1_EHLERS_PHASOR,
10948    },
10949    SupplementalIndicatorSeed {
10950        id: "andean_oscillator",
10951        label: "Andean Oscillator",
10952        category: "trend",
10953        input_kind: IndicatorInputKind::Candles,
10954        outputs: OUTPUTS_ANDEAN_OSCILLATOR,
10955        params: PARAM_ANDEAN_OSCILLATOR,
10956    },
10957    SupplementalIndicatorSeed {
10958        id: "cycle_channel_oscillator",
10959        label: "Cycle Channel Oscillator",
10960        category: "cycle",
10961        input_kind: IndicatorInputKind::Candles,
10962        outputs: OUTPUTS_CYCLE_CHANNEL_OSCILLATOR,
10963        params: PARAM_CYCLE_CHANNEL_OSCILLATOR,
10964    },
10965    SupplementalIndicatorSeed {
10966        id: "ewma_volatility",
10967        label: "EWMA Volatility",
10968        category: "volatility",
10969        input_kind: IndicatorInputKind::Slice,
10970        outputs: OUTPUTS_VALUE_F64,
10971        params: PARAM_EWMA_VOLATILITY,
10972    },
10973    SupplementalIndicatorSeed {
10974        id: "ichimoku_oscillator",
10975        label: "Ichimoku Oscillator",
10976        category: "trend",
10977        input_kind: IndicatorInputKind::Candles,
10978        outputs: OUTPUTS_ICHIMOKU_OSCILLATOR,
10979        params: PARAM_ICHIMOKU_OSCILLATOR,
10980    },
10981    SupplementalIndicatorSeed {
10982        id: "random_walk_index",
10983        label: "Random Walk Index",
10984        category: "volatility",
10985        input_kind: IndicatorInputKind::Ohlc,
10986        outputs: OUTPUTS_RANDOM_WALK_INDEX,
10987        params: PARAM_RANDOM_WALK_INDEX,
10988    },
10989    SupplementalIndicatorSeed {
10990        id: "price_moving_average_ratio_percentile",
10991        label: "Price Moving Average Ratio & Percentile",
10992        category: "momentum",
10993        input_kind: IndicatorInputKind::Candles,
10994        outputs: OUTPUTS_PRICE_MOVING_AVERAGE_RATIO_PERCENTILE,
10995        params: PARAM_PRICE_MOVING_AVERAGE_RATIO_PERCENTILE,
10996    },
10997    SupplementalIndicatorSeed {
10998        id: "relative_strength_index_wave_indicator",
10999        label: "Relative Strength Index Wave Indicator",
11000        category: "momentum",
11001        input_kind: IndicatorInputKind::Candles,
11002        outputs: OUTPUTS_RELATIVE_STRENGTH_INDEX_WAVE_INDICATOR,
11003        params: PARAM_RELATIVE_STRENGTH_INDEX_WAVE_INDICATOR,
11004    },
11005    SupplementalIndicatorSeed {
11006        id: "mesa_stochastic_multi_length",
11007        label: "MESA Stochastic Multi Length",
11008        category: "momentum",
11009        input_kind: IndicatorInputKind::Candles,
11010        outputs: OUTPUTS_MESA_STOCHASTIC_MULTI_LENGTH,
11011        params: PARAM_MESA_STOCHASTIC_MULTI_LENGTH,
11012    },
11013    SupplementalIndicatorSeed {
11014        id: "spearman_correlation",
11015        label: "Spearman Correlation",
11016        category: "relative_strength",
11017        input_kind: IndicatorInputKind::Candles,
11018        outputs: OUTPUTS_SPEARMAN_CORRELATION,
11019        params: PARAM_SPEARMAN_CORRELATION,
11020    },
11021    SupplementalIndicatorSeed {
11022        id: "trend_trigger_factor",
11023        label: "Trend Trigger Factor",
11024        category: "momentum",
11025        input_kind: IndicatorInputKind::HighLow,
11026        outputs: OUTPUTS_VALUE_F64,
11027        params: PARAM_TREND_TRIGGER_FACTOR,
11028    },
11029    SupplementalIndicatorSeed {
11030        id: "volatility_quality_index",
11031        label: "Volatility Quality Index",
11032        category: "volatility",
11033        input_kind: IndicatorInputKind::Ohlc,
11034        outputs: OUTPUTS_VOLATILITY_QUALITY_INDEX,
11035        params: PARAM_VOLATILITY_QUALITY_INDEX,
11036    },
11037    SupplementalIndicatorSeed {
11038        id: "yang_zhang_volatility",
11039        label: "Yang-Zhang Volatility",
11040        category: "volatility",
11041        input_kind: IndicatorInputKind::Ohlc,
11042        outputs: OUTPUTS_YANG_ZHANG,
11043        params: PARAM_YANG_ZHANG,
11044    },
11045    SupplementalIndicatorSeed {
11046        id: "garman_klass_volatility",
11047        label: "Garman-Klass Volatility",
11048        category: "volatility",
11049        input_kind: IndicatorInputKind::Ohlc,
11050        outputs: OUTPUTS_VALUE_F64,
11051        params: PARAM_GARMAN_KLASS,
11052    },
11053    SupplementalIndicatorSeed {
11054        id: "atr_percentile",
11055        label: "ATR Percentile",
11056        category: "volatility",
11057        input_kind: IndicatorInputKind::Ohlc,
11058        outputs: OUTPUTS_VALUE_F64,
11059        params: PARAM_ATR_PERCENTILE,
11060    },
11061    SupplementalIndicatorSeed {
11062        id: "advance_decline_line",
11063        label: "Advance-Decline Line",
11064        category: "breadth",
11065        input_kind: IndicatorInputKind::Slice,
11066        outputs: OUTPUTS_VALUE_F64,
11067        params: PARAM_NONE,
11068    },
11069    SupplementalIndicatorSeed {
11070        id: "decisionpoint_breadth_swenlin_trading_oscillator",
11071        label: "DecisionPoint Breadth Swenlin Trading Oscillator",
11072        category: "breadth",
11073        input_kind: IndicatorInputKind::HighLow,
11074        outputs: OUTPUTS_VALUE_F64,
11075        params: PARAM_NONE,
11076    },
11077    SupplementalIndicatorSeed {
11078        id: "velocity_acceleration_indicator",
11079        label: "Velocity Acceleration Indicator",
11080        category: "momentum",
11081        input_kind: IndicatorInputKind::Candles,
11082        outputs: OUTPUTS_VALUE_F64,
11083        params: PARAM_VELOCITY_ACCELERATION_INDICATOR,
11084    },
11085    SupplementalIndicatorSeed {
11086        id: "normalized_resonator",
11087        label: "Normalized Resonator",
11088        category: "cycle",
11089        input_kind: IndicatorInputKind::Candles,
11090        outputs: OUTPUTS_OSCILLATOR_SIGNAL,
11091        params: PARAM_NORMALIZED_RESONATOR,
11092    },
11093    SupplementalIndicatorSeed {
11094        id: "monotonicity_index",
11095        label: "Monotonicity Index",
11096        category: "statistics",
11097        input_kind: IndicatorInputKind::Candles,
11098        outputs: OUTPUTS_MONOTONICITY_INDEX,
11099        params: PARAM_MONOTONICITY_INDEX,
11100    },
11101    SupplementalIndicatorSeed {
11102        id: "half_causal_estimator",
11103        label: "Half Causal Estimator",
11104        category: "statistics",
11105        input_kind: IndicatorInputKind::Candles,
11106        outputs: OUTPUTS_HALF_CAUSAL_ESTIMATOR,
11107        params: PARAM_HALF_CAUSAL_ESTIMATOR,
11108    },
11109    SupplementalIndicatorSeed {
11110        id: "bull_power_vs_bear_power",
11111        label: "Bull Power vs Bear Power",
11112        category: "momentum",
11113        input_kind: IndicatorInputKind::Ohlc,
11114        outputs: OUTPUTS_VALUE_F64,
11115        params: PARAM_BULL_POWER_VS_BEAR_POWER,
11116    },
11117    SupplementalIndicatorSeed {
11118        id: "historical_volatility",
11119        label: "Historical Volatility",
11120        category: "volatility",
11121        input_kind: IndicatorInputKind::Slice,
11122        outputs: OUTPUTS_VALUE_F64,
11123        params: PARAM_HISTORICAL_VOLATILITY,
11124    },
11125    SupplementalIndicatorSeed {
11126        id: "absolute_strength_index_oscillator",
11127        label: "Absolute Strength Index Oscillator",
11128        category: "momentum",
11129        input_kind: IndicatorInputKind::Slice,
11130        outputs: OUTPUTS_OSCILLATOR_SIGNAL_HISTOGRAM,
11131        params: PARAM_ABSOLUTE_STRENGTH_INDEX_OSCILLATOR,
11132    },
11133    SupplementalIndicatorSeed {
11134        id: "adaptive_bandpass_trigger_oscillator",
11135        label: "Adaptive Bandpass Trigger Oscillator",
11136        category: "cycle",
11137        input_kind: IndicatorInputKind::Slice,
11138        outputs: OUTPUTS_IN_PHASE_LEAD,
11139        params: PARAM_ADAPTIVE_BANDPASS_TRIGGER_OSCILLATOR,
11140    },
11141    SupplementalIndicatorSeed {
11142        id: "premier_rsi_oscillator",
11143        label: "Premier RSI Oscillator",
11144        category: "momentum",
11145        input_kind: IndicatorInputKind::Slice,
11146        outputs: OUTPUTS_VALUE_F64,
11147        params: PARAM_PREMIER_RSI_OSCILLATOR,
11148    },
11149    SupplementalIndicatorSeed {
11150        id: "multi_length_stochastic_average",
11151        label: "Multi-Length Stochastic Average",
11152        category: "momentum",
11153        input_kind: IndicatorInputKind::Candles,
11154        outputs: OUTPUTS_VALUE_F64,
11155        params: PARAM_MULTI_LENGTH_STOCHASTIC_AVERAGE,
11156    },
11157    SupplementalIndicatorSeed {
11158        id: "hull_butterfly_oscillator",
11159        label: "Hull Butterfly Oscillator",
11160        category: "momentum",
11161        input_kind: IndicatorInputKind::Candles,
11162        outputs: OUTPUTS_HULL_BUTTERFLY_OSCILLATOR,
11163        params: PARAM_HULL_BUTTERFLY_OSCILLATOR,
11164    },
11165    SupplementalIndicatorSeed {
11166        id: "fibonacci_trailing_stop",
11167        label: "Fibonacci Trailing Stop",
11168        category: "trend",
11169        input_kind: IndicatorInputKind::Ohlc,
11170        outputs: OUTPUTS_FIBONACCI_TRAILING_STOP,
11171        params: PARAM_FIBONACCI_TRAILING_STOP,
11172    },
11173    SupplementalIndicatorSeed {
11174        id: "fibonacci_entry_bands",
11175        label: "Fibonacci Entry Bands",
11176        category: "trend",
11177        input_kind: IndicatorInputKind::Ohlc,
11178        outputs: OUTPUTS_FIBONACCI_ENTRY_BANDS,
11179        params: PARAM_FIBONACCI_ENTRY_BANDS,
11180    },
11181    SupplementalIndicatorSeed {
11182        id: "volume_energy_reservoirs",
11183        label: "Volume Energy Reservoirs",
11184        category: "volume",
11185        input_kind: IndicatorInputKind::Ohlcv,
11186        outputs: OUTPUTS_VOLUME_ENERGY_RESERVOIRS,
11187        params: PARAM_VOLUME_ENERGY_RESERVOIRS,
11188    },
11189    SupplementalIndicatorSeed {
11190        id: "neighboring_trailing_stop",
11191        label: "Neighboring Trailing Stop",
11192        category: "trend",
11193        input_kind: IndicatorInputKind::Ohlc,
11194        outputs: OUTPUTS_NEIGHBORING_TRAILING_STOP,
11195        params: PARAM_NEIGHBORING_TRAILING_STOP,
11196    },
11197    SupplementalIndicatorSeed {
11198        id: "macd_wave_signal_pro",
11199        label: "MACD Wave Signal Pro",
11200        category: "momentum",
11201        input_kind: IndicatorInputKind::Ohlc,
11202        outputs: OUTPUTS_MACD_WAVE_SIGNAL_PRO,
11203        params: PARAM_NONE,
11204    },
11205    SupplementalIndicatorSeed {
11206        id: "hema_trend_levels",
11207        label: "HEMA Trend Levels",
11208        category: "trend",
11209        input_kind: IndicatorInputKind::Ohlc,
11210        outputs: OUTPUTS_HEMA_TREND_LEVELS,
11211        params: PARAM_HEMA_TREND_LEVELS,
11212    },
11213    SupplementalIndicatorSeed {
11214        id: "grover_llorens_cycle_oscillator",
11215        label: "Grover Llorens Cycle Oscillator",
11216        category: "cycle",
11217        input_kind: IndicatorInputKind::Ohlc,
11218        outputs: OUTPUTS_VALUE_F64,
11219        params: PARAM_GROVER_LLORENS_CYCLE_OSCILLATOR,
11220    },
11221    SupplementalIndicatorSeed {
11222        id: "squeeze_index",
11223        label: "Squeeze Index",
11224        category: "volatility",
11225        input_kind: IndicatorInputKind::Slice,
11226        outputs: OUTPUTS_VALUE_F64,
11227        params: PARAM_SQUEEZE_INDEX,
11228    },
11229    SupplementalIndicatorSeed {
11230        id: "stochastic_distance",
11231        label: "Stochastic Distance",
11232        category: "momentum",
11233        input_kind: IndicatorInputKind::Slice,
11234        outputs: OUTPUTS_OSCILLATOR_SIGNAL,
11235        params: PARAM_STOCHASTIC_DISTANCE,
11236    },
11237    SupplementalIndicatorSeed {
11238        id: "vertical_horizontal_filter",
11239        label: "Vertical Horizontal Filter",
11240        category: "trend",
11241        input_kind: IndicatorInputKind::Slice,
11242        outputs: OUTPUTS_VALUE_F64,
11243        params: PARAM_VERTICAL_HORIZONTAL_FILTER,
11244    },
11245    SupplementalIndicatorSeed {
11246        id: "intraday_momentum_index",
11247        label: "Intraday Momentum Index",
11248        category: "momentum",
11249        input_kind: IndicatorInputKind::Ohlc,
11250        outputs: &[
11251            OUTPUT_IMI,
11252            OUTPUT_UPPER_HIT,
11253            OUTPUT_LOWER_HIT,
11254            OUTPUT_SIGNAL,
11255        ],
11256        params: PARAM_INTRADAY_MOMENTUM_INDEX,
11257    },
11258    SupplementalIndicatorSeed {
11259        id: "vwap_zscore_with_signals",
11260        label: "VWAP Z-Score With Signals",
11261        category: "volume",
11262        input_kind: IndicatorInputKind::CloseVolume,
11263        outputs: &[
11264            OUTPUT_ZVWAP,
11265            OUTPUT_SUPPORT_SIGNAL,
11266            OUTPUT_RESISTANCE_SIGNAL,
11267        ],
11268        params: PARAM_VWAP_ZSCORE_WITH_SIGNALS,
11269    },
11270    SupplementalIndicatorSeed {
11271        id: "demand_index",
11272        label: "Demand Index",
11273        category: "volume",
11274        input_kind: IndicatorInputKind::Ohlcv,
11275        outputs: &[OUTPUT_DEMAND_INDEX, OUTPUT_SIGNAL],
11276        params: PARAM_DEMAND_INDEX,
11277    },
11278    SupplementalIndicatorSeed {
11279        id: "didi_index",
11280        label: "Didi Index",
11281        category: "momentum",
11282        input_kind: IndicatorInputKind::Slice,
11283        outputs: &[
11284            OUTPUT_SHORT,
11285            OUTPUT_LONG,
11286            OUTPUT_CROSSOVER,
11287            OUTPUT_CROSSUNDER,
11288        ],
11289        params: PARAM_DIDI_INDEX,
11290    },
11291    SupplementalIndicatorSeed {
11292        id: "ehlers_autocorrelation_periodogram",
11293        label: "Ehlers Autocorrelation Periodogram",
11294        category: "cycle",
11295        input_kind: IndicatorInputKind::Slice,
11296        outputs: &[OUTPUT_DOMINANT_CYCLE, OUTPUT_NORMALIZED_POWER],
11297        params: PARAM_EHLERS_AUTOCORRELATION_PERIODOGRAM,
11298    },
11299    SupplementalIndicatorSeed {
11300        id: "ehlers_linear_extrapolation_predictor",
11301        label: "Ehlers Linear Extrapolation Predictor",
11302        category: "cycle",
11303        input_kind: IndicatorInputKind::Slice,
11304        outputs: &[
11305            OUTPUT_PREDICTION,
11306            OUTPUT_FILTER,
11307            OUTPUT_STATE,
11308            OUTPUT_GO_LONG,
11309            OUTPUT_GO_SHORT,
11310        ],
11311        params: PARAM_EHLERS_LINEAR_EXTRAPOLATION_PREDICTOR,
11312    },
11313    SupplementalIndicatorSeed {
11314        id: "kase_peak_oscillator_with_divergences",
11315        label: "Kase Peak Oscillator With Divergences",
11316        category: "momentum",
11317        input_kind: IndicatorInputKind::Ohlc,
11318        outputs: &[
11319            OUTPUT_OSCILLATOR,
11320            OUTPUT_HIST,
11321            OUTPUT_MAX_PEAK_VALUE,
11322            OUTPUT_MIN_PEAK_VALUE,
11323            OUTPUT_MARKET_EXTREME,
11324            OUTPUT_REGULAR_BULLISH,
11325            OUTPUT_HIDDEN_BULLISH,
11326            OUTPUT_REGULAR_BEARISH,
11327            OUTPUT_HIDDEN_BEARISH,
11328            OUTPUT_GO_LONG,
11329            OUTPUT_GO_SHORT,
11330        ],
11331        params: PARAM_KASE_PEAK_OSCILLATOR_WITH_DIVERGENCES,
11332    },
11333    SupplementalIndicatorSeed {
11334        id: "gopalakrishnan_range_index",
11335        label: "Gopalakrishnan Range Index",
11336        category: "volatility",
11337        input_kind: IndicatorInputKind::HighLow,
11338        outputs: OUTPUTS_VALUE_F64,
11339        params: PARAM_GOPALAKRISHNAN_RANGE_INDEX,
11340    },
11341    SupplementalIndicatorSeed {
11342        id: "atr",
11343        label: "ATR",
11344        category: "volatility",
11345        input_kind: IndicatorInputKind::Ohlc,
11346        outputs: OUTPUTS_VALUE_F64,
11347        params: PARAM_ATR_PERIOD,
11348    },
11349    SupplementalIndicatorSeed {
11350        id: "ad",
11351        label: "AD",
11352        category: "volume",
11353        input_kind: IndicatorInputKind::Ohlcv,
11354        outputs: OUTPUTS_VALUE_F64,
11355        params: PARAM_NONE,
11356    },
11357    SupplementalIndicatorSeed {
11358        id: "adosc",
11359        label: "ADOSC",
11360        category: "volume",
11361        input_kind: IndicatorInputKind::Ohlcv,
11362        outputs: OUTPUTS_VALUE_F64,
11363        params: PARAM_ADOSC,
11364    },
11365    SupplementalIndicatorSeed {
11366        id: "ao",
11367        label: "AO",
11368        category: "momentum",
11369        input_kind: IndicatorInputKind::HighLow,
11370        outputs: OUTPUTS_VALUE_F64,
11371        params: PARAM_AO,
11372    },
11373    SupplementalIndicatorSeed {
11374        id: "bop",
11375        label: "BOP",
11376        category: "momentum",
11377        input_kind: IndicatorInputKind::Ohlc,
11378        outputs: OUTPUTS_VALUE_F64,
11379        params: PARAM_NONE,
11380    },
11381    SupplementalIndicatorSeed {
11382        id: "emv",
11383        label: "EMV",
11384        category: "volume",
11385        input_kind: IndicatorInputKind::Ohlcv,
11386        outputs: OUTPUTS_VALUE_F64,
11387        params: PARAM_NONE,
11388    },
11389    SupplementalIndicatorSeed {
11390        id: "efi",
11391        label: "EFI",
11392        category: "volume",
11393        input_kind: IndicatorInputKind::CloseVolume,
11394        outputs: OUTPUTS_VALUE_F64,
11395        params: PARAM_EFI_PERIOD,
11396    },
11397    SupplementalIndicatorSeed {
11398        id: "dti",
11399        label: "DTI",
11400        category: "momentum",
11401        input_kind: IndicatorInputKind::HighLow,
11402        outputs: OUTPUTS_VALUE_F64,
11403        params: PARAM_DTI,
11404    },
11405    SupplementalIndicatorSeed {
11406        id: "mfi",
11407        label: "MFI",
11408        category: "volume",
11409        input_kind: IndicatorInputKind::CloseVolume,
11410        outputs: OUTPUTS_VALUE_F64,
11411        params: PARAM_MFI_PERIOD,
11412    },
11413    SupplementalIndicatorSeed {
11414        id: "volume_weighted_rsi",
11415        label: "Volume Weighted RSI",
11416        category: "volume",
11417        input_kind: IndicatorInputKind::CloseVolume,
11418        outputs: OUTPUTS_VALUE_F64,
11419        params: PARAM_RSI_PERIOD,
11420    },
11421    SupplementalIndicatorSeed {
11422        id: "mass",
11423        label: "MASS",
11424        category: "volatility",
11425        input_kind: IndicatorInputKind::HighLow,
11426        outputs: OUTPUTS_VALUE_F64,
11427        params: PARAM_MASS_PERIOD,
11428    },
11429    SupplementalIndicatorSeed {
11430        id: "kvo",
11431        label: "KVO",
11432        category: "volume",
11433        input_kind: IndicatorInputKind::Ohlcv,
11434        outputs: OUTPUTS_VALUE_F64,
11435        params: PARAM_KVO,
11436    },
11437    SupplementalIndicatorSeed {
11438        id: "vosc",
11439        label: "VOSC",
11440        category: "volume",
11441        input_kind: IndicatorInputKind::Slice,
11442        outputs: OUTPUTS_VALUE_F64,
11443        params: PARAM_VOSC,
11444    },
11445    SupplementalIndicatorSeed {
11446        id: "rsi",
11447        label: "RSI",
11448        category: "momentum",
11449        input_kind: IndicatorInputKind::Slice,
11450        outputs: OUTPUTS_VALUE_F64,
11451        params: PARAM_RSI_PERIOD,
11452    },
11453    SupplementalIndicatorSeed {
11454        id: "rsx",
11455        label: "RSX",
11456        category: "momentum",
11457        input_kind: IndicatorInputKind::Slice,
11458        outputs: OUTPUTS_VALUE_F64,
11459        params: PARAM_RSI_PERIOD,
11460    },
11461    SupplementalIndicatorSeed {
11462        id: "roc",
11463        label: "ROC",
11464        category: "momentum",
11465        input_kind: IndicatorInputKind::Slice,
11466        outputs: OUTPUTS_VALUE_F64,
11467        params: PARAM_ROC_PERIOD,
11468    },
11469    SupplementalIndicatorSeed {
11470        id: "linear_correlation_oscillator",
11471        label: "Linear Correlation Oscillator",
11472        category: "momentum",
11473        input_kind: IndicatorInputKind::Slice,
11474        outputs: OUTPUTS_VALUE_F64,
11475        params: PARAM_LINEAR_CORRELATION_OSCILLATOR_PERIOD,
11476    },
11477    SupplementalIndicatorSeed {
11478        id: "ehlers_fm_demodulator",
11479        label: "Ehlers FM Demodulator",
11480        category: "momentum",
11481        input_kind: IndicatorInputKind::Ohlc,
11482        outputs: OUTPUTS_VALUE_F64,
11483        params: PARAM_EHLERS_FM_DEMODULATOR_PERIOD,
11484    },
11485    SupplementalIndicatorSeed {
11486        id: "ehlers_adaptive_cg",
11487        label: "Ehlers Adaptive CG",
11488        category: "momentum",
11489        input_kind: IndicatorInputKind::Slice,
11490        outputs: OUTPUTS_EHLERS_ADAPTIVE_CG,
11491        params: PARAM_EHLERS_ADAPTIVE_CG,
11492    },
11493    SupplementalIndicatorSeed {
11494        id: "adaptive_momentum_oscillator",
11495        label: "Adaptive Momentum Oscillator",
11496        category: "momentum",
11497        input_kind: IndicatorInputKind::Slice,
11498        outputs: OUTPUTS_ADAPTIVE_MOMENTUM_OSCILLATOR,
11499        params: PARAM_ADAPTIVE_MOMENTUM_OSCILLATOR,
11500    },
11501    SupplementalIndicatorSeed {
11502        id: "velocity",
11503        label: "Velocity",
11504        category: "momentum",
11505        input_kind: IndicatorInputKind::Slice,
11506        outputs: OUTPUTS_VALUE_F64,
11507        params: PARAM_VELOCITY,
11508    },
11509    SupplementalIndicatorSeed {
11510        id: "normalized_volume_true_range",
11511        label: "Normalized Volume True Range",
11512        category: "volume",
11513        input_kind: IndicatorInputKind::Ohlcv,
11514        outputs: OUTPUTS_NORMALIZED_VOLUME_TRUE_RANGE,
11515        params: PARAM_NORMALIZED_VOLUME_TRUE_RANGE,
11516    },
11517    SupplementalIndicatorSeed {
11518        id: "exponential_trend",
11519        label: "Exponential Trend",
11520        category: "trend",
11521        input_kind: IndicatorInputKind::Ohlc,
11522        outputs: OUTPUTS_EXPONENTIAL_TREND,
11523        params: PARAM_EXPONENTIAL_TREND,
11524    },
11525    SupplementalIndicatorSeed {
11526        id: "trend_flow_trail",
11527        label: "Trend Flow Trail",
11528        category: "trend",
11529        input_kind: IndicatorInputKind::Ohlcv,
11530        outputs: OUTPUTS_TREND_FLOW_TRAIL,
11531        params: PARAM_TREND_FLOW_TRAIL,
11532    },
11533    SupplementalIndicatorSeed {
11534        id: "range_breakout_signals",
11535        label: "Range Breakout Signals",
11536        category: "trend",
11537        input_kind: IndicatorInputKind::Ohlcv,
11538        outputs: OUTPUTS_RANGE_BREAKOUT_SIGNALS,
11539        params: PARAM_RANGE_BREAKOUT_SIGNALS,
11540    },
11541    SupplementalIndicatorSeed {
11542        id: "apo",
11543        label: "APO",
11544        category: "momentum",
11545        input_kind: IndicatorInputKind::Slice,
11546        outputs: OUTPUTS_VALUE_F64,
11547        params: PARAM_APO,
11548    },
11549    SupplementalIndicatorSeed {
11550        id: "cci",
11551        label: "CCI",
11552        category: "momentum",
11553        input_kind: IndicatorInputKind::Slice,
11554        outputs: OUTPUTS_VALUE_F64,
11555        params: PARAM_CCI_PERIOD,
11556    },
11557    SupplementalIndicatorSeed {
11558        id: "cci_cycle",
11559        label: "CCI Cycle",
11560        category: "momentum",
11561        input_kind: IndicatorInputKind::Slice,
11562        outputs: OUTPUTS_VALUE_F64,
11563        params: PARAM_CCI_CYCLE,
11564    },
11565    SupplementalIndicatorSeed {
11566        id: "cfo",
11567        label: "CFO",
11568        category: "momentum",
11569        input_kind: IndicatorInputKind::Slice,
11570        outputs: OUTPUTS_VALUE_F64,
11571        params: PARAM_CFO,
11572    },
11573    SupplementalIndicatorSeed {
11574        id: "cg",
11575        label: "CG",
11576        category: "momentum",
11577        input_kind: IndicatorInputKind::Slice,
11578        outputs: OUTPUTS_VALUE_F64,
11579        params: PARAM_CG_PERIOD,
11580    },
11581    SupplementalIndicatorSeed {
11582        id: "er",
11583        label: "ER",
11584        category: "momentum",
11585        input_kind: IndicatorInputKind::Slice,
11586        outputs: OUTPUTS_VALUE_F64,
11587        params: PARAM_ER_PERIOD,
11588    },
11589    SupplementalIndicatorSeed {
11590        id: "kurtosis",
11591        label: "Kurtosis",
11592        category: "statistics",
11593        input_kind: IndicatorInputKind::Slice,
11594        outputs: OUTPUTS_VALUE_F64,
11595        params: PARAM_KURTOSIS_PERIOD,
11596    },
11597    SupplementalIndicatorSeed {
11598        id: "natr",
11599        label: "NATR",
11600        category: "volatility",
11601        input_kind: IndicatorInputKind::Ohlc,
11602        outputs: OUTPUTS_VALUE_F64,
11603        params: PARAM_NATR_PERIOD,
11604    },
11605    SupplementalIndicatorSeed {
11606        id: "mean_ad",
11607        label: "Mean AD",
11608        category: "statistics",
11609        input_kind: IndicatorInputKind::Slice,
11610        outputs: OUTPUTS_VALUE_F64,
11611        params: PARAM_MEAN_AD_PERIOD,
11612    },
11613    SupplementalIndicatorSeed {
11614        id: "medium_ad",
11615        label: "Medium AD",
11616        category: "statistics",
11617        input_kind: IndicatorInputKind::Slice,
11618        outputs: OUTPUTS_VALUE_F64,
11619        params: PARAM_MEDIUM_AD_PERIOD,
11620    },
11621    SupplementalIndicatorSeed {
11622        id: "deviation",
11623        label: "Deviation",
11624        category: "statistics",
11625        input_kind: IndicatorInputKind::Slice,
11626        outputs: OUTPUTS_VALUE_F64,
11627        params: PARAM_DEVIATION,
11628    },
11629    SupplementalIndicatorSeed {
11630        id: "dpo",
11631        label: "DPO",
11632        category: "trend",
11633        input_kind: IndicatorInputKind::Slice,
11634        outputs: OUTPUTS_VALUE_F64,
11635        params: PARAM_DPO_PERIOD,
11636    },
11637    SupplementalIndicatorSeed {
11638        id: "fosc",
11639        label: "FOSC",
11640        category: "momentum",
11641        input_kind: IndicatorInputKind::Slice,
11642        outputs: OUTPUTS_VALUE_F64,
11643        params: PARAM_FOSC_PERIOD,
11644    },
11645    SupplementalIndicatorSeed {
11646        id: "ift_rsi",
11647        label: "IFT RSI",
11648        category: "momentum",
11649        input_kind: IndicatorInputKind::Slice,
11650        outputs: OUTPUTS_VALUE_F64,
11651        params: PARAM_IFT_RSI,
11652    },
11653    SupplementalIndicatorSeed {
11654        id: "linearreg_angle",
11655        label: "Linear Regression Angle",
11656        category: "trend",
11657        input_kind: IndicatorInputKind::Slice,
11658        outputs: OUTPUTS_VALUE_F64,
11659        params: PARAM_LINEARREG_ANGLE_PERIOD,
11660    },
11661    SupplementalIndicatorSeed {
11662        id: "linearreg_intercept",
11663        label: "Linear Regression Intercept",
11664        category: "trend",
11665        input_kind: IndicatorInputKind::Slice,
11666        outputs: OUTPUTS_VALUE_F64,
11667        params: PARAM_LINEARREG_INTERCEPT_PERIOD,
11668    },
11669    SupplementalIndicatorSeed {
11670        id: "linearreg_slope",
11671        label: "Linear Regression Slope",
11672        category: "trend",
11673        input_kind: IndicatorInputKind::Slice,
11674        outputs: OUTPUTS_VALUE_F64,
11675        params: PARAM_LINEARREG_SLOPE_PERIOD,
11676    },
11677    SupplementalIndicatorSeed {
11678        id: "pfe",
11679        label: "PFE",
11680        category: "trend",
11681        input_kind: IndicatorInputKind::Slice,
11682        outputs: OUTPUTS_VALUE_F64,
11683        params: PARAM_PFE,
11684    },
11685    SupplementalIndicatorSeed {
11686        id: "qstick",
11687        label: "QStick",
11688        category: "trend",
11689        input_kind: IndicatorInputKind::Ohlc,
11690        outputs: OUTPUTS_VALUE_F64,
11691        params: PARAM_QSTICK,
11692    },
11693    SupplementalIndicatorSeed {
11694        id: "reverse_rsi",
11695        label: "Reverse RSI",
11696        category: "momentum",
11697        input_kind: IndicatorInputKind::Slice,
11698        outputs: OUTPUTS_VALUE_F64,
11699        params: PARAM_REVERSE_RSI,
11700    },
11701    SupplementalIndicatorSeed {
11702        id: "percentile_nearest_rank",
11703        label: "Percentile Nearest Rank",
11704        category: "statistics",
11705        input_kind: IndicatorInputKind::Slice,
11706        outputs: OUTPUTS_VALUE_F64,
11707        params: PARAM_PERCENTILE_NEAREST_RANK,
11708    },
11709    SupplementalIndicatorSeed {
11710        id: "ui",
11711        label: "UI",
11712        category: "volatility",
11713        input_kind: IndicatorInputKind::Slice,
11714        outputs: OUTPUTS_VALUE_F64,
11715        params: PARAM_UI,
11716    },
11717    SupplementalIndicatorSeed {
11718        id: "zscore",
11719        label: "Zscore",
11720        category: "statistics",
11721        input_kind: IndicatorInputKind::Slice,
11722        outputs: OUTPUTS_VALUE_F64,
11723        params: PARAM_ZSCORE,
11724    },
11725    SupplementalIndicatorSeed {
11726        id: "medprice",
11727        label: "Medprice",
11728        category: "price",
11729        input_kind: IndicatorInputKind::HighLow,
11730        outputs: OUTPUTS_VALUE_F64,
11731        params: PARAM_NONE,
11732    },
11733    SupplementalIndicatorSeed {
11734        id: "midpoint",
11735        label: "Midpoint",
11736        category: "price",
11737        input_kind: IndicatorInputKind::Slice,
11738        outputs: OUTPUTS_VALUE_F64,
11739        params: PARAM_MIDPOINT_PERIOD,
11740    },
11741    SupplementalIndicatorSeed {
11742        id: "midprice",
11743        label: "Midprice",
11744        category: "price",
11745        input_kind: IndicatorInputKind::HighLow,
11746        outputs: OUTPUTS_VALUE_F64,
11747        params: PARAM_MIDPRICE_PERIOD,
11748    },
11749    SupplementalIndicatorSeed {
11750        id: "wclprice",
11751        label: "WCLPRICE",
11752        category: "price",
11753        input_kind: IndicatorInputKind::Ohlc,
11754        outputs: OUTPUTS_VALUE_F64,
11755        params: PARAM_NONE,
11756    },
11757    SupplementalIndicatorSeed {
11758        id: "obv",
11759        label: "OBV",
11760        category: "volume",
11761        input_kind: IndicatorInputKind::CloseVolume,
11762        outputs: OUTPUTS_VALUE_F64,
11763        params: PARAM_NONE,
11764    },
11765    SupplementalIndicatorSeed {
11766        id: "vpt",
11767        label: "VPT",
11768        category: "volume",
11769        input_kind: IndicatorInputKind::CloseVolume,
11770        outputs: OUTPUTS_VALUE_F64,
11771        params: PARAM_NONE,
11772    },
11773    SupplementalIndicatorSeed {
11774        id: "nvi",
11775        label: "NVI",
11776        category: "volume",
11777        input_kind: IndicatorInputKind::CloseVolume,
11778        outputs: OUTPUTS_VALUE_F64,
11779        params: PARAM_NONE,
11780    },
11781    SupplementalIndicatorSeed {
11782        id: "pvi",
11783        label: "PVI",
11784        category: "volume",
11785        input_kind: IndicatorInputKind::CloseVolume,
11786        outputs: OUTPUTS_VALUE_F64,
11787        params: PARAM_PVI,
11788    },
11789    SupplementalIndicatorSeed {
11790        id: "mom",
11791        label: "MOM",
11792        category: "momentum",
11793        input_kind: IndicatorInputKind::Slice,
11794        outputs: OUTPUTS_VALUE_F64,
11795        params: PARAM_MOM_PERIOD,
11796    },
11797    SupplementalIndicatorSeed {
11798        id: "cmo",
11799        label: "CMO",
11800        category: "momentum",
11801        input_kind: IndicatorInputKind::Slice,
11802        outputs: OUTPUTS_VALUE_F64,
11803        params: PARAM_CMO_PERIOD,
11804    },
11805    SupplementalIndicatorSeed {
11806        id: "dec_osc",
11807        label: "Dec Osc",
11808        category: "momentum",
11809        input_kind: IndicatorInputKind::Slice,
11810        outputs: OUTPUTS_VALUE_F64,
11811        params: PARAM_DEC_OSC,
11812    },
11813    SupplementalIndicatorSeed {
11814        id: "lrsi",
11815        label: "LRSI",
11816        category: "momentum",
11817        input_kind: IndicatorInputKind::HighLow,
11818        outputs: OUTPUTS_VALUE_F64,
11819        params: PARAM_LRSI_ALPHA,
11820    },
11821    SupplementalIndicatorSeed {
11822        id: "rocp",
11823        label: "ROCP",
11824        category: "momentum",
11825        input_kind: IndicatorInputKind::Slice,
11826        outputs: OUTPUTS_VALUE_F64,
11827        params: PARAM_ROCP_PERIOD,
11828    },
11829    SupplementalIndicatorSeed {
11830        id: "rocr",
11831        label: "ROCR",
11832        category: "momentum",
11833        input_kind: IndicatorInputKind::Slice,
11834        outputs: OUTPUTS_VALUE_F64,
11835        params: PARAM_ROCR_PERIOD,
11836    },
11837    SupplementalIndicatorSeed {
11838        id: "tsf",
11839        label: "TSF",
11840        category: "trend",
11841        input_kind: IndicatorInputKind::Slice,
11842        outputs: OUTPUTS_VALUE_F64,
11843        params: PARAM_TSF_PERIOD,
11844    },
11845    SupplementalIndicatorSeed {
11846        id: "adaptive_macd",
11847        label: "Adaptive MACD",
11848        category: "momentum",
11849        input_kind: IndicatorInputKind::Slice,
11850        outputs: OUTPUTS_MACD,
11851        params: PARAM_ADAPTIVE_MACD,
11852    },
11853    SupplementalIndicatorSeed {
11854        id: "polynomial_regression_extrapolation",
11855        label: "Polynomial Regression Extrapolation",
11856        category: "trend",
11857        input_kind: IndicatorInputKind::Slice,
11858        outputs: OUTPUTS_VALUE_F64,
11859        params: PARAM_POLYNOMIAL_REGRESSION_EXTRAPOLATION,
11860    },
11861    SupplementalIndicatorSeed {
11862        id: "statistical_trailing_stop",
11863        label: "Statistical Trailing Stop",
11864        category: "trend",
11865        input_kind: IndicatorInputKind::Ohlc,
11866        outputs: OUTPUTS_STATISTICAL_TRAILING_STOP,
11867        params: PARAM_STATISTICAL_TRAILING_STOP,
11868    },
11869    SupplementalIndicatorSeed {
11870        id: "standardized_psar_oscillator",
11871        label: "Standardized PSAR Oscillator",
11872        category: "momentum",
11873        input_kind: IndicatorInputKind::Ohlc,
11874        outputs: OUTPUTS_STANDARDIZED_PSAR_OSCILLATOR,
11875        params: PARAM_STANDARDIZED_PSAR_OSCILLATOR,
11876    },
11877    SupplementalIndicatorSeed {
11878        id: "geometric_bias_oscillator",
11879        label: "Geometric Bias Oscillator",
11880        category: "momentum",
11881        input_kind: IndicatorInputKind::Ohlc,
11882        outputs: OUTPUTS_VALUE_F64,
11883        params: PARAM_GEOMETRIC_BIAS_OSCILLATOR,
11884    },
11885    SupplementalIndicatorSeed {
11886        id: "vdubus_divergence_wave_pattern_generator",
11887        label: "Vdubus Divergence Wave Pattern Generator",
11888        category: "pattern_recognition",
11889        input_kind: IndicatorInputKind::Ohlc,
11890        outputs: OUTPUTS_VDUBUS_DIVERGENCE_WAVE_PATTERN_GENERATOR,
11891        params: PARAM_VDUBUS_DIVERGENCE_WAVE_PATTERN_GENERATOR,
11892    },
11893    SupplementalIndicatorSeed {
11894        id: "ppo",
11895        label: "PPO",
11896        category: "momentum",
11897        input_kind: IndicatorInputKind::Slice,
11898        outputs: OUTPUTS_VALUE_F64,
11899        params: PARAM_PPO,
11900    },
11901    SupplementalIndicatorSeed {
11902        id: "trix",
11903        label: "TRIX",
11904        category: "momentum",
11905        input_kind: IndicatorInputKind::Slice,
11906        outputs: OUTPUTS_VALUE_F64,
11907        params: PARAM_TRIX_PERIOD,
11908    },
11909    SupplementalIndicatorSeed {
11910        id: "tsi",
11911        label: "TSI",
11912        category: "momentum",
11913        input_kind: IndicatorInputKind::Slice,
11914        outputs: OUTPUTS_VALUE_F64,
11915        params: PARAM_TSI,
11916    },
11917    SupplementalIndicatorSeed {
11918        id: "stddev",
11919        label: "StdDev",
11920        category: "volatility",
11921        input_kind: IndicatorInputKind::Slice,
11922        outputs: OUTPUTS_VALUE_F64,
11923        params: PARAM_STDDEV,
11924    },
11925    SupplementalIndicatorSeed {
11926        id: "var",
11927        label: "VAR",
11928        category: "volatility",
11929        input_kind: IndicatorInputKind::Slice,
11930        outputs: OUTPUTS_VALUE_F64,
11931        params: PARAM_VAR,
11932    },
11933    SupplementalIndicatorSeed {
11934        id: "willr",
11935        label: "WILLR",
11936        category: "momentum",
11937        input_kind: IndicatorInputKind::Ohlc,
11938        outputs: OUTPUTS_VALUE_F64,
11939        params: PARAM_WILLR_PERIOD,
11940    },
11941    SupplementalIndicatorSeed {
11942        id: "ultosc",
11943        label: "ULTOSC",
11944        category: "momentum",
11945        input_kind: IndicatorInputKind::Ohlc,
11946        outputs: OUTPUTS_VALUE_F64,
11947        params: PARAM_ULTOSC,
11948    },
11949    SupplementalIndicatorSeed {
11950        id: "macd",
11951        label: "MACD",
11952        category: "momentum",
11953        input_kind: IndicatorInputKind::Slice,
11954        outputs: OUTPUTS_MACD,
11955        params: PARAM_MACD,
11956    },
11957    SupplementalIndicatorSeed {
11958        id: "bollinger_bands",
11959        label: "Bollinger Bands",
11960        category: "volatility",
11961        input_kind: IndicatorInputKind::Slice,
11962        outputs: OUTPUTS_BOLLINGER,
11963        params: PARAM_BOLLINGER,
11964    },
11965    SupplementalIndicatorSeed {
11966        id: "bollinger_bands_width",
11967        label: "Bollinger Bands Width",
11968        category: "volatility",
11969        input_kind: IndicatorInputKind::Slice,
11970        outputs: OUTPUTS_VALUE_F64,
11971        params: PARAM_BOLLINGER,
11972    },
11973    SupplementalIndicatorSeed {
11974        id: "stoch",
11975        label: "Stochastic",
11976        category: "momentum",
11977        input_kind: IndicatorInputKind::Ohlc,
11978        outputs: OUTPUTS_STOCH,
11979        params: PARAM_STOCH,
11980    },
11981    SupplementalIndicatorSeed {
11982        id: "stochf",
11983        label: "Fast Stochastic",
11984        category: "momentum",
11985        input_kind: IndicatorInputKind::Ohlc,
11986        outputs: OUTPUTS_STOCH,
11987        params: PARAM_STOCHF,
11988    },
11989    SupplementalIndicatorSeed {
11990        id: "vwmacd",
11991        label: "VWMACD",
11992        category: "volume",
11993        input_kind: IndicatorInputKind::CloseVolume,
11994        outputs: OUTPUTS_MACD,
11995        params: PARAM_VW_MACD,
11996    },
11997    SupplementalIndicatorSeed {
11998        id: "vpci",
11999        label: "VPCI",
12000        category: "volume",
12001        input_kind: IndicatorInputKind::CloseVolume,
12002        outputs: OUTPUTS_VPCI,
12003        params: PARAM_VPCI,
12004    },
12005    SupplementalIndicatorSeed {
12006        id: "ttm_trend",
12007        label: "TTM Trend",
12008        category: "trend",
12009        input_kind: IndicatorInputKind::Ohlc,
12010        outputs: OUTPUTS_VALUE_BOOL,
12011        params: PARAM_TTM_TREND,
12012    },
12013    SupplementalIndicatorSeed {
12014        id: "ttm_squeeze",
12015        label: "TTM Squeeze",
12016        category: "momentum",
12017        input_kind: IndicatorInputKind::Ohlc,
12018        outputs: OUTPUTS_TTM_SQUEEZE,
12019        params: PARAM_TTM_SQUEEZE,
12020    },
12021    SupplementalIndicatorSeed {
12022        id: "acosc",
12023        label: "Acosc",
12024        category: "momentum",
12025        input_kind: IndicatorInputKind::HighLow,
12026        outputs: OUTPUTS_ACOSC,
12027        params: PARAM_ACOSC,
12028    },
12029    SupplementalIndicatorSeed {
12030        id: "alligator",
12031        label: "Alligator",
12032        category: "trend",
12033        input_kind: IndicatorInputKind::Slice,
12034        outputs: OUTPUTS_ALLIGATOR,
12035        params: PARAM_ALLIGATOR,
12036    },
12037    SupplementalIndicatorSeed {
12038        id: "alphatrend",
12039        label: "AlphaTrend",
12040        category: "trend",
12041        input_kind: IndicatorInputKind::Ohlcv,
12042        outputs: OUTPUTS_K1_K2,
12043        params: PARAM_ALPHATREND,
12044    },
12045    SupplementalIndicatorSeed {
12046        id: "aso",
12047        label: "ASO",
12048        category: "momentum",
12049        input_kind: IndicatorInputKind::Ohlc,
12050        outputs: OUTPUTS_BULLS_BEARS,
12051        params: PARAM_ASO,
12052    },
12053    SupplementalIndicatorSeed {
12054        id: "avsl",
12055        label: "AVSL",
12056        category: "trend",
12057        input_kind: IndicatorInputKind::Ohlcv,
12058        outputs: OUTPUTS_VALUE_F64,
12059        params: PARAM_AVSL,
12060    },
12061    SupplementalIndicatorSeed {
12062        id: "bandpass",
12063        label: "BandPass",
12064        category: "cycle",
12065        input_kind: IndicatorInputKind::Slice,
12066        outputs: OUTPUTS_BANDPASS,
12067        params: PARAM_BANDPASS,
12068    },
12069    SupplementalIndicatorSeed {
12070        id: "chande",
12071        label: "Chande",
12072        category: "trend",
12073        input_kind: IndicatorInputKind::Ohlc,
12074        outputs: OUTPUTS_VALUE_F64,
12075        params: PARAM_CHANDE,
12076    },
12077    SupplementalIndicatorSeed {
12078        id: "chandelier_exit",
12079        label: "Chandelier Exit",
12080        category: "trend",
12081        input_kind: IndicatorInputKind::Ohlc,
12082        outputs: OUTPUTS_LONG_SHORT_STOP,
12083        params: PARAM_CHANDELIER_EXIT,
12084    },
12085    SupplementalIndicatorSeed {
12086        id: "cksp",
12087        label: "CKSP",
12088        category: "trend",
12089        input_kind: IndicatorInputKind::Ohlc,
12090        outputs: OUTPUTS_LONG_SHORT_VALUES,
12091        params: PARAM_CKSP,
12092    },
12093    SupplementalIndicatorSeed {
12094        id: "correlation_cycle",
12095        label: "Correlation Cycle",
12096        category: "cycle",
12097        input_kind: IndicatorInputKind::Slice,
12098        outputs: OUTPUTS_CORRELATION_CYCLE,
12099        params: PARAM_CORRELATION_CYCLE,
12100    },
12101    SupplementalIndicatorSeed {
12102        id: "correl_hl",
12103        label: "Correl HL",
12104        category: "statistics",
12105        input_kind: IndicatorInputKind::HighLow,
12106        outputs: OUTPUTS_VALUE_F64,
12107        params: PARAM_CORREL_HL,
12108    },
12109    SupplementalIndicatorSeed {
12110        id: "decycler",
12111        label: "Decycler",
12112        category: "trend",
12113        input_kind: IndicatorInputKind::Slice,
12114        outputs: OUTPUTS_VALUE_F64,
12115        params: PARAM_DECYCLER,
12116    },
12117    SupplementalIndicatorSeed {
12118        id: "damiani_volatmeter",
12119        label: "Damiani Volatmeter",
12120        category: "volatility",
12121        input_kind: IndicatorInputKind::Slice,
12122        outputs: OUTPUTS_VOL_ANTI,
12123        params: PARAM_DAMIANI_VOLATMETER,
12124    },
12125    SupplementalIndicatorSeed {
12126        id: "dvdiqqe",
12127        label: "DVDIQQE",
12128        category: "volume",
12129        input_kind: IndicatorInputKind::Ohlc,
12130        outputs: OUTPUTS_DVDIQQE,
12131        params: PARAM_DVDIQQE,
12132    },
12133    SupplementalIndicatorSeed {
12134        id: "emd",
12135        label: "EMD",
12136        category: "volatility",
12137        input_kind: IndicatorInputKind::Ohlcv,
12138        outputs: OUTPUTS_UPPER_MIDDLE_LOWER_BAND,
12139        params: PARAM_EMD,
12140    },
12141    SupplementalIndicatorSeed {
12142        id: "eri",
12143        label: "ERI",
12144        category: "trend",
12145        input_kind: IndicatorInputKind::Ohlc,
12146        outputs: OUTPUTS_BULL_BEAR,
12147        params: PARAM_ERI,
12148    },
12149    SupplementalIndicatorSeed {
12150        id: "fisher",
12151        label: "Fisher",
12152        category: "momentum",
12153        input_kind: IndicatorInputKind::HighLow,
12154        outputs: OUTPUTS_FISHER,
12155        params: PARAM_FISHER,
12156    },
12157    SupplementalIndicatorSeed {
12158        id: "fvg_trailing_stop",
12159        label: "FVG Trailing Stop",
12160        category: "trend",
12161        input_kind: IndicatorInputKind::Ohlc,
12162        outputs: OUTPUTS_FVG_TS,
12163        params: PARAM_FVG_TRAILING_STOP,
12164    },
12165    SupplementalIndicatorSeed {
12166        id: "gatorosc",
12167        label: "Gator Oscillator",
12168        category: "trend",
12169        input_kind: IndicatorInputKind::Slice,
12170        outputs: OUTPUTS_GATOROSC,
12171        params: PARAM_GATOROSC,
12172    },
12173    SupplementalIndicatorSeed {
12174        id: "halftrend",
12175        label: "HalfTrend",
12176        category: "trend",
12177        input_kind: IndicatorInputKind::Ohlc,
12178        outputs: OUTPUTS_HALFTREND,
12179        params: PARAM_HALFTREND,
12180    },
12181    SupplementalIndicatorSeed {
12182        id: "kst",
12183        label: "KST",
12184        category: "momentum",
12185        input_kind: IndicatorInputKind::Slice,
12186        outputs: OUTPUTS_LINE_SIGNAL,
12187        params: PARAM_KST,
12188    },
12189    SupplementalIndicatorSeed {
12190        id: "kaufmanstop",
12191        label: "Kaufmanstop",
12192        category: "trend",
12193        input_kind: IndicatorInputKind::HighLow,
12194        outputs: OUTPUTS_VALUE_F64,
12195        params: PARAM_KAUFMANSTOP,
12196    },
12197    SupplementalIndicatorSeed {
12198        id: "lpc",
12199        label: "LPC",
12200        category: "cycle",
12201        input_kind: IndicatorInputKind::Ohlc,
12202        outputs: OUTPUTS_FILTER_BANDS,
12203        params: PARAM_LPC,
12204    },
12205    SupplementalIndicatorSeed {
12206        id: "mab",
12207        label: "MAB",
12208        category: "volatility",
12209        input_kind: IndicatorInputKind::Slice,
12210        outputs: OUTPUTS_UPPER_MIDDLE_LOWER_BAND,
12211        params: PARAM_MAB,
12212    },
12213    SupplementalIndicatorSeed {
12214        id: "macz",
12215        label: "MACZ",
12216        category: "momentum",
12217        input_kind: IndicatorInputKind::Slice,
12218        outputs: OUTPUTS_VALUE_F64,
12219        params: PARAM_MACZ,
12220    },
12221    SupplementalIndicatorSeed {
12222        id: "minmax",
12223        label: "MinMax",
12224        category: "pattern",
12225        input_kind: IndicatorInputKind::HighLow,
12226        outputs: OUTPUTS_MINMAX,
12227        params: PARAM_MINMAX,
12228    },
12229    SupplementalIndicatorSeed {
12230        id: "mod_god_mode",
12231        label: "Mod God Mode",
12232        category: "momentum",
12233        input_kind: IndicatorInputKind::Ohlc,
12234        outputs: OUTPUTS_MOD_GOD_MODE,
12235        params: PARAM_MOD_GOD_MODE,
12236    },
12237    SupplementalIndicatorSeed {
12238        id: "pattern_recognition",
12239        label: "Pattern Recognition",
12240        category: "pattern",
12241        input_kind: IndicatorInputKind::Ohlc,
12242        outputs: OUTPUTS_MATRIX_BOOL,
12243        params: PARAM_NONE,
12244    },
12245    SupplementalIndicatorSeed {
12246        id: "msw",
12247        label: "MSW",
12248        category: "cycle",
12249        input_kind: IndicatorInputKind::Slice,
12250        outputs: OUTPUTS_SINE_LEAD,
12251        params: PARAM_MSW,
12252    },
12253    SupplementalIndicatorSeed {
12254        id: "nadaraya_watson_envelope",
12255        label: "Nadaraya Watson Envelope",
12256        category: "volatility",
12257        input_kind: IndicatorInputKind::Slice,
12258        outputs: OUTPUTS_UPPER_LOWER,
12259        params: PARAM_NWE,
12260    },
12261    SupplementalIndicatorSeed {
12262        id: "ott",
12263        label: "OTT",
12264        category: "trend",
12265        input_kind: IndicatorInputKind::Slice,
12266        outputs: OUTPUTS_VALUE_F64,
12267        params: PARAM_OTT,
12268    },
12269    SupplementalIndicatorSeed {
12270        id: "otto",
12271        label: "OTTO",
12272        category: "trend",
12273        input_kind: IndicatorInputKind::Slice,
12274        outputs: OUTPUTS_HOTT_LOTT,
12275        params: PARAM_OTTO,
12276    },
12277    SupplementalIndicatorSeed {
12278        id: "vidya",
12279        label: "VIDYA",
12280        category: "trend",
12281        input_kind: IndicatorInputKind::Slice,
12282        outputs: OUTPUTS_VALUE_F64,
12283        params: PARAM_VIDYA,
12284    },
12285    SupplementalIndicatorSeed {
12286        id: "vlma",
12287        label: "VLMA",
12288        category: "trend",
12289        input_kind: IndicatorInputKind::Slice,
12290        outputs: OUTPUTS_VALUE_F64,
12291        params: PARAM_VLMA,
12292    },
12293    SupplementalIndicatorSeed {
12294        id: "pma",
12295        label: "PMA",
12296        category: "trend",
12297        input_kind: IndicatorInputKind::Slice,
12298        outputs: OUTPUTS_EHLERS_PMA,
12299        params: PARAM_PMA,
12300    },
12301    SupplementalIndicatorSeed {
12302        id: "prb",
12303        label: "PRB",
12304        category: "statistics",
12305        input_kind: IndicatorInputKind::Slice,
12306        outputs: OUTPUTS_PRB,
12307        params: PARAM_PRB,
12308    },
12309    SupplementalIndicatorSeed {
12310        id: "qqe",
12311        label: "QQE",
12312        category: "momentum",
12313        input_kind: IndicatorInputKind::Slice,
12314        outputs: &[OUTPUT_FAST, OUTPUT_SLOW],
12315        params: PARAM_QQE,
12316    },
12317    SupplementalIndicatorSeed {
12318        id: "adaptive_bounds_rsi",
12319        label: "Adaptive Bounds RSI",
12320        category: "momentum",
12321        input_kind: IndicatorInputKind::Slice,
12322        outputs: OUTPUTS_ADAPTIVE_BOUNDS_RSI,
12323        params: PARAM_ADAPTIVE_BOUNDS_RSI,
12324    },
12325    SupplementalIndicatorSeed {
12326        id: "forward_backward_exponential_oscillator",
12327        label: "Forward-Backward Exponential Oscillator",
12328        category: "momentum",
12329        input_kind: IndicatorInputKind::Slice,
12330        outputs: OUTPUTS_FORWARD_BACKWARD_EXPONENTIAL_OSCILLATOR,
12331        params: PARAM_FORWARD_BACKWARD_EXPONENTIAL_OSCILLATOR,
12332    },
12333    SupplementalIndicatorSeed {
12334        id: "qqe_weighted_oscillator",
12335        label: "QQE Weighted Oscillator",
12336        category: "momentum",
12337        input_kind: IndicatorInputKind::Slice,
12338        outputs: OUTPUTS_QQE_WEIGHTED_OSCILLATOR,
12339        params: PARAM_QQE_WEIGHTED_OSCILLATOR,
12340    },
12341    SupplementalIndicatorSeed {
12342        id: "market_structure_confluence",
12343        label: "Market Structure Confluence",
12344        category: "trend",
12345        input_kind: IndicatorInputKind::Ohlc,
12346        outputs: OUTPUTS_MARKET_STRUCTURE_CONFLUENCE,
12347        params: PARAM_MARKET_STRUCTURE_CONFLUENCE,
12348    },
12349    SupplementalIndicatorSeed {
12350        id: "range_filtered_trend_signals",
12351        label: "Range Filtered Trend Signals",
12352        category: "trend",
12353        input_kind: IndicatorInputKind::Ohlc,
12354        outputs: OUTPUTS_RANGE_FILTERED_TREND_SIGNALS,
12355        params: PARAM_RANGE_FILTERED_TREND_SIGNALS,
12356    },
12357    SupplementalIndicatorSeed {
12358        id: "range_oscillator",
12359        label: "Range Oscillator",
12360        category: "volatility",
12361        input_kind: IndicatorInputKind::Ohlc,
12362        outputs: OUTPUTS_RANGE_OSCILLATOR,
12363        params: PARAM_RANGE_OSCILLATOR,
12364    },
12365    SupplementalIndicatorSeed {
12366        id: "volume_weighted_relative_strength_index",
12367        label: "Volume Weighted Relative Strength Index",
12368        category: "momentum",
12369        input_kind: IndicatorInputKind::CloseVolume,
12370        outputs: OUTPUTS_VOLUME_WEIGHTED_RELATIVE_STRENGTH_INDEX,
12371        params: PARAM_VOLUME_WEIGHTED_RELATIVE_STRENGTH_INDEX,
12372    },
12373    SupplementalIndicatorSeed {
12374        id: "range_filter",
12375        label: "Range Filter",
12376        category: "volatility",
12377        input_kind: IndicatorInputKind::Slice,
12378        outputs: OUTPUTS_FILTER_BANDS,
12379        params: PARAM_RANGE_FILTER,
12380    },
12381    SupplementalIndicatorSeed {
12382        id: "coppock",
12383        label: "Coppock",
12384        category: "momentum",
12385        input_kind: IndicatorInputKind::Slice,
12386        outputs: OUTPUTS_VALUE_F64,
12387        params: PARAM_COPPOCK,
12388    },
12389    SupplementalIndicatorSeed {
12390        id: "rsmk",
12391        label: "RSMK",
12392        category: "relative_strength",
12393        input_kind: IndicatorInputKind::CloseVolume,
12394        outputs: OUTPUTS_INDICATOR_SIGNAL,
12395        params: PARAM_RSMK,
12396    },
12397    SupplementalIndicatorSeed {
12398        id: "voss",
12399        label: "Voss",
12400        category: "cycle",
12401        input_kind: IndicatorInputKind::Slice,
12402        outputs: OUTPUTS_VOSS,
12403        params: PARAM_VOSS,
12404    },
12405    SupplementalIndicatorSeed {
12406        id: "stc",
12407        label: "STC",
12408        category: "momentum",
12409        input_kind: IndicatorInputKind::Slice,
12410        outputs: OUTPUTS_VALUE_F64,
12411        params: PARAM_STC,
12412    },
12413    SupplementalIndicatorSeed {
12414        id: "rvi",
12415        label: "RVI",
12416        category: "volatility",
12417        input_kind: IndicatorInputKind::Slice,
12418        outputs: OUTPUTS_VALUE_F64,
12419        params: PARAM_RVI,
12420    },
12421    SupplementalIndicatorSeed {
12422        id: "safezonestop",
12423        label: "SafeZoneStop",
12424        category: "trend",
12425        input_kind: IndicatorInputKind::HighLow,
12426        outputs: OUTPUTS_VALUE_F64,
12427        params: PARAM_SAFEZONESTOP,
12428    },
12429    SupplementalIndicatorSeed {
12430        id: "chop",
12431        label: "CHOP",
12432        category: "trend",
12433        input_kind: IndicatorInputKind::Ohlc,
12434        outputs: OUTPUTS_VALUE_F64,
12435        params: PARAM_CHOP,
12436    },
12437    SupplementalIndicatorSeed {
12438        id: "devstop",
12439        label: "DevStop",
12440        category: "trend",
12441        input_kind: IndicatorInputKind::HighLow,
12442        outputs: OUTPUTS_VALUE_F64,
12443        params: PARAM_DEVSTOP,
12444    },
12445    SupplementalIndicatorSeed {
12446        id: "net_myrsi",
12447        label: "NET_MyRSI",
12448        category: "momentum",
12449        input_kind: IndicatorInputKind::Slice,
12450        outputs: OUTPUTS_VALUE_F64,
12451        params: PARAMS_PERIOD_ONLY,
12452    },
12453    SupplementalIndicatorSeed {
12454        id: "wad",
12455        label: "WAD",
12456        category: "volume",
12457        input_kind: IndicatorInputKind::Ohlc,
12458        outputs: OUTPUTS_VALUE_F64,
12459        params: PARAM_NONE,
12460    },
12461    SupplementalIndicatorSeed {
12462        id: "pivot",
12463        label: "Pivot",
12464        category: "price",
12465        input_kind: IndicatorInputKind::Ohlc,
12466        outputs: OUTPUTS_PIVOT,
12467        params: PARAM_PIVOT,
12468    },
12469];
12470
12471fn supplemental_supports_cpu_batch(id: &str) -> bool {
12472    matches!(
12473        id,
12474        "adx"
12475            | "adxr"
12476            | "atr"
12477            | "atr_percentile"
12478            | "ad"
12479            | "adosc"
12480            | "ao"
12481            | "dti"
12482            | "dx"
12483            | "di"
12484            | "dm"
12485            | "vi"
12486            | "donchian"
12487            | "supertrend"
12488            | "adjustable_ma_alternating_extremities"
12489            | "supertrend_recovery"
12490            | "keltner"
12491            | "aroon"
12492            | "srsi"
12493            | "kdj"
12494            | "squeeze_momentum"
12495            | "wavetrend"
12496            | "wto"
12497            | "garman_klass_volatility"
12498            | "historical_volatility"
12499            | "absolute_strength_index_oscillator"
12500            | "adaptive_bandpass_trigger_oscillator"
12501            | "premier_rsi_oscillator"
12502            | "multi_length_stochastic_average"
12503            | "hull_butterfly_oscillator"
12504            | "fibonacci_trailing_stop"
12505            | "fibonacci_entry_bands"
12506            | "volume_energy_reservoirs"
12507            | "neighboring_trailing_stop"
12508            | "macd_wave_signal_pro"
12509            | "hema_trend_levels"
12510            | "grover_llorens_cycle_oscillator"
12511            | "squeeze_index"
12512            | "stochastic_distance"
12513            | "advance_decline_line"
12514            | "decisionpoint_breadth_swenlin_trading_oscillator"
12515            | "velocity_acceleration_indicator"
12516            | "normalized_resonator"
12517            | "monotonicity_index"
12518            | "half_causal_estimator"
12519            | "bull_power_vs_bear_power"
12520            | "vertical_horizontal_filter"
12521            | "intraday_momentum_index"
12522            | "vwap_zscore_with_signals"
12523            | "demand_index"
12524            | "didi_index"
12525            | "ehlers_autocorrelation_periodogram"
12526            | "ehlers_linear_extrapolation_predictor"
12527            | "kase_peak_oscillator_with_divergences"
12528            | "gopalakrishnan_range_index"
12529            | "yang_zhang_volatility"
12530            | "historical_volatility_percentile"
12531            | "ehlers_detrending_filter"
12532            | "keltner_channel_width_oscillator"
12533            | "market_meanness_index"
12534            | "price_density_market_noise"
12535            | "momentum_ratio_oscillator"
12536            | "hypertrend"
12537            | "adaptive_schaff_trend_cycle"
12538            | "smoothed_gaussian_trend_filter"
12539            | "logarithmic_moving_average"
12540            | "ict_propulsion_block"
12541            | "supertrend_oscillator"
12542            | "leavitt_convolution_acceleration"
12543            | "impulse_macd"
12544            | "insync_index"
12545            | "volatility_ratio_adaptive_rsx"
12546            | "on_balance_volume_oscillator"
12547            | "parkinson_volatility"
12548            | "psychological_line"
12549            | "rank_correlation_index"
12550            | "trend_follower"
12551            | "trend_direction_force_index"
12552            | "linear_regression_intensity"
12553            | "trend_continuation_factor"
12554            | "pretty_good_oscillator"
12555            | "twiggs_money_flow"
12556            | "volume_weighted_stochastic_rsi"
12557            | "stochastic_adaptive_d"
12558            | "stochastic_connors_rsi"
12559            | "volume_zone_oscillator"
12560            | "bop"
12561            | "emv"
12562            | "efi"
12563            | "mfi"
12564            | "mass"
12565            | "kvo"
12566            | "wad"
12567            | "vosc"
12568            | "rvi"
12569            | "coppock"
12570            | "rsi"
12571            | "roc"
12572            | "linear_correlation_oscillator"
12573            | "ehlers_fm_demodulator"
12574            | "ehlers_adaptive_cg"
12575            | "adaptive_momentum_oscillator"
12576            | "velocity"
12577            | "normalized_volume_true_range"
12578            | "exponential_trend"
12579            | "trend_flow_trail"
12580            | "range_breakout_signals"
12581            | "apo"
12582            | "cci"
12583            | "cci_cycle"
12584            | "cfo"
12585            | "cg"
12586            | "er"
12587            | "kurtosis"
12588            | "natr"
12589            | "net_myrsi"
12590            | "mean_ad"
12591            | "medium_ad"
12592            | "deviation"
12593            | "mod_god_mode"
12594            | "dpo"
12595            | "lrsi"
12596            | "fosc"
12597            | "ift_rsi"
12598            | "linearreg_angle"
12599            | "linearreg_intercept"
12600            | "linearreg_slope"
12601            | "pfe"
12602            | "percentile_nearest_rank"
12603            | "ui"
12604            | "zscore"
12605            | "medprice"
12606            | "midpoint"
12607            | "midprice"
12608            | "wclprice"
12609            | "obv"
12610            | "vpt"
12611            | "nvi"
12612            | "pvi"
12613            | "mom"
12614            | "cmo"
12615            | "rocp"
12616            | "rocr"
12617            | "tsf"
12618            | "adaptive_macd"
12619            | "polynomial_regression_extrapolation"
12620            | "statistical_trailing_stop"
12621            | "standardized_psar_oscillator"
12622            | "geometric_bias_oscillator"
12623            | "ppo"
12624            | "trix"
12625            | "tsi"
12626            | "stddev"
12627            | "var"
12628            | "willr"
12629            | "ultosc"
12630            | "macd"
12631            | "bollinger_bands"
12632            | "bollinger_bands_width"
12633            | "stoch"
12634            | "stochf"
12635            | "vwmacd"
12636            | "volume_weighted_rsi"
12637            | "dynamic_momentum_index"
12638            | "disparity_index"
12639            | "donchian_channel_width"
12640            | "kairi_relative_index"
12641            | "projection_oscillator"
12642            | "possible_rsi"
12643            | "stochastic_money_flow_index"
12644            | "autocorrelation_indicator"
12645            | "goertzel_cycle_composite_wave"
12646            | "rolling_skewness_kurtosis"
12647            | "rolling_z_score_trend"
12648            | "ehlers_data_sampling_relative_strength_indicator"
12649            | "velocity_acceleration_convergence_divergence_indicator"
12650            | "trend_direction_force_index"
12651            | "stc"
12652            | "vpci"
12653            | "ttm_trend"
12654            | "ttm_squeeze"
12655            | "acosc"
12656            | "alligator"
12657            | "alphatrend"
12658            | "aso"
12659            | "bandpass"
12660            | "chande"
12661            | "chandelier_exit"
12662            | "cksp"
12663            | "coppock"
12664            | "correl_hl"
12665            | "correlation_cycle"
12666            | "ehlers_adaptive_cg"
12667            | "normalized_volume_true_range"
12668            | "exponential_trend"
12669            | "trend_flow_trail"
12670            | "range_breakout_signals"
12671            | "chop"
12672            | "damiani_volatmeter"
12673            | "dvdiqqe"
12674            | "emd"
12675            | "eri"
12676            | "fisher"
12677            | "fvg_trailing_stop"
12678            | "gatorosc"
12679            | "halftrend"
12680            | "kst"
12681            | "lpc"
12682            | "mab"
12683            | "macz"
12684            | "minmax"
12685            | "msw"
12686            | "nadaraya_watson_envelope"
12687            | "otto"
12688            | "vidya"
12689            | "vlma"
12690            | "pma"
12691            | "prb"
12692            | "qqe"
12693            | "qqe_weighted_oscillator"
12694            | "range_filter"
12695            | "rsmk"
12696            | "safezonestop"
12697            | "devstop"
12698            | "voss"
12699            | "pivot"
12700    )
12701}
12702
12703fn supplemental_supports_cuda_single(id: &str) -> bool {
12704    matches!(id, "pattern_recognition")
12705}
12706
12707fn supplemental_supports_cuda_batch(id: &str) -> bool {
12708    matches!(
12709        id,
12710        "acosc"
12711            | "adosc"
12712            | "adx"
12713            | "adxr"
12714            | "alligator"
12715            | "alphatrend"
12716            | "ao"
12717            | "apo"
12718            | "aroon"
12719            | "aroonosc"
12720            | "aso"
12721            | "atr"
12722            | "avsl"
12723            | "bandpass"
12724            | "bollinger_bands"
12725            | "bollinger_bands_width"
12726            | "bop"
12727            | "cci"
12728            | "cci_cycle"
12729            | "cfo"
12730            | "cg"
12731            | "chande"
12732            | "chandelier_exit"
12733            | "chop"
12734            | "cksp"
12735            | "cmo"
12736            | "coppock"
12737            | "correl_hl"
12738            | "correlation_cycle"
12739            | "cvi"
12740            | "damiani_volatmeter"
12741            | "dec_osc"
12742            | "decycler"
12743            | "deviation"
12744            | "devstop"
12745            | "di"
12746            | "dm"
12747            | "donchian"
12748            | "dpo"
12749            | "dti"
12750            | "dvdiqqe"
12751            | "dx"
12752            | "efi"
12753            | "emd"
12754            | "emv"
12755            | "er"
12756            | "eri"
12757            | "fisher"
12758            | "fosc"
12759            | "fvg_trailing_stop"
12760            | "gatorosc"
12761            | "halftrend"
12762            | "ift_rsi"
12763            | "kaufmanstop"
12764            | "kdj"
12765            | "keltner"
12766            | "kst"
12767            | "kurtosis"
12768            | "kvo"
12769            | "linearreg_angle"
12770            | "linearreg_intercept"
12771            | "linearreg_slope"
12772            | "lpc"
12773            | "lrsi"
12774            | "mab"
12775            | "macd"
12776            | "macz"
12777            | "marketefi"
12778            | "mass"
12779            | "mean_ad"
12780            | "medium_ad"
12781            | "medprice"
12782            | "mfi"
12783            | "minmax"
12784            | "mod_god_mode"
12785            | "mom"
12786            | "msw"
12787            | "nadaraya_watson_envelope"
12788            | "natr"
12789            | "net_myrsi"
12790            | "nvi"
12791            | "obv"
12792            | "ott"
12793            | "otto"
12794            | "percentile_nearest_rank"
12795            | "pfe"
12796            | "pivot"
12797            | "pma"
12798            | "ppo"
12799            | "prb"
12800            | "pvi"
12801            | "qqe"
12802            | "qstick"
12803            | "range_filter"
12804            | "reverse_rsi"
12805            | "roc"
12806            | "rocp"
12807            | "rocr"
12808            | "rsi"
12809            | "rsmk"
12810            | "rsx"
12811            | "rvi"
12812            | "safezonestop"
12813            | "sar"
12814            | "squeeze_momentum"
12815            | "srsi"
12816            | "stc"
12817            | "stddev"
12818            | "stoch"
12819            | "stochf"
12820            | "supertrend"
12821            | "trix"
12822            | "tsf"
12823            | "tsi"
12824            | "ttm_squeeze"
12825            | "ttm_trend"
12826            | "ui"
12827            | "ultosc"
12828            | "var"
12829            | "vi"
12830            | "vidya"
12831            | "vlma"
12832            | "vosc"
12833            | "voss"
12834            | "vpci"
12835            | "vpt"
12836            | "vwmacd"
12837            | "wad"
12838            | "wavetrend"
12839            | "wclprice"
12840            | "willr"
12841            | "wto"
12842            | "garman_klass_volatility"
12843            | "yang_zhang_volatility"
12844            | "parkinson_volatility"
12845            | "zscore"
12846    )
12847}
12848
12849fn supplemental_supports_cuda_vram(id: &str) -> bool {
12850    matches!(id, "pattern_recognition") || supplemental_supports_cuda_batch(id)
12851}
12852
12853pub fn is_bucket_b_indicator(id: &str) -> bool {
12854    BUCKET_B_INDICATORS
12855        .iter()
12856        .any(|item| item.eq_ignore_ascii_case(id))
12857}
12858
12859static INDICATOR_REGISTRY: Lazy<Vec<IndicatorInfo>> = Lazy::new(build_registry);
12860static INDICATOR_EXACT_INDEX: Lazy<HashMap<&'static str, usize>> = Lazy::new(|| {
12861    let mut map = HashMap::with_capacity(INDICATOR_REGISTRY.len());
12862    for (idx, info) in INDICATOR_REGISTRY.iter().enumerate() {
12863        map.insert(info.id, idx);
12864    }
12865    map
12866});
12867
12868fn ma_outputs_for(ma_id: &str) -> Vec<IndicatorOutputInfo> {
12869    match ma_id {
12870        "mama" => OUTPUTS_MAMA.to_vec(),
12871        "ehlers_pma" => OUTPUTS_EHLERS_PMA.to_vec(),
12872        "ehlers_undersampled_double_moving_average" => OUTPUTS_BUFF_AVERAGES.to_vec(),
12873        "buff_averages" => OUTPUTS_BUFF_AVERAGES.to_vec(),
12874        "ema_deviation_corrected_t3" => OUTPUTS_EDCT3.to_vec(),
12875        "logarithmic_moving_average" => OUTPUTS_LOGARITHMIC_MOVING_AVERAGE.to_vec(),
12876        _ => OUTPUTS_VALUE_F64.to_vec(),
12877    }
12878}
12879
12880fn ma_params_for(ma_id: &str, period_based: bool) -> Vec<IndicatorParamInfo> {
12881    let mut params = Vec::new();
12882    if period_based {
12883        params.push(PARAM_PERIOD);
12884    }
12885    for item in ma_param_schema(ma_id).iter() {
12886        let kind = match item.kind {
12887            MaParamKind::Float => IndicatorParamKind::Float,
12888            MaParamKind::Int => IndicatorParamKind::Int,
12889        };
12890        let default = match kind {
12891            IndicatorParamKind::Float => Some(ParamValueStatic::Float(item.default)),
12892            IndicatorParamKind::Int => Some(ParamValueStatic::Int(item.default as i64)),
12893            IndicatorParamKind::Bool | IndicatorParamKind::EnumString => None,
12894        };
12895        params.push(IndicatorParamInfo {
12896            key: item.key,
12897            label: item.label,
12898            kind,
12899            required: false,
12900            default,
12901            min: item.min,
12902            max: item.max,
12903            step: item.step,
12904            enum_values: EMPTY_ENUM_VALUES,
12905            notes: item.notes,
12906        });
12907    }
12908    match ma_id {
12909        "mama" => params.push(PARAM_OUTPUT_MAMA),
12910        "ehlers_pma" => params.push(PARAM_OUTPUT_EHLERS_PMA),
12911        "ehlers_undersampled_double_moving_average" => params.push(PARAM_OUTPUT_BUFF_AVERAGES),
12912        "buff_averages" => params.push(PARAM_OUTPUT_BUFF_AVERAGES),
12913        "ema_deviation_corrected_t3" => params.push(PARAM_OUTPUT_EDCT3),
12914        "vwap" => params.push(PARAM_ANCHOR),
12915        "volume_adjusted_ma" => params.push(PARAM_STRICT),
12916        "n_order_ema" => {
12917            params.push(IndicatorParamInfo {
12918                key: "ema_style",
12919                label: "EMA Style",
12920                kind: IndicatorParamKind::EnumString,
12921                required: false,
12922                default: None,
12923                min: None,
12924                max: None,
12925                step: None,
12926                enum_values: ENUM_VALUES_N_ORDER_EMA_STYLE,
12927                notes: Some("Default: ema."),
12928            });
12929            params.push(IndicatorParamInfo {
12930                key: "iir_style",
12931                label: "IIR Style",
12932                kind: IndicatorParamKind::EnumString,
12933                required: false,
12934                default: None,
12935                min: None,
12936                max: None,
12937                step: None,
12938                enum_values: ENUM_VALUES_N_ORDER_EMA_IIR_STYLE,
12939                notes: Some("Default: impulse_matched."),
12940            });
12941        }
12942        _ => {}
12943    }
12944    params
12945}
12946
12947fn build_registry() -> Vec<IndicatorInfo> {
12948    let mut out = Vec::new();
12949
12950    for ma in list_moving_averages().iter() {
12951        out.push(IndicatorInfo {
12952            id: ma.id,
12953            label: ma.label,
12954            category: "moving_averages",
12955            dynamic_strategy_eligible: true,
12956            input_kind: if ma.requires_candles {
12957                IndicatorInputKind::Candles
12958            } else {
12959                IndicatorInputKind::Slice
12960            },
12961            outputs: ma_outputs_for(ma.id),
12962            params: ma_params_for(ma.id, ma.period_based),
12963            capabilities: IndicatorCapabilities {
12964                supports_cpu_single: ma.supports_cpu_single,
12965                supports_cpu_batch: ma.supports_cpu_batch,
12966                supports_cuda_single: ma.supports_cuda_single,
12967                supports_cuda_batch: ma.supports_cuda_sweep,
12968                supports_cuda_vram: ma.supports_cuda_sweep,
12969            },
12970            notes: ma.notes,
12971        });
12972    }
12973
12974    for seed in SUPPLEMENTAL_INDICATORS.iter() {
12975        let info = IndicatorInfo {
12976            id: seed.id,
12977            label: seed.label,
12978            category: seed.category,
12979            dynamic_strategy_eligible: true,
12980            input_kind: seed.input_kind,
12981            outputs: seed.outputs.to_vec(),
12982            params: seed.params.to_vec(),
12983            capabilities: IndicatorCapabilities {
12984                supports_cpu_single: true,
12985                supports_cpu_batch: supplemental_supports_cpu_batch(seed.id),
12986                supports_cuda_single: supplemental_supports_cuda_single(seed.id),
12987                supports_cuda_batch: supplemental_supports_cuda_batch(seed.id),
12988                supports_cuda_vram: supplemental_supports_cuda_vram(seed.id),
12989            },
12990            notes: Some(SUPPLEMENTAL_SEED_NOTE),
12991        };
12992
12993        if let Some(existing) = out
12994            .iter_mut()
12995            .find(|item| item.id.eq_ignore_ascii_case(seed.id))
12996        {
12997            *existing = info;
12998        } else {
12999            out.push(info);
13000        }
13001    }
13002
13003    out.sort_by(|a, b| a.id.cmp(b.id));
13004    out
13005}
13006
13007pub fn list_indicators() -> &'static [IndicatorInfo] {
13008    INDICATOR_REGISTRY.as_slice()
13009}
13010
13011pub fn get_indicator(id: &str) -> Option<&'static IndicatorInfo> {
13012    let indicators = list_indicators();
13013    if let Some(idx) = INDICATOR_EXACT_INDEX.get(id).copied() {
13014        return Some(&indicators[idx]);
13015    }
13016    if let Ok(idx) = indicators.binary_search_by(|info| info.id.cmp(id)) {
13017        return Some(&indicators[idx]);
13018    }
13019    indicators
13020        .iter()
13021        .find(|info| info.id.eq_ignore_ascii_case(id))
13022}
13023
13024pub fn indicator_param_schema(id: &str) -> Option<&'static [IndicatorParamInfo]> {
13025    get_indicator(id).map(|info| info.params.as_slice())
13026}
13027
13028pub fn indicator_output_schema(id: &str) -> Option<&'static [IndicatorOutputInfo]> {
13029    get_indicator(id).map(|info| info.outputs.as_slice())
13030}
13031
13032pub fn indicator_capabilities(id: &str) -> Option<IndicatorCapabilities> {
13033    get_indicator(id).map(|info| info.capabilities)
13034}
13035
13036#[cfg(test)]
13037mod tests {
13038    use super::*;
13039
13040    #[test]
13041    fn registry_is_non_empty() {
13042        assert!(!list_indicators().is_empty());
13043    }
13044
13045    #[test]
13046    fn ids_are_unique_case_insensitive() {
13047        use std::collections::HashSet;
13048        let mut seen = HashSet::new();
13049        for info in list_indicators().iter() {
13050            let lower = info.id.to_ascii_lowercase();
13051            assert!(seen.insert(lower), "duplicate id {}", info.id);
13052        }
13053    }
13054
13055    #[test]
13056    fn all_registered_entries_have_output_schema() {
13057        for info in list_indicators().iter() {
13058            assert!(
13059                !info.outputs.is_empty(),
13060                "indicator {} has no output schema",
13061                info.id
13062            );
13063        }
13064    }
13065
13066    #[test]
13067    fn ma_registry_is_mirrored() {
13068        for ma in list_moving_averages().iter() {
13069            assert!(
13070                get_indicator(ma.id).is_some(),
13071                "missing moving average {} in global registry",
13072                ma.id
13073            );
13074        }
13075    }
13076
13077    #[test]
13078    fn lookup_is_case_insensitive() {
13079        assert!(get_indicator("SMA").is_some());
13080        assert!(get_indicator("sma").is_some());
13081    }
13082
13083    #[test]
13084    fn schema_accessors_work() {
13085        assert!(indicator_output_schema("macd").is_some());
13086        assert!(indicator_param_schema("sma").is_some());
13087        assert!(indicator_capabilities("sma").is_some());
13088        assert!(indicator_output_schema("not_real").is_none());
13089    }
13090
13091    #[test]
13092    fn pattern_recognition_capability_is_registered_as_non_batch() {
13093        let info = get_indicator("pattern_recognition").unwrap();
13094        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13095        assert_eq!(info.outputs.len(), 1);
13096        assert_eq!(info.outputs[0].id, "matrix");
13097        assert!(info.capabilities.supports_cpu_single);
13098        assert!(!info.capabilities.supports_cpu_batch);
13099        assert!(info.capabilities.supports_cuda_single);
13100        assert!(!info.capabilities.supports_cuda_batch);
13101        assert!(info.capabilities.supports_cuda_vram);
13102    }
13103
13104    #[test]
13105    fn dec_osc_and_rsx_are_registered_for_cuda_batch() {
13106        let dec_osc = get_indicator("dec_osc").unwrap();
13107        assert_eq!(dec_osc.input_kind, IndicatorInputKind::Slice);
13108        assert_eq!(dec_osc.outputs.len(), 1);
13109        assert_eq!(dec_osc.outputs[0].id, "value");
13110        assert!(dec_osc.capabilities.supports_cuda_batch);
13111        assert!(dec_osc.capabilities.supports_cuda_vram);
13112
13113        let rsx = get_indicator("rsx").unwrap();
13114        assert_eq!(rsx.input_kind, IndicatorInputKind::Slice);
13115        assert_eq!(rsx.outputs.len(), 1);
13116        assert_eq!(rsx.outputs[0].id, "value");
13117        assert!(rsx.capabilities.supports_cuda_batch);
13118        assert!(rsx.capabilities.supports_cuda_vram);
13119    }
13120
13121    #[test]
13122    fn chande_is_registered_for_cpu_and_cuda_batch() {
13123        assert!(supplemental_supports_cpu_batch("chande"));
13124        assert!(supplemental_supports_cuda_batch("chande"));
13125        let chande = get_indicator("chande").unwrap();
13126        assert_eq!(chande.input_kind, IndicatorInputKind::Ohlc);
13127        assert_eq!(chande.outputs.len(), 1);
13128        assert_eq!(chande.outputs[0].id, "value");
13129        assert!(chande.capabilities.supports_cpu_batch);
13130        assert!(chande.capabilities.supports_cuda_batch);
13131        assert!(chande.capabilities.supports_cuda_vram);
13132    }
13133
13134    #[test]
13135    fn bucket_b_ma_capabilities_follow_ma_registry() {
13136        let mama = indicator_capabilities("mama").unwrap();
13137        assert!(mama.supports_cpu_batch);
13138        assert!(mama.supports_cuda_batch);
13139        assert!(mama.supports_cuda_vram);
13140
13141        let vwap = indicator_capabilities("vwap").unwrap();
13142        assert!(vwap.supports_cpu_batch);
13143        assert!(vwap.supports_cuda_batch);
13144        assert!(vwap.supports_cuda_vram);
13145    }
13146
13147    #[test]
13148    fn bucket_membership_lookup_is_case_insensitive() {
13149        assert!(is_bucket_b_indicator("MAMA"));
13150        assert!(is_bucket_b_indicator("pivot"));
13151        assert!(!is_bucket_b_indicator("sma"));
13152        assert!(!is_bucket_b_indicator("adx"));
13153    }
13154
13155    #[test]
13156    fn lrsi_is_registered_for_cuda_batch() {
13157        let lrsi = get_indicator("lrsi").unwrap();
13158        assert_eq!(lrsi.input_kind, IndicatorInputKind::HighLow);
13159        assert_eq!(lrsi.outputs.len(), 1);
13160        assert_eq!(lrsi.outputs[0].id, "value");
13161        assert!(lrsi.capabilities.supports_cpu_batch);
13162        assert!(lrsi.capabilities.supports_cuda_batch);
13163        assert!(lrsi.capabilities.supports_cuda_vram);
13164    }
13165
13166    #[test]
13167    fn garman_klass_volatility_is_registered_for_cpu_and_cuda_batch() {
13168        assert!(supplemental_supports_cpu_batch("garman_klass_volatility"));
13169        assert!(supplemental_supports_cuda_batch("garman_klass_volatility"));
13170        let info = get_indicator("garman_klass_volatility").unwrap();
13171        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13172        assert_eq!(info.outputs.len(), 1);
13173        assert_eq!(info.outputs[0].id, "value");
13174        assert_eq!(info.params.len(), 1);
13175        assert_eq!(info.params[0].key, "lookback");
13176        assert!(info.capabilities.supports_cpu_single);
13177        assert!(info.capabilities.supports_cpu_batch);
13178        assert!(info.capabilities.supports_cuda_batch);
13179        assert!(info.capabilities.supports_cuda_vram);
13180    }
13181
13182    #[test]
13183    fn historical_volatility_is_registered_for_cpu_batch_only() {
13184        assert!(supplemental_supports_cpu_batch("historical_volatility"));
13185        assert!(!supplemental_supports_cuda_batch("historical_volatility"));
13186        let info = get_indicator("historical_volatility").unwrap();
13187        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13188        assert_eq!(info.outputs.len(), 1);
13189        assert_eq!(info.outputs[0].id, "value");
13190        assert_eq!(info.params.len(), 2);
13191        assert_eq!(info.params[0].key, "lookback");
13192        assert_eq!(info.params[1].key, "annualization_days");
13193        assert!(info.capabilities.supports_cpu_single);
13194        assert!(info.capabilities.supports_cpu_batch);
13195        assert!(!info.capabilities.supports_cuda_batch);
13196        assert!(!info.capabilities.supports_cuda_vram);
13197    }
13198
13199    #[test]
13200    fn advance_decline_line_is_registered_for_cpu_batch_only() {
13201        assert!(supplemental_supports_cpu_batch("advance_decline_line"));
13202        assert!(!supplemental_supports_cuda_batch("advance_decline_line"));
13203        let info = get_indicator("advance_decline_line").unwrap();
13204        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13205        assert_eq!(info.outputs.len(), 1);
13206        assert_eq!(info.outputs[0].id, "value");
13207        assert!(info.params.is_empty());
13208        assert!(info.capabilities.supports_cpu_single);
13209        assert!(info.capabilities.supports_cpu_batch);
13210        assert!(!info.capabilities.supports_cuda_batch);
13211        assert!(!info.capabilities.supports_cuda_vram);
13212    }
13213
13214    #[test]
13215    fn decisionpoint_breadth_swenlin_trading_oscillator_is_registered_for_cpu_batch_only() {
13216        assert!(supplemental_supports_cpu_batch(
13217            "decisionpoint_breadth_swenlin_trading_oscillator"
13218        ));
13219        assert!(!supplemental_supports_cuda_batch(
13220            "decisionpoint_breadth_swenlin_trading_oscillator"
13221        ));
13222        let info = get_indicator("decisionpoint_breadth_swenlin_trading_oscillator").unwrap();
13223        assert_eq!(info.input_kind, IndicatorInputKind::HighLow);
13224        assert_eq!(info.outputs.len(), 1);
13225        assert_eq!(info.outputs[0].id, "value");
13226        assert!(info.params.is_empty());
13227        assert!(info.capabilities.supports_cpu_single);
13228        assert!(info.capabilities.supports_cpu_batch);
13229        assert!(!info.capabilities.supports_cuda_batch);
13230        assert!(!info.capabilities.supports_cuda_vram);
13231    }
13232
13233    #[test]
13234    fn velocity_acceleration_indicator_is_registered_for_cpu_batch_only() {
13235        assert!(supplemental_supports_cpu_batch(
13236            "velocity_acceleration_indicator"
13237        ));
13238        assert!(!supplemental_supports_cuda_batch(
13239            "velocity_acceleration_indicator"
13240        ));
13241        let info = get_indicator("velocity_acceleration_indicator").unwrap();
13242        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13243        assert_eq!(info.outputs.len(), 1);
13244        assert_eq!(info.outputs[0].id, "value");
13245        assert_eq!(info.params.len(), 3);
13246        assert_eq!(info.params[0].key, "length");
13247        assert_eq!(info.params[1].key, "smooth_length");
13248        assert_eq!(info.params[2].key, "source");
13249        assert!(info.capabilities.supports_cpu_single);
13250        assert!(info.capabilities.supports_cpu_batch);
13251        assert!(!info.capabilities.supports_cuda_batch);
13252        assert!(!info.capabilities.supports_cuda_vram);
13253    }
13254
13255    #[test]
13256    fn normalized_resonator_is_registered_for_cpu_batch_only() {
13257        assert!(supplemental_supports_cpu_batch("normalized_resonator"));
13258        assert!(!supplemental_supports_cuda_batch("normalized_resonator"));
13259        let info = get_indicator("normalized_resonator").unwrap();
13260        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13261        assert_eq!(info.outputs.len(), 2);
13262        assert_eq!(info.outputs[0].id, "oscillator");
13263        assert_eq!(info.outputs[1].id, "signal");
13264        assert_eq!(info.params.len(), 5);
13265        assert_eq!(info.params[0].key, "period");
13266        assert_eq!(info.params[1].key, "delta");
13267        assert_eq!(info.params[2].key, "lookback_mult");
13268        assert_eq!(info.params[3].key, "signal_length");
13269        assert_eq!(info.params[4].key, "source");
13270        assert!(info.capabilities.supports_cpu_single);
13271        assert!(info.capabilities.supports_cpu_batch);
13272        assert!(!info.capabilities.supports_cuda_batch);
13273        assert!(!info.capabilities.supports_cuda_vram);
13274    }
13275
13276    #[test]
13277    fn monotonicity_index_is_registered_for_cpu_batch_only() {
13278        assert!(supplemental_supports_cpu_batch("monotonicity_index"));
13279        assert!(!supplemental_supports_cuda_batch("monotonicity_index"));
13280        let info = get_indicator("monotonicity_index").unwrap();
13281        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13282        assert_eq!(info.outputs.len(), 3);
13283        assert_eq!(info.outputs[0].id, "index");
13284        assert_eq!(info.outputs[1].id, "cumulative_mean");
13285        assert_eq!(info.outputs[2].id, "upper_bound");
13286        assert_eq!(info.params.len(), 4);
13287        assert_eq!(info.params[0].key, "length");
13288        assert_eq!(info.params[1].key, "mode");
13289        assert_eq!(info.params[2].key, "index_smooth");
13290        assert_eq!(info.params[3].key, "source");
13291        assert!(info.capabilities.supports_cpu_single);
13292        assert!(info.capabilities.supports_cpu_batch);
13293        assert!(!info.capabilities.supports_cuda_batch);
13294        assert!(!info.capabilities.supports_cuda_vram);
13295    }
13296
13297    #[test]
13298    fn half_causal_estimator_is_registered_for_cpu_batch_only() {
13299        assert!(supplemental_supports_cpu_batch("half_causal_estimator"));
13300        assert!(!supplemental_supports_cuda_batch("half_causal_estimator"));
13301        let info = get_indicator("half_causal_estimator").unwrap();
13302        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13303        assert_eq!(info.outputs.len(), 2);
13304        assert_eq!(info.outputs[0].id, "estimate");
13305        assert_eq!(info.outputs[1].id, "expected_value");
13306        assert_eq!(info.params.len(), 10);
13307        assert_eq!(info.params[0].key, "slots_per_day");
13308        assert_eq!(info.params[1].key, "data_period");
13309        assert_eq!(info.params[9].key, "source");
13310        assert!(info.capabilities.supports_cpu_single);
13311        assert!(info.capabilities.supports_cpu_batch);
13312        assert!(!info.capabilities.supports_cuda_batch);
13313        assert!(!info.capabilities.supports_cuda_vram);
13314    }
13315
13316    #[test]
13317    fn bull_power_vs_bear_power_is_registered_for_cpu_batch_only() {
13318        assert!(supplemental_supports_cpu_batch("bull_power_vs_bear_power"));
13319        assert!(!supplemental_supports_cuda_batch(
13320            "bull_power_vs_bear_power"
13321        ));
13322        let info = get_indicator("bull_power_vs_bear_power").unwrap();
13323        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13324        assert_eq!(info.outputs.len(), 1);
13325        assert_eq!(info.outputs[0].id, "value");
13326        assert_eq!(info.params.len(), 1);
13327        assert_eq!(info.params[0].key, "period");
13328        assert!(info.capabilities.supports_cpu_single);
13329        assert!(info.capabilities.supports_cpu_batch);
13330        assert!(!info.capabilities.supports_cuda_batch);
13331        assert!(!info.capabilities.supports_cuda_vram);
13332    }
13333
13334    #[test]
13335    fn didi_index_is_registered_for_cpu_batch_only() {
13336        assert!(supplemental_supports_cpu_batch("didi_index"));
13337        assert!(!supplemental_supports_cuda_batch("didi_index"));
13338        let info = get_indicator("didi_index").unwrap();
13339        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13340        assert_eq!(info.outputs.len(), 4);
13341        assert_eq!(info.outputs[0].id, "short");
13342        assert_eq!(info.outputs[1].id, "long");
13343        assert_eq!(info.outputs[2].id, "crossover");
13344        assert_eq!(info.outputs[3].id, "crossunder");
13345        assert_eq!(info.params.len(), 3);
13346        assert!(info.capabilities.supports_cpu_single);
13347        assert!(info.capabilities.supports_cpu_batch);
13348        assert!(!info.capabilities.supports_cuda_batch);
13349        assert!(!info.capabilities.supports_cuda_vram);
13350    }
13351
13352    #[test]
13353    fn ehlers_autocorrelation_periodogram_is_registered_for_cpu_batch_only() {
13354        assert!(supplemental_supports_cpu_batch(
13355            "ehlers_autocorrelation_periodogram"
13356        ));
13357        assert!(!supplemental_supports_cuda_batch(
13358            "ehlers_autocorrelation_periodogram"
13359        ));
13360        let info = get_indicator("ehlers_autocorrelation_periodogram").unwrap();
13361        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13362        assert_eq!(info.outputs.len(), 2);
13363        assert_eq!(info.outputs[0].id, "dominant_cycle");
13364        assert_eq!(info.outputs[1].id, "normalized_power");
13365        assert_eq!(info.params.len(), 4);
13366        assert_eq!(info.params[0].key, "min_period");
13367        assert_eq!(info.params[1].key, "max_period");
13368        assert_eq!(info.params[2].key, "avg_length");
13369        assert_eq!(info.params[3].key, "enhance");
13370        assert!(info.capabilities.supports_cpu_single);
13371        assert!(info.capabilities.supports_cpu_batch);
13372        assert!(!info.capabilities.supports_cuda_batch);
13373        assert!(!info.capabilities.supports_cuda_vram);
13374    }
13375
13376    #[test]
13377    fn ehlers_linear_extrapolation_predictor_is_registered_for_cpu_batch_only() {
13378        assert!(supplemental_supports_cpu_batch(
13379            "ehlers_linear_extrapolation_predictor"
13380        ));
13381        assert!(!supplemental_supports_cuda_batch(
13382            "ehlers_linear_extrapolation_predictor"
13383        ));
13384        let info = get_indicator("ehlers_linear_extrapolation_predictor").unwrap();
13385        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13386        assert_eq!(info.outputs.len(), 5);
13387        assert_eq!(info.outputs[0].id, "prediction");
13388        assert_eq!(info.outputs[1].id, "filter");
13389        assert_eq!(info.outputs[2].id, "state");
13390        assert_eq!(info.outputs[3].id, "go_long");
13391        assert_eq!(info.outputs[4].id, "go_short");
13392        assert_eq!(info.params.len(), 5);
13393        assert_eq!(info.params[0].key, "high_pass_length");
13394        assert_eq!(info.params[1].key, "low_pass_length");
13395        assert_eq!(info.params[2].key, "gain");
13396        assert_eq!(info.params[3].key, "bars_forward");
13397        assert_eq!(info.params[4].key, "signal_mode");
13398        assert!(info.capabilities.supports_cpu_single);
13399        assert!(info.capabilities.supports_cpu_batch);
13400        assert!(!info.capabilities.supports_cuda_batch);
13401        assert!(!info.capabilities.supports_cuda_vram);
13402    }
13403
13404    #[test]
13405    fn vertical_horizontal_filter_is_registered_for_cpu_batch_only() {
13406        assert!(supplemental_supports_cpu_batch(
13407            "vertical_horizontal_filter"
13408        ));
13409        assert!(!supplemental_supports_cuda_batch(
13410            "vertical_horizontal_filter"
13411        ));
13412        let info = get_indicator("vertical_horizontal_filter").unwrap();
13413        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13414        assert_eq!(info.outputs.len(), 1);
13415        assert_eq!(info.outputs[0].id, "value");
13416        assert_eq!(info.params.len(), 1);
13417        assert_eq!(info.params[0].key, "length");
13418        assert!(info.capabilities.supports_cpu_single);
13419        assert!(info.capabilities.supports_cpu_batch);
13420        assert!(!info.capabilities.supports_cuda_batch);
13421        assert!(!info.capabilities.supports_cuda_vram);
13422    }
13423
13424    #[test]
13425    fn squeeze_index_is_registered_for_cpu_batch_only() {
13426        assert!(supplemental_supports_cpu_batch("squeeze_index"));
13427        assert!(!supplemental_supports_cuda_batch("squeeze_index"));
13428        let info = get_indicator("squeeze_index").unwrap();
13429        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13430        assert_eq!(info.outputs.len(), 1);
13431        assert_eq!(info.outputs[0].id, "value");
13432        assert_eq!(info.params.len(), 2);
13433        assert_eq!(info.params[0].key, "conv");
13434        assert_eq!(info.params[1].key, "length");
13435        assert!(info.capabilities.supports_cpu_single);
13436        assert!(info.capabilities.supports_cpu_batch);
13437        assert!(!info.capabilities.supports_cuda_batch);
13438        assert!(!info.capabilities.supports_cuda_vram);
13439    }
13440
13441    #[test]
13442    fn stochastic_distance_is_registered_for_cpu_batch_only() {
13443        assert!(supplemental_supports_cpu_batch("stochastic_distance"));
13444        assert!(!supplemental_supports_cuda_batch("stochastic_distance"));
13445        let info = get_indicator("stochastic_distance").unwrap();
13446        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13447        assert_eq!(info.outputs.len(), 2);
13448        assert_eq!(info.outputs[0].id, "oscillator");
13449        assert_eq!(info.outputs[1].id, "signal");
13450        assert_eq!(info.params.len(), 5);
13451        assert_eq!(info.params[0].key, "lookback_length");
13452        assert_eq!(info.params[1].key, "length1");
13453        assert_eq!(info.params[2].key, "length2");
13454        assert_eq!(info.params[3].key, "ob_level");
13455        assert_eq!(info.params[4].key, "os_level");
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 adaptive_bandpass_trigger_oscillator_is_registered_for_cpu_batch_only() {
13464        assert!(supplemental_supports_cpu_batch(
13465            "adaptive_bandpass_trigger_oscillator"
13466        ));
13467        assert!(!supplemental_supports_cuda_batch(
13468            "adaptive_bandpass_trigger_oscillator"
13469        ));
13470        let info = get_indicator("adaptive_bandpass_trigger_oscillator").unwrap();
13471        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13472        assert_eq!(info.outputs.len(), 2);
13473        assert_eq!(info.outputs[0].id, "in_phase");
13474        assert_eq!(info.outputs[1].id, "lead");
13475        assert_eq!(info.params.len(), 2);
13476        assert_eq!(info.params[0].key, "delta");
13477        assert_eq!(info.params[1].key, "alpha");
13478        assert!(info.capabilities.supports_cpu_single);
13479        assert!(info.capabilities.supports_cpu_batch);
13480        assert!(!info.capabilities.supports_cuda_batch);
13481        assert!(!info.capabilities.supports_cuda_vram);
13482    }
13483
13484    #[test]
13485    fn absolute_strength_index_oscillator_is_registered_for_cpu_batch_only() {
13486        assert!(supplemental_supports_cpu_batch(
13487            "absolute_strength_index_oscillator"
13488        ));
13489        assert!(!supplemental_supports_cuda_batch(
13490            "absolute_strength_index_oscillator"
13491        ));
13492        let info = get_indicator("absolute_strength_index_oscillator").unwrap();
13493        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13494        assert_eq!(info.outputs.len(), 3);
13495        assert_eq!(info.outputs[0].id, "oscillator");
13496        assert_eq!(info.outputs[1].id, "signal");
13497        assert_eq!(info.outputs[2].id, "histogram");
13498        assert_eq!(info.params.len(), 2);
13499        assert_eq!(info.params[0].key, "ema_length");
13500        assert_eq!(info.params[1].key, "signal_length");
13501        assert!(info.capabilities.supports_cpu_single);
13502        assert!(info.capabilities.supports_cpu_batch);
13503        assert!(!info.capabilities.supports_cuda_batch);
13504        assert!(!info.capabilities.supports_cuda_vram);
13505    }
13506
13507    #[test]
13508    fn premier_rsi_oscillator_is_registered_for_cpu_batch_only() {
13509        assert!(supplemental_supports_cpu_batch("premier_rsi_oscillator"));
13510        assert!(!supplemental_supports_cuda_batch("premier_rsi_oscillator"));
13511        let info = get_indicator("premier_rsi_oscillator").unwrap();
13512        assert_eq!(info.input_kind, IndicatorInputKind::Slice);
13513        assert_eq!(info.outputs.len(), 1);
13514        assert_eq!(info.outputs[0].id, "value");
13515        assert_eq!(info.params.len(), 3);
13516        assert_eq!(info.params[0].key, "rsi_length");
13517        assert_eq!(info.params[1].key, "stoch_length");
13518        assert_eq!(info.params[2].key, "smooth_length");
13519        assert!(info.capabilities.supports_cpu_single);
13520        assert!(info.capabilities.supports_cpu_batch);
13521        assert!(!info.capabilities.supports_cuda_batch);
13522        assert!(!info.capabilities.supports_cuda_vram);
13523    }
13524
13525    #[test]
13526    fn multi_length_stochastic_average_is_registered_for_cpu_batch_only() {
13527        assert!(supplemental_supports_cpu_batch(
13528            "multi_length_stochastic_average"
13529        ));
13530        assert!(!supplemental_supports_cuda_batch(
13531            "multi_length_stochastic_average"
13532        ));
13533        let info = get_indicator("multi_length_stochastic_average").unwrap();
13534        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13535        assert_eq!(info.outputs.len(), 1);
13536        assert_eq!(info.outputs[0].id, "value");
13537        assert_eq!(info.params.len(), 6);
13538        assert_eq!(info.params[0].key, "length");
13539        assert_eq!(info.params[1].key, "presmooth");
13540        assert_eq!(info.params[2].key, "premethod");
13541        assert_eq!(info.params[3].key, "postsmooth");
13542        assert_eq!(info.params[4].key, "postmethod");
13543        assert_eq!(info.params[5].key, "source");
13544        assert!(info.capabilities.supports_cpu_single);
13545        assert!(info.capabilities.supports_cpu_batch);
13546        assert!(!info.capabilities.supports_cuda_batch);
13547        assert!(!info.capabilities.supports_cuda_vram);
13548    }
13549
13550    #[test]
13551    fn hull_butterfly_oscillator_is_registered_for_cpu_batch_only() {
13552        assert!(supplemental_supports_cpu_batch("hull_butterfly_oscillator"));
13553        assert!(!supplemental_supports_cuda_batch(
13554            "hull_butterfly_oscillator"
13555        ));
13556        let info = get_indicator("hull_butterfly_oscillator").unwrap();
13557        assert_eq!(info.input_kind, IndicatorInputKind::Candles);
13558        assert_eq!(info.outputs.len(), 3);
13559        assert_eq!(info.outputs[0].id, "oscillator");
13560        assert_eq!(info.outputs[1].id, "cumulative_mean");
13561        assert_eq!(info.outputs[2].id, "signal");
13562        assert_eq!(info.params.len(), 3);
13563        assert_eq!(info.params[0].key, "length");
13564        assert_eq!(info.params[1].key, "mult");
13565        assert_eq!(info.params[2].key, "source");
13566        assert!(info.capabilities.supports_cpu_single);
13567        assert!(info.capabilities.supports_cpu_batch);
13568        assert!(!info.capabilities.supports_cuda_batch);
13569        assert!(!info.capabilities.supports_cuda_vram);
13570    }
13571
13572    #[test]
13573    fn fibonacci_trailing_stop_is_registered_for_cpu_batch_only() {
13574        assert!(supplemental_supports_cpu_batch("fibonacci_trailing_stop"));
13575        assert!(!supplemental_supports_cuda_batch("fibonacci_trailing_stop"));
13576        let info = get_indicator("fibonacci_trailing_stop").unwrap();
13577        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13578        assert_eq!(info.outputs.len(), 4);
13579        assert_eq!(info.outputs[0].id, "trailing_stop");
13580        assert_eq!(info.outputs[1].id, "long_stop");
13581        assert_eq!(info.outputs[2].id, "short_stop");
13582        assert_eq!(info.outputs[3].id, "direction");
13583        assert_eq!(info.params.len(), 4);
13584        assert_eq!(info.params[0].key, "left_bars");
13585        assert_eq!(info.params[1].key, "right_bars");
13586        assert_eq!(info.params[2].key, "level");
13587        assert_eq!(info.params[3].key, "trigger");
13588        assert!(info.capabilities.supports_cpu_single);
13589        assert!(info.capabilities.supports_cpu_batch);
13590        assert!(!info.capabilities.supports_cuda_batch);
13591        assert!(!info.capabilities.supports_cuda_vram);
13592    }
13593
13594    #[test]
13595    fn fibonacci_entry_bands_is_registered_for_cpu_batch_only() {
13596        assert!(supplemental_supports_cpu_batch("fibonacci_entry_bands"));
13597        assert!(!supplemental_supports_cuda_batch("fibonacci_entry_bands"));
13598        let info = get_indicator("fibonacci_entry_bands").unwrap();
13599        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13600        assert_eq!(info.outputs.len(), 18);
13601        assert_eq!(info.outputs[0].id, "middle");
13602        assert_eq!(info.outputs[1].id, "trend");
13603        assert_eq!(info.outputs[10].id, "tp_long_band");
13604        assert_eq!(info.outputs[11].id, "tp_short_band");
13605        assert_eq!(info.outputs[12].id, "go_long");
13606        assert_eq!(info.outputs[13].id, "go_short");
13607        assert_eq!(info.params.len(), 5);
13608        assert_eq!(info.params[0].key, "source");
13609        assert_eq!(info.params[1].key, "length");
13610        assert_eq!(info.params[2].key, "atr_length");
13611        assert_eq!(info.params[3].key, "use_atr");
13612        assert_eq!(info.params[4].key, "tp_aggressiveness");
13613        assert!(info.capabilities.supports_cpu_single);
13614        assert!(info.capabilities.supports_cpu_batch);
13615        assert!(!info.capabilities.supports_cuda_batch);
13616        assert!(!info.capabilities.supports_cuda_vram);
13617    }
13618
13619    #[test]
13620    fn volume_energy_reservoirs_is_registered_for_cpu_batch_only() {
13621        assert!(supplemental_supports_cpu_batch("volume_energy_reservoirs"));
13622        assert!(!supplemental_supports_cuda_batch(
13623            "volume_energy_reservoirs"
13624        ));
13625        let info = get_indicator("volume_energy_reservoirs").unwrap();
13626        assert_eq!(info.input_kind, IndicatorInputKind::Ohlcv);
13627        assert_eq!(info.outputs.len(), 6);
13628        assert_eq!(info.outputs[0].id, "momentum");
13629        assert_eq!(info.outputs[1].id, "reservoir");
13630        assert_eq!(info.outputs[2].id, "squeeze_active");
13631        assert_eq!(info.outputs[3].id, "squeeze_start");
13632        assert_eq!(info.outputs[4].id, "range_high");
13633        assert_eq!(info.outputs[5].id, "range_low");
13634        assert_eq!(info.params.len(), 2);
13635        assert_eq!(info.params[0].key, "length");
13636        assert_eq!(info.params[1].key, "sensitivity");
13637        assert!(info.capabilities.supports_cpu_single);
13638        assert!(info.capabilities.supports_cpu_batch);
13639        assert!(!info.capabilities.supports_cuda_batch);
13640        assert!(!info.capabilities.supports_cuda_vram);
13641    }
13642
13643    #[test]
13644    fn neighboring_trailing_stop_is_registered_for_cpu_batch_only() {
13645        assert!(supplemental_supports_cpu_batch("neighboring_trailing_stop"));
13646        assert!(!supplemental_supports_cuda_batch(
13647            "neighboring_trailing_stop"
13648        ));
13649        let info = get_indicator("neighboring_trailing_stop").unwrap();
13650        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13651        assert_eq!(info.outputs.len(), 6);
13652        assert_eq!(info.outputs[0].id, "trailing_stop");
13653        assert_eq!(info.outputs[1].id, "bullish_band");
13654        assert_eq!(info.outputs[2].id, "bearish_band");
13655        assert_eq!(info.outputs[3].id, "direction");
13656        assert_eq!(info.outputs[4].id, "discovery_bull");
13657        assert_eq!(info.outputs[5].id, "discovery_bear");
13658        assert_eq!(info.params.len(), 4);
13659        assert_eq!(info.params[0].key, "buffer_size");
13660        assert_eq!(info.params[1].key, "k");
13661        assert_eq!(info.params[2].key, "percentile");
13662        assert_eq!(info.params[3].key, "smooth");
13663        assert!(info.capabilities.supports_cpu_single);
13664        assert!(info.capabilities.supports_cpu_batch);
13665        assert!(!info.capabilities.supports_cuda_batch);
13666        assert!(!info.capabilities.supports_cuda_vram);
13667    }
13668
13669    #[test]
13670    fn macd_wave_signal_pro_is_registered_for_cpu_batch_only() {
13671        assert!(supplemental_supports_cpu_batch("macd_wave_signal_pro"));
13672        assert!(!supplemental_supports_cuda_batch("macd_wave_signal_pro"));
13673        let info = get_indicator("macd_wave_signal_pro").unwrap();
13674        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13675        assert_eq!(info.outputs.len(), 6);
13676        assert_eq!(info.outputs[0].id, "diff");
13677        assert_eq!(info.outputs[1].id, "dea");
13678        assert_eq!(info.outputs[2].id, "macd_histogram");
13679        assert_eq!(info.outputs[3].id, "line_convergence");
13680        assert_eq!(info.outputs[4].id, "buy_signal");
13681        assert_eq!(info.outputs[5].id, "sell_signal");
13682        assert!(info.params.is_empty());
13683        assert!(info.capabilities.supports_cpu_single);
13684        assert!(info.capabilities.supports_cpu_batch);
13685        assert!(!info.capabilities.supports_cuda_batch);
13686        assert!(!info.capabilities.supports_cuda_vram);
13687    }
13688
13689    #[test]
13690    fn hema_trend_levels_is_registered_for_cpu_batch_only() {
13691        assert!(supplemental_supports_cpu_batch("hema_trend_levels"));
13692        assert!(!supplemental_supports_cuda_batch("hema_trend_levels"));
13693        let info = get_indicator("hema_trend_levels").unwrap();
13694        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13695        assert_eq!(info.outputs.len(), 15);
13696        assert_eq!(info.outputs[0].id, "fast_hema");
13697        assert_eq!(info.outputs[1].id, "slow_hema");
13698        assert_eq!(info.outputs[2].id, "trend_direction");
13699        assert_eq!(info.outputs[3].id, "bar_state");
13700        assert_eq!(info.outputs[4].id, "bullish_crossover");
13701        assert_eq!(info.outputs[5].id, "bearish_crossunder");
13702        assert_eq!(info.outputs[6].id, "box_offset");
13703        assert_eq!(info.outputs[7].id, "bull_box_top");
13704        assert_eq!(info.outputs[8].id, "bull_box_bottom");
13705        assert_eq!(info.outputs[9].id, "bear_box_top");
13706        assert_eq!(info.outputs[10].id, "bear_box_bottom");
13707        assert_eq!(info.outputs[11].id, "bullish_test");
13708        assert_eq!(info.outputs[12].id, "bearish_test");
13709        assert_eq!(info.outputs[13].id, "bullish_test_level");
13710        assert_eq!(info.outputs[14].id, "bearish_test_level");
13711        assert_eq!(info.params.len(), 2);
13712        assert!(info.capabilities.supports_cpu_single);
13713        assert!(info.capabilities.supports_cpu_batch);
13714        assert!(!info.capabilities.supports_cuda_batch);
13715        assert!(!info.capabilities.supports_cuda_vram);
13716    }
13717
13718    #[test]
13719    fn grover_llorens_cycle_oscillator_is_registered_for_cpu_batch_only() {
13720        assert!(supplemental_supports_cpu_batch(
13721            "grover_llorens_cycle_oscillator"
13722        ));
13723        assert!(!supplemental_supports_cuda_batch(
13724            "grover_llorens_cycle_oscillator"
13725        ));
13726        let info = get_indicator("grover_llorens_cycle_oscillator").unwrap();
13727        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13728        assert_eq!(info.outputs.len(), 1);
13729        assert_eq!(info.outputs[0].id, "value");
13730        assert_eq!(info.params.len(), 5);
13731        assert_eq!(info.params[0].key, "length");
13732        assert_eq!(info.params[1].key, "mult");
13733        assert_eq!(info.params[2].key, "source");
13734        assert_eq!(info.params[3].key, "smooth");
13735        assert_eq!(info.params[4].key, "rsi_period");
13736        assert!(info.capabilities.supports_cpu_single);
13737        assert!(info.capabilities.supports_cpu_batch);
13738        assert!(!info.capabilities.supports_cuda_batch);
13739        assert!(!info.capabilities.supports_cuda_vram);
13740    }
13741
13742    #[test]
13743    fn intraday_momentum_index_is_registered_for_cpu_batch_only() {
13744        assert!(supplemental_supports_cpu_batch("intraday_momentum_index"));
13745        assert!(!supplemental_supports_cuda_batch("intraday_momentum_index"));
13746        let info = get_indicator("intraday_momentum_index").unwrap();
13747        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13748        assert_eq!(info.outputs.len(), 4);
13749        assert_eq!(info.outputs[0].id, "imi");
13750        assert_eq!(info.outputs[1].id, "upper_hit");
13751        assert_eq!(info.outputs[2].id, "lower_hit");
13752        assert_eq!(info.outputs[3].id, "signal");
13753        assert_eq!(info.params.len(), 6);
13754        assert_eq!(info.params[0].key, "length");
13755        assert_eq!(info.params[1].key, "length_ma");
13756        assert_eq!(info.params[2].key, "mult");
13757        assert_eq!(info.params[3].key, "length_bb");
13758        assert_eq!(info.params[4].key, "apply_smoothing");
13759        assert_eq!(info.params[5].key, "low_band");
13760        assert!(info.capabilities.supports_cpu_single);
13761        assert!(info.capabilities.supports_cpu_batch);
13762        assert!(!info.capabilities.supports_cuda_batch);
13763        assert!(!info.capabilities.supports_cuda_vram);
13764    }
13765
13766    #[test]
13767    fn vwap_zscore_with_signals_is_registered_for_cpu_batch_only() {
13768        assert!(supplemental_supports_cpu_batch("vwap_zscore_with_signals"));
13769        assert!(!supplemental_supports_cuda_batch(
13770            "vwap_zscore_with_signals"
13771        ));
13772        let info = get_indicator("vwap_zscore_with_signals").unwrap();
13773        assert_eq!(info.input_kind, IndicatorInputKind::CloseVolume);
13774        assert_eq!(info.outputs.len(), 3);
13775        assert_eq!(info.outputs[0].id, "zvwap");
13776        assert_eq!(info.outputs[1].id, "support_signal");
13777        assert_eq!(info.outputs[2].id, "resistance_signal");
13778        assert_eq!(info.params.len(), 3);
13779        assert_eq!(info.params[0].key, "length");
13780        assert_eq!(info.params[1].key, "upper_bottom");
13781        assert_eq!(info.params[2].key, "lower_bottom");
13782        assert!(info.capabilities.supports_cpu_single);
13783        assert!(info.capabilities.supports_cpu_batch);
13784        assert!(!info.capabilities.supports_cuda_batch);
13785        assert!(!info.capabilities.supports_cuda_vram);
13786    }
13787
13788    #[test]
13789    fn atr_percentile_is_registered_for_cpu_batch_only() {
13790        assert!(supplemental_supports_cpu_batch("atr_percentile"));
13791        assert!(!supplemental_supports_cuda_batch("atr_percentile"));
13792        let info = get_indicator("atr_percentile").unwrap();
13793        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
13794        assert_eq!(info.outputs.len(), 1);
13795        assert_eq!(info.outputs[0].id, "value");
13796        assert_eq!(info.params.len(), 2);
13797        assert_eq!(info.params[0].key, "atr_length");
13798        assert_eq!(info.params[1].key, "percentile_length");
13799        assert!(info.capabilities.supports_cpu_single);
13800        assert!(info.capabilities.supports_cpu_batch);
13801        assert!(!info.capabilities.supports_cuda_batch);
13802        assert!(!info.capabilities.supports_cuda_vram);
13803    }
13804
13805    #[test]
13806    fn gopalakrishnan_range_index_is_registered_for_cpu_batch_only() {
13807        assert!(supplemental_supports_cpu_batch(
13808            "gopalakrishnan_range_index"
13809        ));
13810        assert!(!supplemental_supports_cuda_batch(
13811            "gopalakrishnan_range_index"
13812        ));
13813        let info = get_indicator("gopalakrishnan_range_index").unwrap();
13814        assert_eq!(info.input_kind, IndicatorInputKind::HighLow);
13815        assert_eq!(info.outputs.len(), 1);
13816        assert_eq!(info.outputs[0].id, "value");
13817        assert_eq!(info.params.len(), 1);
13818        assert_eq!(info.params[0].key, "length");
13819        assert!(info.capabilities.supports_cpu_single);
13820        assert!(info.capabilities.supports_cpu_batch);
13821        assert!(!info.capabilities.supports_cuda_batch);
13822        assert!(!info.capabilities.supports_cuda_vram);
13823    }
13824
13825    #[test]
13826    fn demand_index_is_registered_for_cpu_batch_only() {
13827        assert!(supplemental_supports_cpu_batch("demand_index"));
13828        assert!(!supplemental_supports_cuda_batch("demand_index"));
13829        let info = get_indicator("demand_index").unwrap();
13830        assert_eq!(info.input_kind, IndicatorInputKind::Ohlcv);
13831        assert_eq!(info.outputs.len(), 2);
13832        assert_eq!(info.outputs[0].id, "demand_index");
13833        assert_eq!(info.outputs[1].id, "signal");
13834        assert_eq!(info.params.len(), 4);
13835        assert_eq!(info.params[0].key, "len_bs");
13836        assert_eq!(info.params[1].key, "len_bs_ma");
13837        assert_eq!(info.params[2].key, "len_di_ma");
13838        assert_eq!(info.params[3].key, "ma_type");
13839        assert!(info.capabilities.supports_cpu_single);
13840        assert!(info.capabilities.supports_cpu_batch);
13841        assert!(!info.capabilities.supports_cuda_batch);
13842        assert!(!info.capabilities.supports_cuda_vram);
13843    }
13844}