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    "alligator",
91    "alphatrend",
92    "aroon",
93    "aso",
94    "bandpass",
95    "bollinger_bands_width",
96    "chande",
97    "chandelier_exit",
98    "cksp",
99    "correlation_cycle",
100    "damiani_volatmeter",
101    "di",
102    "dm",
103    "donchian",
104    "dvdiqqe",
105    "emd",
106    "eri",
107    "fisher",
108    "fvg_trailing_stop",
109    "gatorosc",
110    "halftrend",
111    "kdj",
112    "keltner",
113    "kst",
114    "lpc",
115    "mab",
116    "macz",
117    "mama",
118    "minmax",
119    "msw",
120    "nadaraya_watson_envelope",
121    "otto",
122    "pma",
123    "prb",
124    "qqe",
125    "range_filter",
126    "rsmk",
127    "squeeze_momentum",
128    "srsi",
129    "supertrend",
130    "vi",
131    "voss",
132    "wavetrend",
133    "wto",
134    "ehlers_pma",
135    "buff_averages",
136    "vwap",
137    "pivot",
138];
139
140const EMPTY_ENUM_VALUES: &[&str] = &[];
141const ENUM_VALUES_TRUE_FALSE: &[&str] = &["true", "false"];
142const ENUM_VALUES_MA_OUTPUT: &[&str] = &["mama", "fama"];
143const ENUM_VALUES_PMA_OUTPUT: &[&str] = &["predict", "trigger"];
144const ENUM_VALUES_BUFF_OUTPUT: &[&str] = &["fast", "slow"];
145
146const OUTPUT_VALUE_F64: IndicatorOutputInfo = IndicatorOutputInfo {
147    id: "value",
148    label: "Value",
149    value_type: IndicatorValueType::F64,
150};
151
152const OUTPUT_VALUE_BOOL: IndicatorOutputInfo = IndicatorOutputInfo {
153    id: "value",
154    label: "Value",
155    value_type: IndicatorValueType::Bool,
156};
157
158const OUTPUT_MATRIX: IndicatorOutputInfo = IndicatorOutputInfo {
159    id: "matrix",
160    label: "Matrix",
161    value_type: IndicatorValueType::Bool,
162};
163
164const OUTPUT_MACD: IndicatorOutputInfo = IndicatorOutputInfo {
165    id: "macd",
166    label: "MACD",
167    value_type: IndicatorValueType::F64,
168};
169const OUTPUT_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
170    id: "signal",
171    label: "Signal",
172    value_type: IndicatorValueType::F64,
173};
174const OUTPUT_HIST: IndicatorOutputInfo = IndicatorOutputInfo {
175    id: "hist",
176    label: "Histogram",
177    value_type: IndicatorValueType::F64,
178};
179const OUTPUT_UPPER: IndicatorOutputInfo = IndicatorOutputInfo {
180    id: "upper",
181    label: "Upper",
182    value_type: IndicatorValueType::F64,
183};
184const OUTPUT_MIDDLE: IndicatorOutputInfo = IndicatorOutputInfo {
185    id: "middle",
186    label: "Middle",
187    value_type: IndicatorValueType::F64,
188};
189const OUTPUT_LOWER: IndicatorOutputInfo = IndicatorOutputInfo {
190    id: "lower",
191    label: "Lower",
192    value_type: IndicatorValueType::F64,
193};
194const OUTPUT_K: IndicatorOutputInfo = IndicatorOutputInfo {
195    id: "k",
196    label: "K",
197    value_type: IndicatorValueType::F64,
198};
199const OUTPUT_D: IndicatorOutputInfo = IndicatorOutputInfo {
200    id: "d",
201    label: "D",
202    value_type: IndicatorValueType::F64,
203};
204const OUTPUT_VPCI: IndicatorOutputInfo = IndicatorOutputInfo {
205    id: "vpci",
206    label: "VPCI",
207    value_type: IndicatorValueType::F64,
208};
209const OUTPUT_VPCIS: IndicatorOutputInfo = IndicatorOutputInfo {
210    id: "vpcis",
211    label: "VPCIS",
212    value_type: IndicatorValueType::F64,
213};
214const OUTPUT_MOMENTUM: IndicatorOutputInfo = IndicatorOutputInfo {
215    id: "momentum",
216    label: "Momentum",
217    value_type: IndicatorValueType::F64,
218};
219const OUTPUT_SQUEEZE: IndicatorOutputInfo = IndicatorOutputInfo {
220    id: "squeeze",
221    label: "Squeeze",
222    value_type: IndicatorValueType::F64,
223};
224const OUTPUT_MAMA: IndicatorOutputInfo = IndicatorOutputInfo {
225    id: "mama",
226    label: "MAMA",
227    value_type: IndicatorValueType::F64,
228};
229const OUTPUT_FAMA: IndicatorOutputInfo = IndicatorOutputInfo {
230    id: "fama",
231    label: "FAMA",
232    value_type: IndicatorValueType::F64,
233};
234const OUTPUT_PREDICT: IndicatorOutputInfo = IndicatorOutputInfo {
235    id: "predict",
236    label: "Predict",
237    value_type: IndicatorValueType::F64,
238};
239const OUTPUT_TRIGGER: IndicatorOutputInfo = IndicatorOutputInfo {
240    id: "trigger",
241    label: "Trigger",
242    value_type: IndicatorValueType::F64,
243};
244const OUTPUT_FAST: IndicatorOutputInfo = IndicatorOutputInfo {
245    id: "fast",
246    label: "Fast",
247    value_type: IndicatorValueType::F64,
248};
249const OUTPUT_SLOW: IndicatorOutputInfo = IndicatorOutputInfo {
250    id: "slow",
251    label: "Slow",
252    value_type: IndicatorValueType::F64,
253};
254const OUTPUT_PLUS: IndicatorOutputInfo = IndicatorOutputInfo {
255    id: "plus",
256    label: "Plus",
257    value_type: IndicatorValueType::F64,
258};
259const OUTPUT_MINUS: IndicatorOutputInfo = IndicatorOutputInfo {
260    id: "minus",
261    label: "Minus",
262    value_type: IndicatorValueType::F64,
263};
264const OUTPUT_UP: IndicatorOutputInfo = IndicatorOutputInfo {
265    id: "up",
266    label: "Up",
267    value_type: IndicatorValueType::F64,
268};
269const OUTPUT_DOWN: IndicatorOutputInfo = IndicatorOutputInfo {
270    id: "down",
271    label: "Down",
272    value_type: IndicatorValueType::F64,
273};
274const OUTPUT_TREND: IndicatorOutputInfo = IndicatorOutputInfo {
275    id: "trend",
276    label: "Trend",
277    value_type: IndicatorValueType::F64,
278};
279const OUTPUT_CHANGED: IndicatorOutputInfo = IndicatorOutputInfo {
280    id: "changed",
281    label: "Changed",
282    value_type: IndicatorValueType::F64,
283};
284const OUTPUT_J: IndicatorOutputInfo = IndicatorOutputInfo {
285    id: "j",
286    label: "J",
287    value_type: IndicatorValueType::F64,
288};
289const OUTPUT_MOMENTUM_SIGNAL: IndicatorOutputInfo = IndicatorOutputInfo {
290    id: "signal",
291    label: "Signal",
292    value_type: IndicatorValueType::F64,
293};
294const OUTPUT_WT1: IndicatorOutputInfo = IndicatorOutputInfo {
295    id: "wt1",
296    label: "WT1",
297    value_type: IndicatorValueType::F64,
298};
299const OUTPUT_WT2: IndicatorOutputInfo = IndicatorOutputInfo {
300    id: "wt2",
301    label: "WT2",
302    value_type: IndicatorValueType::F64,
303};
304const OUTPUT_WT_DIFF: IndicatorOutputInfo = IndicatorOutputInfo {
305    id: "wt_diff",
306    label: "WT Diff",
307    value_type: IndicatorValueType::F64,
308};
309const OUTPUT_WAVETREND1: IndicatorOutputInfo = IndicatorOutputInfo {
310    id: "wavetrend1",
311    label: "WaveTrend 1",
312    value_type: IndicatorValueType::F64,
313};
314const OUTPUT_WAVETREND2: IndicatorOutputInfo = IndicatorOutputInfo {
315    id: "wavetrend2",
316    label: "WaveTrend 2",
317    value_type: IndicatorValueType::F64,
318};
319const OUTPUT_WAVETREND: IndicatorOutputInfo = IndicatorOutputInfo {
320    id: "wavetrend",
321    label: "WaveTrend",
322    value_type: IndicatorValueType::F64,
323};
324const OUTPUT_HISTOGRAM: IndicatorOutputInfo = IndicatorOutputInfo {
325    id: "histogram",
326    label: "Histogram",
327    value_type: IndicatorValueType::F64,
328};
329const OUTPUT_YZ: IndicatorOutputInfo = IndicatorOutputInfo {
330    id: "yz",
331    label: "YZ",
332    value_type: IndicatorValueType::F64,
333};
334const OUTPUT_RS: IndicatorOutputInfo = IndicatorOutputInfo {
335    id: "rs",
336    label: "RS",
337    value_type: IndicatorValueType::F64,
338};
339
340const OUTPUTS_VALUE_F64: &[IndicatorOutputInfo] = &[OUTPUT_VALUE_F64];
341const OUTPUTS_VALUE_BOOL: &[IndicatorOutputInfo] = &[OUTPUT_VALUE_BOOL];
342const OUTPUTS_MATRIX_BOOL: &[IndicatorOutputInfo] = &[OUTPUT_MATRIX];
343const OUTPUTS_MACD: &[IndicatorOutputInfo] = &[OUTPUT_MACD, OUTPUT_SIGNAL, OUTPUT_HIST];
344const OUTPUTS_BOLLINGER: &[IndicatorOutputInfo] = &[OUTPUT_UPPER, OUTPUT_MIDDLE, OUTPUT_LOWER];
345const OUTPUTS_STOCH: &[IndicatorOutputInfo] = &[OUTPUT_K, OUTPUT_D];
346const OUTPUTS_VPCI: &[IndicatorOutputInfo] = &[OUTPUT_VPCI, OUTPUT_VPCIS];
347const OUTPUTS_TTM_SQUEEZE: &[IndicatorOutputInfo] = &[OUTPUT_MOMENTUM, OUTPUT_SQUEEZE];
348const OUTPUTS_MAMA: &[IndicatorOutputInfo] = &[OUTPUT_MAMA, OUTPUT_FAMA];
349const OUTPUTS_EHLERS_PMA: &[IndicatorOutputInfo] = &[OUTPUT_PREDICT, OUTPUT_TRIGGER];
350const OUTPUTS_BUFF_AVERAGES: &[IndicatorOutputInfo] = &[OUTPUT_FAST, OUTPUT_SLOW];
351const OUTPUTS_PLUS_MINUS: &[IndicatorOutputInfo] = &[OUTPUT_PLUS, OUTPUT_MINUS];
352const OUTPUTS_UP_DOWN: &[IndicatorOutputInfo] = &[OUTPUT_UP, OUTPUT_DOWN];
353const OUTPUTS_TREND_CHANGED: &[IndicatorOutputInfo] = &[OUTPUT_TREND, OUTPUT_CHANGED];
354const OUTPUTS_KDJ: &[IndicatorOutputInfo] = &[OUTPUT_K, OUTPUT_D, OUTPUT_J];
355const OUTPUTS_SQUEEZE_MOMENTUM: &[IndicatorOutputInfo] =
356    &[OUTPUT_MOMENTUM, OUTPUT_SQUEEZE, OUTPUT_MOMENTUM_SIGNAL];
357const OUTPUTS_WTO: &[IndicatorOutputInfo] =
358    &[OUTPUT_WAVETREND1, OUTPUT_WAVETREND2, OUTPUT_HISTOGRAM];
359const OUTPUTS_WAVETREND: &[IndicatorOutputInfo] = &[OUTPUT_WT1, OUTPUT_WT2, OUTPUT_WT_DIFF];
360const OUTPUTS_MOD_GOD_MODE: &[IndicatorOutputInfo] =
361    &[OUTPUT_WAVETREND, OUTPUT_SIGNAL, OUTPUT_HISTOGRAM];
362const OUTPUTS_YANG_ZHANG: &[IndicatorOutputInfo] = &[OUTPUT_YZ, OUTPUT_RS];
363const OUTPUTS_ACOSC: &[IndicatorOutputInfo] = &[
364    IndicatorOutputInfo {
365        id: "osc",
366        label: "Oscillator",
367        value_type: IndicatorValueType::F64,
368    },
369    IndicatorOutputInfo {
370        id: "change",
371        label: "Change",
372        value_type: IndicatorValueType::F64,
373    },
374];
375const OUTPUTS_ALLIGATOR: &[IndicatorOutputInfo] = &[
376    IndicatorOutputInfo {
377        id: "jaw",
378        label: "Jaw",
379        value_type: IndicatorValueType::F64,
380    },
381    IndicatorOutputInfo {
382        id: "teeth",
383        label: "Teeth",
384        value_type: IndicatorValueType::F64,
385    },
386    IndicatorOutputInfo {
387        id: "lips",
388        label: "Lips",
389        value_type: IndicatorValueType::F64,
390    },
391];
392const OUTPUTS_K1_K2: &[IndicatorOutputInfo] = &[
393    IndicatorOutputInfo {
394        id: "k1",
395        label: "K1",
396        value_type: IndicatorValueType::F64,
397    },
398    IndicatorOutputInfo {
399        id: "k2",
400        label: "K2",
401        value_type: IndicatorValueType::F64,
402    },
403];
404const OUTPUTS_BULLS_BEARS: &[IndicatorOutputInfo] = &[
405    IndicatorOutputInfo {
406        id: "bulls",
407        label: "Bulls",
408        value_type: IndicatorValueType::F64,
409    },
410    IndicatorOutputInfo {
411        id: "bears",
412        label: "Bears",
413        value_type: IndicatorValueType::F64,
414    },
415];
416const OUTPUTS_BANDPASS: &[IndicatorOutputInfo] = &[
417    IndicatorOutputInfo {
418        id: "bp",
419        label: "BandPass",
420        value_type: IndicatorValueType::F64,
421    },
422    IndicatorOutputInfo {
423        id: "bp_normalized",
424        label: "Normalized",
425        value_type: IndicatorValueType::F64,
426    },
427    OUTPUT_SIGNAL,
428    OUTPUT_TRIGGER,
429];
430const OUTPUTS_LONG_SHORT_STOP: &[IndicatorOutputInfo] = &[
431    IndicatorOutputInfo {
432        id: "long_stop",
433        label: "Long Stop",
434        value_type: IndicatorValueType::F64,
435    },
436    IndicatorOutputInfo {
437        id: "short_stop",
438        label: "Short Stop",
439        value_type: IndicatorValueType::F64,
440    },
441];
442const OUTPUTS_LONG_SHORT_VALUES: &[IndicatorOutputInfo] = &[
443    IndicatorOutputInfo {
444        id: "long_values",
445        label: "Long",
446        value_type: IndicatorValueType::F64,
447    },
448    IndicatorOutputInfo {
449        id: "short_values",
450        label: "Short",
451        value_type: IndicatorValueType::F64,
452    },
453];
454const OUTPUTS_CORRELATION_CYCLE: &[IndicatorOutputInfo] = &[
455    IndicatorOutputInfo {
456        id: "real",
457        label: "Real",
458        value_type: IndicatorValueType::F64,
459    },
460    IndicatorOutputInfo {
461        id: "imag",
462        label: "Imag",
463        value_type: IndicatorValueType::F64,
464    },
465    IndicatorOutputInfo {
466        id: "angle",
467        label: "Angle",
468        value_type: IndicatorValueType::F64,
469    },
470    IndicatorOutputInfo {
471        id: "state",
472        label: "State",
473        value_type: IndicatorValueType::F64,
474    },
475];
476const OUTPUTS_VOL_ANTI: &[IndicatorOutputInfo] = &[
477    IndicatorOutputInfo {
478        id: "vol",
479        label: "Vol",
480        value_type: IndicatorValueType::F64,
481    },
482    IndicatorOutputInfo {
483        id: "anti",
484        label: "Anti",
485        value_type: IndicatorValueType::F64,
486    },
487];
488const OUTPUTS_DVDIQQE: &[IndicatorOutputInfo] = &[
489    IndicatorOutputInfo {
490        id: "dvdi",
491        label: "DVDI",
492        value_type: IndicatorValueType::F64,
493    },
494    IndicatorOutputInfo {
495        id: "fast_tl",
496        label: "Fast TL",
497        value_type: IndicatorValueType::F64,
498    },
499    IndicatorOutputInfo {
500        id: "slow_tl",
501        label: "Slow TL",
502        value_type: IndicatorValueType::F64,
503    },
504    IndicatorOutputInfo {
505        id: "center_line",
506        label: "Center Line",
507        value_type: IndicatorValueType::F64,
508    },
509];
510const OUTPUTS_UPPER_MIDDLE_LOWER_BAND: &[IndicatorOutputInfo] = &[
511    IndicatorOutputInfo {
512        id: "upperband",
513        label: "Upper",
514        value_type: IndicatorValueType::F64,
515    },
516    IndicatorOutputInfo {
517        id: "middleband",
518        label: "Middle",
519        value_type: IndicatorValueType::F64,
520    },
521    IndicatorOutputInfo {
522        id: "lowerband",
523        label: "Lower",
524        value_type: IndicatorValueType::F64,
525    },
526];
527const OUTPUTS_BULL_BEAR: &[IndicatorOutputInfo] = &[
528    IndicatorOutputInfo {
529        id: "bull",
530        label: "Bull",
531        value_type: IndicatorValueType::F64,
532    },
533    IndicatorOutputInfo {
534        id: "bear",
535        label: "Bear",
536        value_type: IndicatorValueType::F64,
537    },
538];
539const OUTPUTS_FVG_TS: &[IndicatorOutputInfo] = &[
540    OUTPUT_UPPER,
541    OUTPUT_LOWER,
542    IndicatorOutputInfo {
543        id: "upper_ts",
544        label: "Upper TS",
545        value_type: IndicatorValueType::F64,
546    },
547    IndicatorOutputInfo {
548        id: "lower_ts",
549        label: "Lower TS",
550        value_type: IndicatorValueType::F64,
551    },
552];
553const OUTPUTS_GATOROSC: &[IndicatorOutputInfo] = &[
554    OUTPUT_UPPER,
555    OUTPUT_LOWER,
556    IndicatorOutputInfo {
557        id: "upper_change",
558        label: "Upper Change",
559        value_type: IndicatorValueType::F64,
560    },
561    IndicatorOutputInfo {
562        id: "lower_change",
563        label: "Lower Change",
564        value_type: IndicatorValueType::F64,
565    },
566];
567const OUTPUTS_HALFTREND: &[IndicatorOutputInfo] = &[
568    IndicatorOutputInfo {
569        id: "halftrend",
570        label: "HalfTrend",
571        value_type: IndicatorValueType::F64,
572    },
573    OUTPUT_TREND,
574    IndicatorOutputInfo {
575        id: "atr_high",
576        label: "ATR High",
577        value_type: IndicatorValueType::F64,
578    },
579    IndicatorOutputInfo {
580        id: "atr_low",
581        label: "ATR Low",
582        value_type: IndicatorValueType::F64,
583    },
584    IndicatorOutputInfo {
585        id: "buy_signal",
586        label: "Buy",
587        value_type: IndicatorValueType::F64,
588    },
589    IndicatorOutputInfo {
590        id: "sell_signal",
591        label: "Sell",
592        value_type: IndicatorValueType::F64,
593    },
594];
595const OUTPUTS_LINE_SIGNAL: &[IndicatorOutputInfo] = &[
596    IndicatorOutputInfo {
597        id: "line",
598        label: "Line",
599        value_type: IndicatorValueType::F64,
600    },
601    OUTPUT_SIGNAL,
602];
603const OUTPUTS_FISHER: &[IndicatorOutputInfo] = &[
604    IndicatorOutputInfo {
605        id: "fisher",
606        label: "Fisher",
607        value_type: IndicatorValueType::F64,
608    },
609    OUTPUT_SIGNAL,
610];
611const OUTPUTS_UPPER_LOWER: &[IndicatorOutputInfo] = &[OUTPUT_UPPER, OUTPUT_LOWER];
612const OUTPUTS_FILTER_BANDS: &[IndicatorOutputInfo] = &[
613    IndicatorOutputInfo {
614        id: "filter",
615        label: "Filter",
616        value_type: IndicatorValueType::F64,
617    },
618    IndicatorOutputInfo {
619        id: "high_band",
620        label: "High Band",
621        value_type: IndicatorValueType::F64,
622    },
623    IndicatorOutputInfo {
624        id: "low_band",
625        label: "Low Band",
626        value_type: IndicatorValueType::F64,
627    },
628];
629const OUTPUTS_MINMAX: &[IndicatorOutputInfo] = &[
630    IndicatorOutputInfo {
631        id: "is_min",
632        label: "Is Min",
633        value_type: IndicatorValueType::F64,
634    },
635    IndicatorOutputInfo {
636        id: "is_max",
637        label: "Is Max",
638        value_type: IndicatorValueType::F64,
639    },
640    IndicatorOutputInfo {
641        id: "last_min",
642        label: "Last Min",
643        value_type: IndicatorValueType::F64,
644    },
645    IndicatorOutputInfo {
646        id: "last_max",
647        label: "Last Max",
648        value_type: IndicatorValueType::F64,
649    },
650];
651const OUTPUTS_SINE_LEAD: &[IndicatorOutputInfo] = &[
652    IndicatorOutputInfo {
653        id: "sine",
654        label: "Sine",
655        value_type: IndicatorValueType::F64,
656    },
657    IndicatorOutputInfo {
658        id: "lead",
659        label: "Lead",
660        value_type: IndicatorValueType::F64,
661    },
662];
663const OUTPUTS_HOTT_LOTT: &[IndicatorOutputInfo] = &[
664    IndicatorOutputInfo {
665        id: "hott",
666        label: "HOTT",
667        value_type: IndicatorValueType::F64,
668    },
669    IndicatorOutputInfo {
670        id: "lott",
671        label: "LOTT",
672        value_type: IndicatorValueType::F64,
673    },
674];
675const OUTPUTS_PRB: &[IndicatorOutputInfo] = &[
676    IndicatorOutputInfo {
677        id: "values",
678        label: "Value",
679        value_type: IndicatorValueType::F64,
680    },
681    IndicatorOutputInfo {
682        id: "upper_band",
683        label: "Upper",
684        value_type: IndicatorValueType::F64,
685    },
686    IndicatorOutputInfo {
687        id: "lower_band",
688        label: "Lower",
689        value_type: IndicatorValueType::F64,
690    },
691];
692const OUTPUTS_INDICATOR_SIGNAL: &[IndicatorOutputInfo] = &[
693    IndicatorOutputInfo {
694        id: "indicator",
695        label: "Indicator",
696        value_type: IndicatorValueType::F64,
697    },
698    OUTPUT_SIGNAL,
699];
700const OUTPUTS_VOSS: &[IndicatorOutputInfo] = &[
701    IndicatorOutputInfo {
702        id: "voss",
703        label: "Voss",
704        value_type: IndicatorValueType::F64,
705    },
706    IndicatorOutputInfo {
707        id: "filt",
708        label: "Filter",
709        value_type: IndicatorValueType::F64,
710    },
711];
712const OUTPUTS_PIVOT: &[IndicatorOutputInfo] = &[
713    IndicatorOutputInfo {
714        id: "pp",
715        label: "PP",
716        value_type: IndicatorValueType::F64,
717    },
718    IndicatorOutputInfo {
719        id: "r1",
720        label: "R1",
721        value_type: IndicatorValueType::F64,
722    },
723    IndicatorOutputInfo {
724        id: "r2",
725        label: "R2",
726        value_type: IndicatorValueType::F64,
727    },
728    IndicatorOutputInfo {
729        id: "r3",
730        label: "R3",
731        value_type: IndicatorValueType::F64,
732    },
733    IndicatorOutputInfo {
734        id: "r4",
735        label: "R4",
736        value_type: IndicatorValueType::F64,
737    },
738    IndicatorOutputInfo {
739        id: "s1",
740        label: "S1",
741        value_type: IndicatorValueType::F64,
742    },
743    IndicatorOutputInfo {
744        id: "s2",
745        label: "S2",
746        value_type: IndicatorValueType::F64,
747    },
748    IndicatorOutputInfo {
749        id: "s3",
750        label: "S3",
751        value_type: IndicatorValueType::F64,
752    },
753    IndicatorOutputInfo {
754        id: "s4",
755        label: "S4",
756        value_type: IndicatorValueType::F64,
757    },
758];
759
760const PARAM_PERIOD: IndicatorParamInfo = IndicatorParamInfo {
761    key: "period",
762    label: "Period",
763    kind: IndicatorParamKind::Int,
764    required: true,
765    default: Some(ParamValueStatic::Int(14)),
766    min: Some(1.0),
767    max: None,
768    step: Some(1.0),
769    enum_values: EMPTY_ENUM_VALUES,
770    notes: None,
771};
772
773const PARAMS_PERIOD_ONLY: &[IndicatorParamInfo] = &[PARAM_PERIOD];
774
775const PARAM_OUTPUT_MAMA: IndicatorParamInfo = IndicatorParamInfo {
776    key: "output",
777    label: "Output",
778    kind: IndicatorParamKind::EnumString,
779    required: false,
780    default: Some(ParamValueStatic::EnumString("mama")),
781    min: None,
782    max: None,
783    step: None,
784    enum_values: ENUM_VALUES_MA_OUTPUT,
785    notes: None,
786};
787
788const PARAM_OUTPUT_EHLERS_PMA: IndicatorParamInfo = IndicatorParamInfo {
789    key: "output",
790    label: "Output",
791    kind: IndicatorParamKind::EnumString,
792    required: false,
793    default: Some(ParamValueStatic::EnumString("predict")),
794    min: None,
795    max: None,
796    step: None,
797    enum_values: ENUM_VALUES_PMA_OUTPUT,
798    notes: None,
799};
800
801const PARAM_OUTPUT_BUFF_AVERAGES: IndicatorParamInfo = IndicatorParamInfo {
802    key: "output",
803    label: "Output",
804    kind: IndicatorParamKind::EnumString,
805    required: false,
806    default: Some(ParamValueStatic::EnumString("fast")),
807    min: None,
808    max: None,
809    step: None,
810    enum_values: ENUM_VALUES_BUFF_OUTPUT,
811    notes: None,
812};
813
814const PARAM_ANCHOR: IndicatorParamInfo = IndicatorParamInfo {
815    key: "anchor",
816    label: "Anchor",
817    kind: IndicatorParamKind::EnumString,
818    required: false,
819    default: Some(ParamValueStatic::EnumString("1d")),
820    min: None,
821    max: None,
822    step: None,
823    enum_values: EMPTY_ENUM_VALUES,
824    notes: Some("Anchor string for session boundary"),
825};
826
827const PARAM_STRICT: IndicatorParamInfo = IndicatorParamInfo {
828    key: "strict",
829    label: "Strict",
830    kind: IndicatorParamKind::Bool,
831    required: false,
832    default: Some(ParamValueStatic::Bool(false)),
833    min: None,
834    max: None,
835    step: None,
836    enum_values: ENUM_VALUES_TRUE_FALSE,
837    notes: None,
838};
839
840const PARAM_NONE: &[IndicatorParamInfo] = &[];
841
842const PARAM_RSI_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
843    key: "period",
844    label: "Period",
845    kind: IndicatorParamKind::Int,
846    required: false,
847    default: Some(ParamValueStatic::Int(14)),
848    min: Some(1.0),
849    max: None,
850    step: Some(1.0),
851    enum_values: EMPTY_ENUM_VALUES,
852    notes: None,
853}];
854
855const PARAM_ROC_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
856    key: "period",
857    label: "Period",
858    kind: IndicatorParamKind::Int,
859    required: false,
860    default: Some(ParamValueStatic::Int(9)),
861    min: Some(1.0),
862    max: None,
863    step: Some(1.0),
864    enum_values: EMPTY_ENUM_VALUES,
865    notes: None,
866}];
867
868const PARAM_ADOSC: &[IndicatorParamInfo] = &[
869    IndicatorParamInfo {
870        key: "short_period",
871        label: "Short Period",
872        kind: IndicatorParamKind::Int,
873        required: false,
874        default: Some(ParamValueStatic::Int(3)),
875        min: Some(1.0),
876        max: None,
877        step: Some(1.0),
878        enum_values: EMPTY_ENUM_VALUES,
879        notes: None,
880    },
881    IndicatorParamInfo {
882        key: "long_period",
883        label: "Long Period",
884        kind: IndicatorParamKind::Int,
885        required: false,
886        default: Some(ParamValueStatic::Int(10)),
887        min: Some(1.0),
888        max: None,
889        step: Some(1.0),
890        enum_values: EMPTY_ENUM_VALUES,
891        notes: None,
892    },
893];
894
895const PARAM_AO: &[IndicatorParamInfo] = &[
896    IndicatorParamInfo {
897        key: "short_period",
898        label: "Short Period",
899        kind: IndicatorParamKind::Int,
900        required: false,
901        default: Some(ParamValueStatic::Int(5)),
902        min: Some(1.0),
903        max: None,
904        step: Some(1.0),
905        enum_values: EMPTY_ENUM_VALUES,
906        notes: None,
907    },
908    IndicatorParamInfo {
909        key: "long_period",
910        label: "Long Period",
911        kind: IndicatorParamKind::Int,
912        required: false,
913        default: Some(ParamValueStatic::Int(34)),
914        min: Some(1.0),
915        max: None,
916        step: Some(1.0),
917        enum_values: EMPTY_ENUM_VALUES,
918        notes: None,
919    },
920];
921
922const PARAM_EFI_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
923    key: "period",
924    label: "Period",
925    kind: IndicatorParamKind::Int,
926    required: false,
927    default: Some(ParamValueStatic::Int(13)),
928    min: Some(1.0),
929    max: None,
930    step: Some(1.0),
931    enum_values: EMPTY_ENUM_VALUES,
932    notes: None,
933}];
934
935const PARAM_MFI_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
936    key: "period",
937    label: "Period",
938    kind: IndicatorParamKind::Int,
939    required: false,
940    default: Some(ParamValueStatic::Int(14)),
941    min: Some(1.0),
942    max: None,
943    step: Some(1.0),
944    enum_values: EMPTY_ENUM_VALUES,
945    notes: None,
946}];
947
948const PARAM_MASS_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
949    key: "period",
950    label: "Period",
951    kind: IndicatorParamKind::Int,
952    required: false,
953    default: Some(ParamValueStatic::Int(5)),
954    min: Some(1.0),
955    max: None,
956    step: Some(1.0),
957    enum_values: EMPTY_ENUM_VALUES,
958    notes: None,
959}];
960
961const PARAM_KVO: &[IndicatorParamInfo] = &[
962    IndicatorParamInfo {
963        key: "short_period",
964        label: "Short Period",
965        kind: IndicatorParamKind::Int,
966        required: false,
967        default: Some(ParamValueStatic::Int(2)),
968        min: Some(1.0),
969        max: None,
970        step: Some(1.0),
971        enum_values: EMPTY_ENUM_VALUES,
972        notes: None,
973    },
974    IndicatorParamInfo {
975        key: "long_period",
976        label: "Long Period",
977        kind: IndicatorParamKind::Int,
978        required: false,
979        default: Some(ParamValueStatic::Int(5)),
980        min: Some(1.0),
981        max: None,
982        step: Some(1.0),
983        enum_values: EMPTY_ENUM_VALUES,
984        notes: None,
985    },
986];
987
988const PARAM_VOSC: &[IndicatorParamInfo] = &[
989    IndicatorParamInfo {
990        key: "short_period",
991        label: "Short Period",
992        kind: IndicatorParamKind::Int,
993        required: false,
994        default: Some(ParamValueStatic::Int(2)),
995        min: Some(1.0),
996        max: None,
997        step: Some(1.0),
998        enum_values: EMPTY_ENUM_VALUES,
999        notes: None,
1000    },
1001    IndicatorParamInfo {
1002        key: "long_period",
1003        label: "Long Period",
1004        kind: IndicatorParamKind::Int,
1005        required: false,
1006        default: Some(ParamValueStatic::Int(5)),
1007        min: Some(1.0),
1008        max: None,
1009        step: Some(1.0),
1010        enum_values: EMPTY_ENUM_VALUES,
1011        notes: None,
1012    },
1013];
1014
1015const PARAM_MOM_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1016    key: "period",
1017    label: "Period",
1018    kind: IndicatorParamKind::Int,
1019    required: false,
1020    default: Some(ParamValueStatic::Int(10)),
1021    min: Some(1.0),
1022    max: None,
1023    step: Some(1.0),
1024    enum_values: EMPTY_ENUM_VALUES,
1025    notes: None,
1026}];
1027
1028const PARAM_CMO_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1029    key: "period",
1030    label: "Period",
1031    kind: IndicatorParamKind::Int,
1032    required: false,
1033    default: Some(ParamValueStatic::Int(14)),
1034    min: Some(1.0),
1035    max: None,
1036    step: Some(1.0),
1037    enum_values: EMPTY_ENUM_VALUES,
1038    notes: None,
1039}];
1040
1041const PARAM_ROCP_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1042    key: "period",
1043    label: "Period",
1044    kind: IndicatorParamKind::Int,
1045    required: false,
1046    default: Some(ParamValueStatic::Int(10)),
1047    min: Some(1.0),
1048    max: None,
1049    step: Some(1.0),
1050    enum_values: EMPTY_ENUM_VALUES,
1051    notes: None,
1052}];
1053
1054const PARAM_ROCR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1055    key: "period",
1056    label: "Period",
1057    kind: IndicatorParamKind::Int,
1058    required: false,
1059    default: Some(ParamValueStatic::Int(10)),
1060    min: Some(1.0),
1061    max: None,
1062    step: Some(1.0),
1063    enum_values: EMPTY_ENUM_VALUES,
1064    notes: None,
1065}];
1066
1067const PARAM_PPO: &[IndicatorParamInfo] = &[
1068    IndicatorParamInfo {
1069        key: "fast_period",
1070        label: "Fast Period",
1071        kind: IndicatorParamKind::Int,
1072        required: false,
1073        default: Some(ParamValueStatic::Int(12)),
1074        min: Some(1.0),
1075        max: None,
1076        step: Some(1.0),
1077        enum_values: EMPTY_ENUM_VALUES,
1078        notes: None,
1079    },
1080    IndicatorParamInfo {
1081        key: "slow_period",
1082        label: "Slow Period",
1083        kind: IndicatorParamKind::Int,
1084        required: false,
1085        default: Some(ParamValueStatic::Int(26)),
1086        min: Some(1.0),
1087        max: None,
1088        step: Some(1.0),
1089        enum_values: EMPTY_ENUM_VALUES,
1090        notes: None,
1091    },
1092    IndicatorParamInfo {
1093        key: "ma_type",
1094        label: "MA Type",
1095        kind: IndicatorParamKind::EnumString,
1096        required: false,
1097        default: Some(ParamValueStatic::EnumString("sma")),
1098        min: None,
1099        max: None,
1100        step: None,
1101        enum_values: EMPTY_ENUM_VALUES,
1102        notes: None,
1103    },
1104];
1105
1106const PARAM_TRIX_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1107    key: "period",
1108    label: "Period",
1109    kind: IndicatorParamKind::Int,
1110    required: false,
1111    default: Some(ParamValueStatic::Int(18)),
1112    min: Some(1.0),
1113    max: None,
1114    step: Some(1.0),
1115    enum_values: EMPTY_ENUM_VALUES,
1116    notes: None,
1117}];
1118
1119const PARAM_TSI: &[IndicatorParamInfo] = &[
1120    IndicatorParamInfo {
1121        key: "long_period",
1122        label: "Long Period",
1123        kind: IndicatorParamKind::Int,
1124        required: false,
1125        default: Some(ParamValueStatic::Int(25)),
1126        min: Some(1.0),
1127        max: None,
1128        step: Some(1.0),
1129        enum_values: EMPTY_ENUM_VALUES,
1130        notes: None,
1131    },
1132    IndicatorParamInfo {
1133        key: "short_period",
1134        label: "Short Period",
1135        kind: IndicatorParamKind::Int,
1136        required: false,
1137        default: Some(ParamValueStatic::Int(13)),
1138        min: Some(1.0),
1139        max: None,
1140        step: Some(1.0),
1141        enum_values: EMPTY_ENUM_VALUES,
1142        notes: None,
1143    },
1144];
1145
1146const PARAM_STDDEV: &[IndicatorParamInfo] = &[
1147    IndicatorParamInfo {
1148        key: "period",
1149        label: "Period",
1150        kind: IndicatorParamKind::Int,
1151        required: false,
1152        default: Some(ParamValueStatic::Int(5)),
1153        min: Some(1.0),
1154        max: None,
1155        step: Some(1.0),
1156        enum_values: EMPTY_ENUM_VALUES,
1157        notes: None,
1158    },
1159    IndicatorParamInfo {
1160        key: "nbdev",
1161        label: "NB Dev",
1162        kind: IndicatorParamKind::Float,
1163        required: false,
1164        default: Some(ParamValueStatic::Float(1.0)),
1165        min: None,
1166        max: None,
1167        step: None,
1168        enum_values: EMPTY_ENUM_VALUES,
1169        notes: None,
1170    },
1171];
1172
1173const PARAM_WILLR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1174    key: "period",
1175    label: "Period",
1176    kind: IndicatorParamKind::Int,
1177    required: false,
1178    default: Some(ParamValueStatic::Int(14)),
1179    min: Some(1.0),
1180    max: None,
1181    step: Some(1.0),
1182    enum_values: EMPTY_ENUM_VALUES,
1183    notes: None,
1184}];
1185
1186const PARAM_ULTOSC: &[IndicatorParamInfo] = &[
1187    IndicatorParamInfo {
1188        key: "timeperiod1",
1189        label: "Time Period 1",
1190        kind: IndicatorParamKind::Int,
1191        required: false,
1192        default: Some(ParamValueStatic::Int(7)),
1193        min: Some(1.0),
1194        max: None,
1195        step: Some(1.0),
1196        enum_values: EMPTY_ENUM_VALUES,
1197        notes: None,
1198    },
1199    IndicatorParamInfo {
1200        key: "timeperiod2",
1201        label: "Time Period 2",
1202        kind: IndicatorParamKind::Int,
1203        required: false,
1204        default: Some(ParamValueStatic::Int(14)),
1205        min: Some(1.0),
1206        max: None,
1207        step: Some(1.0),
1208        enum_values: EMPTY_ENUM_VALUES,
1209        notes: None,
1210    },
1211    IndicatorParamInfo {
1212        key: "timeperiod3",
1213        label: "Time Period 3",
1214        kind: IndicatorParamKind::Int,
1215        required: false,
1216        default: Some(ParamValueStatic::Int(28)),
1217        min: Some(1.0),
1218        max: None,
1219        step: Some(1.0),
1220        enum_values: EMPTY_ENUM_VALUES,
1221        notes: None,
1222    },
1223];
1224
1225const PARAM_APO: &[IndicatorParamInfo] = &[
1226    IndicatorParamInfo {
1227        key: "short_period",
1228        label: "Short Period",
1229        kind: IndicatorParamKind::Int,
1230        required: false,
1231        default: Some(ParamValueStatic::Int(10)),
1232        min: Some(1.0),
1233        max: None,
1234        step: Some(1.0),
1235        enum_values: EMPTY_ENUM_VALUES,
1236        notes: None,
1237    },
1238    IndicatorParamInfo {
1239        key: "long_period",
1240        label: "Long Period",
1241        kind: IndicatorParamKind::Int,
1242        required: false,
1243        default: Some(ParamValueStatic::Int(20)),
1244        min: Some(1.0),
1245        max: None,
1246        step: Some(1.0),
1247        enum_values: EMPTY_ENUM_VALUES,
1248        notes: None,
1249    },
1250];
1251
1252const PARAM_CCI_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1253    key: "period",
1254    label: "Period",
1255    kind: IndicatorParamKind::Int,
1256    required: false,
1257    default: Some(ParamValueStatic::Int(14)),
1258    min: Some(1.0),
1259    max: None,
1260    step: Some(1.0),
1261    enum_values: EMPTY_ENUM_VALUES,
1262    notes: None,
1263}];
1264
1265const PARAM_CCI_CYCLE: &[IndicatorParamInfo] = &[
1266    IndicatorParamInfo {
1267        key: "length",
1268        label: "Length",
1269        kind: IndicatorParamKind::Int,
1270        required: false,
1271        default: Some(ParamValueStatic::Int(10)),
1272        min: Some(1.0),
1273        max: None,
1274        step: Some(1.0),
1275        enum_values: EMPTY_ENUM_VALUES,
1276        notes: None,
1277    },
1278    IndicatorParamInfo {
1279        key: "factor",
1280        label: "Factor",
1281        kind: IndicatorParamKind::Float,
1282        required: false,
1283        default: Some(ParamValueStatic::Float(0.5)),
1284        min: Some(0.0),
1285        max: Some(1.0),
1286        step: None,
1287        enum_values: EMPTY_ENUM_VALUES,
1288        notes: None,
1289    },
1290];
1291
1292const PARAM_CFO: &[IndicatorParamInfo] = &[
1293    IndicatorParamInfo {
1294        key: "period",
1295        label: "Period",
1296        kind: IndicatorParamKind::Int,
1297        required: false,
1298        default: Some(ParamValueStatic::Int(14)),
1299        min: Some(1.0),
1300        max: None,
1301        step: Some(1.0),
1302        enum_values: EMPTY_ENUM_VALUES,
1303        notes: None,
1304    },
1305    IndicatorParamInfo {
1306        key: "scalar",
1307        label: "Scalar",
1308        kind: IndicatorParamKind::Float,
1309        required: false,
1310        default: Some(ParamValueStatic::Float(100.0)),
1311        min: None,
1312        max: None,
1313        step: None,
1314        enum_values: EMPTY_ENUM_VALUES,
1315        notes: None,
1316    },
1317];
1318
1319const PARAM_ER_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1320    key: "period",
1321    label: "Period",
1322    kind: IndicatorParamKind::Int,
1323    required: false,
1324    default: Some(ParamValueStatic::Int(5)),
1325    min: Some(1.0),
1326    max: None,
1327    step: Some(1.0),
1328    enum_values: EMPTY_ENUM_VALUES,
1329    notes: None,
1330}];
1331
1332const PARAM_KURTOSIS_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1333    key: "period",
1334    label: "Period",
1335    kind: IndicatorParamKind::Int,
1336    required: false,
1337    default: Some(ParamValueStatic::Int(5)),
1338    min: Some(1.0),
1339    max: None,
1340    step: Some(1.0),
1341    enum_values: EMPTY_ENUM_VALUES,
1342    notes: None,
1343}];
1344
1345const PARAM_NATR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1346    key: "period",
1347    label: "Period",
1348    kind: IndicatorParamKind::Int,
1349    required: false,
1350    default: Some(ParamValueStatic::Int(14)),
1351    min: Some(1.0),
1352    max: None,
1353    step: Some(1.0),
1354    enum_values: EMPTY_ENUM_VALUES,
1355    notes: None,
1356}];
1357
1358const PARAM_REVERSE_RSI: &[IndicatorParamInfo] = &[
1359    IndicatorParamInfo {
1360        key: "rsi_length",
1361        label: "RSI Length",
1362        kind: IndicatorParamKind::Int,
1363        required: false,
1364        default: Some(ParamValueStatic::Int(14)),
1365        min: Some(1.0),
1366        max: None,
1367        step: Some(1.0),
1368        enum_values: EMPTY_ENUM_VALUES,
1369        notes: None,
1370    },
1371    IndicatorParamInfo {
1372        key: "rsi_level",
1373        label: "RSI Level",
1374        kind: IndicatorParamKind::Float,
1375        required: false,
1376        default: Some(ParamValueStatic::Float(50.0)),
1377        min: Some(0.0),
1378        max: Some(100.0),
1379        step: None,
1380        enum_values: EMPTY_ENUM_VALUES,
1381        notes: None,
1382    },
1383];
1384
1385const PARAM_QSTICK: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1386    key: "period",
1387    label: "Period",
1388    kind: IndicatorParamKind::Int,
1389    required: false,
1390    default: Some(ParamValueStatic::Int(5)),
1391    min: Some(1.0),
1392    max: None,
1393    step: Some(1.0),
1394    enum_values: EMPTY_ENUM_VALUES,
1395    notes: None,
1396}];
1397
1398const PARAM_MEAN_AD_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1399    key: "period",
1400    label: "Period",
1401    kind: IndicatorParamKind::Int,
1402    required: false,
1403    default: Some(ParamValueStatic::Int(5)),
1404    min: Some(1.0),
1405    max: None,
1406    step: Some(1.0),
1407    enum_values: EMPTY_ENUM_VALUES,
1408    notes: None,
1409}];
1410
1411const PARAM_MEDIUM_AD_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1412    key: "period",
1413    label: "Period",
1414    kind: IndicatorParamKind::Int,
1415    required: false,
1416    default: Some(ParamValueStatic::Int(5)),
1417    min: Some(1.0),
1418    max: None,
1419    step: Some(1.0),
1420    enum_values: EMPTY_ENUM_VALUES,
1421    notes: None,
1422}];
1423
1424const PARAM_DEVIATION: &[IndicatorParamInfo] = &[
1425    IndicatorParamInfo {
1426        key: "period",
1427        label: "Period",
1428        kind: IndicatorParamKind::Int,
1429        required: false,
1430        default: Some(ParamValueStatic::Int(9)),
1431        min: Some(1.0),
1432        max: None,
1433        step: Some(1.0),
1434        enum_values: EMPTY_ENUM_VALUES,
1435        notes: None,
1436    },
1437    IndicatorParamInfo {
1438        key: "devtype",
1439        label: "Dev Type",
1440        kind: IndicatorParamKind::Int,
1441        required: false,
1442        default: Some(ParamValueStatic::Int(0)),
1443        min: Some(0.0),
1444        max: Some(2.0),
1445        step: Some(1.0),
1446        enum_values: EMPTY_ENUM_VALUES,
1447        notes: None,
1448    },
1449];
1450
1451const PARAM_DPO_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1452    key: "period",
1453    label: "Period",
1454    kind: IndicatorParamKind::Int,
1455    required: false,
1456    default: Some(ParamValueStatic::Int(5)),
1457    min: Some(1.0),
1458    max: None,
1459    step: Some(1.0),
1460    enum_values: EMPTY_ENUM_VALUES,
1461    notes: None,
1462}];
1463
1464const PARAM_LRSI_ALPHA: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1465    key: "alpha",
1466    label: "Alpha",
1467    kind: IndicatorParamKind::Float,
1468    required: false,
1469    default: Some(ParamValueStatic::Float(0.2)),
1470    min: Some(0.0),
1471    max: Some(1.0),
1472    step: None,
1473    enum_values: EMPTY_ENUM_VALUES,
1474    notes: None,
1475}];
1476
1477const PARAM_PVI: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1478    key: "initial_value",
1479    label: "Initial Value",
1480    kind: IndicatorParamKind::Float,
1481    required: false,
1482    default: Some(ParamValueStatic::Float(1000.0)),
1483    min: None,
1484    max: None,
1485    step: None,
1486    enum_values: EMPTY_ENUM_VALUES,
1487    notes: None,
1488}];
1489
1490const PARAM_PFE: &[IndicatorParamInfo] = &[
1491    IndicatorParamInfo {
1492        key: "period",
1493        label: "Period",
1494        kind: IndicatorParamKind::Int,
1495        required: false,
1496        default: Some(ParamValueStatic::Int(10)),
1497        min: Some(1.0),
1498        max: None,
1499        step: Some(1.0),
1500        enum_values: EMPTY_ENUM_VALUES,
1501        notes: None,
1502    },
1503    IndicatorParamInfo {
1504        key: "smoothing",
1505        label: "Smoothing",
1506        kind: IndicatorParamKind::Int,
1507        required: false,
1508        default: Some(ParamValueStatic::Int(5)),
1509        min: Some(1.0),
1510        max: None,
1511        step: Some(1.0),
1512        enum_values: EMPTY_ENUM_VALUES,
1513        notes: None,
1514    },
1515];
1516
1517const PARAM_PERCENTILE_NEAREST_RANK: &[IndicatorParamInfo] = &[
1518    IndicatorParamInfo {
1519        key: "length",
1520        label: "Length",
1521        kind: IndicatorParamKind::Int,
1522        required: false,
1523        default: Some(ParamValueStatic::Int(15)),
1524        min: Some(1.0),
1525        max: None,
1526        step: Some(1.0),
1527        enum_values: EMPTY_ENUM_VALUES,
1528        notes: None,
1529    },
1530    IndicatorParamInfo {
1531        key: "percentage",
1532        label: "Percentage",
1533        kind: IndicatorParamKind::Float,
1534        required: false,
1535        default: Some(ParamValueStatic::Float(50.0)),
1536        min: Some(0.0),
1537        max: Some(100.0),
1538        step: None,
1539        enum_values: EMPTY_ENUM_VALUES,
1540        notes: None,
1541    },
1542];
1543
1544const PARAM_UI: &[IndicatorParamInfo] = &[
1545    IndicatorParamInfo {
1546        key: "period",
1547        label: "Period",
1548        kind: IndicatorParamKind::Int,
1549        required: false,
1550        default: Some(ParamValueStatic::Int(14)),
1551        min: Some(1.0),
1552        max: None,
1553        step: Some(1.0),
1554        enum_values: EMPTY_ENUM_VALUES,
1555        notes: None,
1556    },
1557    IndicatorParamInfo {
1558        key: "scalar",
1559        label: "Scalar",
1560        kind: IndicatorParamKind::Float,
1561        required: false,
1562        default: Some(ParamValueStatic::Float(100.0)),
1563        min: None,
1564        max: None,
1565        step: None,
1566        enum_values: EMPTY_ENUM_VALUES,
1567        notes: None,
1568    },
1569];
1570
1571const PARAM_ZSCORE: &[IndicatorParamInfo] = &[
1572    IndicatorParamInfo {
1573        key: "period",
1574        label: "Period",
1575        kind: IndicatorParamKind::Int,
1576        required: false,
1577        default: Some(ParamValueStatic::Int(14)),
1578        min: Some(1.0),
1579        max: None,
1580        step: Some(1.0),
1581        enum_values: EMPTY_ENUM_VALUES,
1582        notes: None,
1583    },
1584    IndicatorParamInfo {
1585        key: "ma_type",
1586        label: "MA Type",
1587        kind: IndicatorParamKind::EnumString,
1588        required: false,
1589        default: Some(ParamValueStatic::EnumString("sma")),
1590        min: None,
1591        max: None,
1592        step: None,
1593        enum_values: EMPTY_ENUM_VALUES,
1594        notes: None,
1595    },
1596    IndicatorParamInfo {
1597        key: "nbdev",
1598        label: "NB Dev",
1599        kind: IndicatorParamKind::Float,
1600        required: false,
1601        default: Some(ParamValueStatic::Float(1.0)),
1602        min: None,
1603        max: None,
1604        step: None,
1605        enum_values: EMPTY_ENUM_VALUES,
1606        notes: None,
1607    },
1608    IndicatorParamInfo {
1609        key: "devtype",
1610        label: "Dev Type",
1611        kind: IndicatorParamKind::Int,
1612        required: false,
1613        default: Some(ParamValueStatic::Int(0)),
1614        min: Some(0.0),
1615        max: Some(2.0),
1616        step: Some(1.0),
1617        enum_values: EMPTY_ENUM_VALUES,
1618        notes: None,
1619    },
1620];
1621
1622const PARAM_MIDPOINT_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1623    key: "period",
1624    label: "Period",
1625    kind: IndicatorParamKind::Int,
1626    required: false,
1627    default: Some(ParamValueStatic::Int(14)),
1628    min: Some(1.0),
1629    max: None,
1630    step: Some(1.0),
1631    enum_values: EMPTY_ENUM_VALUES,
1632    notes: None,
1633}];
1634
1635const PARAM_MIDPRICE_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1636    key: "period",
1637    label: "Period",
1638    kind: IndicatorParamKind::Int,
1639    required: false,
1640    default: Some(ParamValueStatic::Int(14)),
1641    min: Some(1.0),
1642    max: None,
1643    step: Some(1.0),
1644    enum_values: EMPTY_ENUM_VALUES,
1645    notes: None,
1646}];
1647
1648const PARAM_TSF_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1649    key: "period",
1650    label: "Period",
1651    kind: IndicatorParamKind::Int,
1652    required: false,
1653    default: Some(ParamValueStatic::Int(14)),
1654    min: Some(2.0),
1655    max: None,
1656    step: Some(1.0),
1657    enum_values: EMPTY_ENUM_VALUES,
1658    notes: None,
1659}];
1660
1661const PARAM_VAR: &[IndicatorParamInfo] = &[
1662    IndicatorParamInfo {
1663        key: "period",
1664        label: "Period",
1665        kind: IndicatorParamKind::Int,
1666        required: false,
1667        default: Some(ParamValueStatic::Int(14)),
1668        min: Some(1.0),
1669        max: None,
1670        step: Some(1.0),
1671        enum_values: EMPTY_ENUM_VALUES,
1672        notes: None,
1673    },
1674    IndicatorParamInfo {
1675        key: "nbdev",
1676        label: "NB Dev",
1677        kind: IndicatorParamKind::Float,
1678        required: false,
1679        default: Some(ParamValueStatic::Float(1.0)),
1680        min: None,
1681        max: None,
1682        step: None,
1683        enum_values: EMPTY_ENUM_VALUES,
1684        notes: None,
1685    },
1686];
1687
1688const PARAM_ADX_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1689    key: "period",
1690    label: "Period",
1691    kind: IndicatorParamKind::Int,
1692    required: false,
1693    default: Some(ParamValueStatic::Int(14)),
1694    min: Some(1.0),
1695    max: None,
1696    step: Some(1.0),
1697    enum_values: EMPTY_ENUM_VALUES,
1698    notes: None,
1699}];
1700
1701const PARAM_DX_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1702    key: "period",
1703    label: "Period",
1704    kind: IndicatorParamKind::Int,
1705    required: false,
1706    default: Some(ParamValueStatic::Int(14)),
1707    min: Some(1.0),
1708    max: None,
1709    step: Some(1.0),
1710    enum_values: EMPTY_ENUM_VALUES,
1711    notes: None,
1712}];
1713
1714const PARAM_ATR_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1715    key: "length",
1716    label: "Length",
1717    kind: IndicatorParamKind::Int,
1718    required: false,
1719    default: Some(ParamValueStatic::Int(14)),
1720    min: Some(1.0),
1721    max: None,
1722    step: Some(1.0),
1723    enum_values: EMPTY_ENUM_VALUES,
1724    notes: None,
1725}];
1726
1727const PARAM_FOSC_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1728    key: "period",
1729    label: "Period",
1730    kind: IndicatorParamKind::Int,
1731    required: false,
1732    default: Some(ParamValueStatic::Int(5)),
1733    min: Some(1.0),
1734    max: None,
1735    step: Some(1.0),
1736    enum_values: EMPTY_ENUM_VALUES,
1737    notes: None,
1738}];
1739
1740const PARAM_IFT_RSI: &[IndicatorParamInfo] = &[
1741    IndicatorParamInfo {
1742        key: "rsi_period",
1743        label: "RSI Period",
1744        kind: IndicatorParamKind::Int,
1745        required: false,
1746        default: Some(ParamValueStatic::Int(5)),
1747        min: Some(1.0),
1748        max: None,
1749        step: Some(1.0),
1750        enum_values: EMPTY_ENUM_VALUES,
1751        notes: None,
1752    },
1753    IndicatorParamInfo {
1754        key: "wma_period",
1755        label: "WMA Period",
1756        kind: IndicatorParamKind::Int,
1757        required: false,
1758        default: Some(ParamValueStatic::Int(9)),
1759        min: Some(1.0),
1760        max: None,
1761        step: Some(1.0),
1762        enum_values: EMPTY_ENUM_VALUES,
1763        notes: None,
1764    },
1765];
1766
1767const PARAM_DEC_OSC: &[IndicatorParamInfo] = &[
1768    IndicatorParamInfo {
1769        key: "hp_period",
1770        label: "HP Period",
1771        kind: IndicatorParamKind::Int,
1772        required: false,
1773        default: Some(ParamValueStatic::Int(125)),
1774        min: Some(3.0),
1775        max: None,
1776        step: Some(1.0),
1777        enum_values: EMPTY_ENUM_VALUES,
1778        notes: None,
1779    },
1780    IndicatorParamInfo {
1781        key: "k",
1782        label: "K",
1783        kind: IndicatorParamKind::Float,
1784        required: false,
1785        default: Some(ParamValueStatic::Float(1.0)),
1786        min: Some(0.0),
1787        max: None,
1788        step: None,
1789        enum_values: EMPTY_ENUM_VALUES,
1790        notes: Some("Must be positive"),
1791    },
1792];
1793
1794const PARAM_DECYCLER: &[IndicatorParamInfo] = &[
1795    IndicatorParamInfo {
1796        key: "hp_period",
1797        label: "HP Period",
1798        kind: IndicatorParamKind::Int,
1799        required: false,
1800        default: Some(ParamValueStatic::Int(125)),
1801        min: Some(2.0),
1802        max: None,
1803        step: Some(1.0),
1804        enum_values: EMPTY_ENUM_VALUES,
1805        notes: None,
1806    },
1807    IndicatorParamInfo {
1808        key: "k",
1809        label: "K",
1810        kind: IndicatorParamKind::Float,
1811        required: false,
1812        default: Some(ParamValueStatic::Float(0.707)),
1813        min: Some(0.0),
1814        max: None,
1815        step: None,
1816        enum_values: EMPTY_ENUM_VALUES,
1817        notes: Some("Must be positive"),
1818    },
1819];
1820
1821const PARAM_VIDYA: &[IndicatorParamInfo] = &[
1822    IndicatorParamInfo {
1823        key: "short_period",
1824        label: "Short Period",
1825        kind: IndicatorParamKind::Int,
1826        required: false,
1827        default: Some(ParamValueStatic::Int(2)),
1828        min: Some(2.0),
1829        max: None,
1830        step: Some(1.0),
1831        enum_values: EMPTY_ENUM_VALUES,
1832        notes: None,
1833    },
1834    IndicatorParamInfo {
1835        key: "long_period",
1836        label: "Long Period",
1837        kind: IndicatorParamKind::Int,
1838        required: false,
1839        default: Some(ParamValueStatic::Int(5)),
1840        min: Some(2.0),
1841        max: None,
1842        step: Some(1.0),
1843        enum_values: EMPTY_ENUM_VALUES,
1844        notes: None,
1845    },
1846    IndicatorParamInfo {
1847        key: "alpha",
1848        label: "Alpha",
1849        kind: IndicatorParamKind::Float,
1850        required: false,
1851        default: Some(ParamValueStatic::Float(0.2)),
1852        min: Some(0.0),
1853        max: Some(1.0),
1854        step: None,
1855        enum_values: EMPTY_ENUM_VALUES,
1856        notes: None,
1857    },
1858];
1859
1860const PARAM_VLMA: &[IndicatorParamInfo] = &[
1861    IndicatorParamInfo {
1862        key: "min_period",
1863        label: "Min Period",
1864        kind: IndicatorParamKind::Int,
1865        required: false,
1866        default: Some(ParamValueStatic::Int(5)),
1867        min: Some(1.0),
1868        max: None,
1869        step: Some(1.0),
1870        enum_values: EMPTY_ENUM_VALUES,
1871        notes: None,
1872    },
1873    IndicatorParamInfo {
1874        key: "max_period",
1875        label: "Max Period",
1876        kind: IndicatorParamKind::Int,
1877        required: false,
1878        default: Some(ParamValueStatic::Int(50)),
1879        min: Some(1.0),
1880        max: None,
1881        step: Some(1.0),
1882        enum_values: EMPTY_ENUM_VALUES,
1883        notes: None,
1884    },
1885    IndicatorParamInfo {
1886        key: "matype",
1887        label: "MA Type",
1888        kind: IndicatorParamKind::EnumString,
1889        required: false,
1890        default: Some(ParamValueStatic::EnumString("sma")),
1891        min: None,
1892        max: None,
1893        step: None,
1894        enum_values: EMPTY_ENUM_VALUES,
1895        notes: None,
1896    },
1897    IndicatorParamInfo {
1898        key: "devtype",
1899        label: "Deviation Type",
1900        kind: IndicatorParamKind::Int,
1901        required: false,
1902        default: Some(ParamValueStatic::Int(0)),
1903        min: Some(0.0),
1904        max: None,
1905        step: Some(1.0),
1906        enum_values: EMPTY_ENUM_VALUES,
1907        notes: None,
1908    },
1909];
1910
1911const PARAM_LINEARREG_ANGLE_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1912    key: "period",
1913    label: "Period",
1914    kind: IndicatorParamKind::Int,
1915    required: false,
1916    default: Some(ParamValueStatic::Int(14)),
1917    min: Some(2.0),
1918    max: None,
1919    step: Some(1.0),
1920    enum_values: EMPTY_ENUM_VALUES,
1921    notes: None,
1922}];
1923
1924const PARAM_LINEARREG_INTERCEPT_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1925    key: "period",
1926    label: "Period",
1927    kind: IndicatorParamKind::Int,
1928    required: false,
1929    default: Some(ParamValueStatic::Int(14)),
1930    min: Some(1.0),
1931    max: None,
1932    step: Some(1.0),
1933    enum_values: EMPTY_ENUM_VALUES,
1934    notes: None,
1935}];
1936
1937const PARAM_LINEARREG_SLOPE_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1938    key: "period",
1939    label: "Period",
1940    kind: IndicatorParamKind::Int,
1941    required: false,
1942    default: Some(ParamValueStatic::Int(14)),
1943    min: Some(2.0),
1944    max: None,
1945    step: Some(1.0),
1946    enum_values: EMPTY_ENUM_VALUES,
1947    notes: None,
1948}];
1949
1950const PARAM_CG_PERIOD: &[IndicatorParamInfo] = &[IndicatorParamInfo {
1951    key: "period",
1952    label: "Period",
1953    kind: IndicatorParamKind::Int,
1954    required: false,
1955    default: Some(ParamValueStatic::Int(10)),
1956    min: Some(1.0),
1957    max: None,
1958    step: Some(1.0),
1959    enum_values: EMPTY_ENUM_VALUES,
1960    notes: None,
1961}];
1962
1963const PARAM_MACD: &[IndicatorParamInfo] = &[
1964    IndicatorParamInfo {
1965        key: "fast_period",
1966        label: "Fast Period",
1967        kind: IndicatorParamKind::Int,
1968        required: false,
1969        default: Some(ParamValueStatic::Int(12)),
1970        min: Some(1.0),
1971        max: None,
1972        step: Some(1.0),
1973        enum_values: EMPTY_ENUM_VALUES,
1974        notes: None,
1975    },
1976    IndicatorParamInfo {
1977        key: "slow_period",
1978        label: "Slow Period",
1979        kind: IndicatorParamKind::Int,
1980        required: false,
1981        default: Some(ParamValueStatic::Int(26)),
1982        min: Some(1.0),
1983        max: None,
1984        step: Some(1.0),
1985        enum_values: EMPTY_ENUM_VALUES,
1986        notes: None,
1987    },
1988    IndicatorParamInfo {
1989        key: "signal_period",
1990        label: "Signal Period",
1991        kind: IndicatorParamKind::Int,
1992        required: false,
1993        default: Some(ParamValueStatic::Int(9)),
1994        min: Some(1.0),
1995        max: None,
1996        step: Some(1.0),
1997        enum_values: EMPTY_ENUM_VALUES,
1998        notes: None,
1999    },
2000];
2001
2002const PARAM_BOLLINGER: &[IndicatorParamInfo] = &[
2003    IndicatorParamInfo {
2004        key: "period",
2005        label: "Period",
2006        kind: IndicatorParamKind::Int,
2007        required: false,
2008        default: Some(ParamValueStatic::Int(20)),
2009        min: Some(1.0),
2010        max: None,
2011        step: Some(1.0),
2012        enum_values: EMPTY_ENUM_VALUES,
2013        notes: None,
2014    },
2015    IndicatorParamInfo {
2016        key: "devup",
2017        label: "Dev Up",
2018        kind: IndicatorParamKind::Float,
2019        required: false,
2020        default: Some(ParamValueStatic::Float(2.0)),
2021        min: None,
2022        max: None,
2023        step: None,
2024        enum_values: EMPTY_ENUM_VALUES,
2025        notes: None,
2026    },
2027    IndicatorParamInfo {
2028        key: "devdn",
2029        label: "Dev Down",
2030        kind: IndicatorParamKind::Float,
2031        required: false,
2032        default: Some(ParamValueStatic::Float(2.0)),
2033        min: None,
2034        max: None,
2035        step: None,
2036        enum_values: EMPTY_ENUM_VALUES,
2037        notes: None,
2038    },
2039];
2040
2041const PARAM_STOCH: &[IndicatorParamInfo] = &[
2042    IndicatorParamInfo {
2043        key: "fastk_period",
2044        label: "Fast K Period",
2045        kind: IndicatorParamKind::Int,
2046        required: false,
2047        default: Some(ParamValueStatic::Int(14)),
2048        min: Some(1.0),
2049        max: None,
2050        step: Some(1.0),
2051        enum_values: EMPTY_ENUM_VALUES,
2052        notes: None,
2053    },
2054    IndicatorParamInfo {
2055        key: "slowk_period",
2056        label: "Slow K Period",
2057        kind: IndicatorParamKind::Int,
2058        required: false,
2059        default: Some(ParamValueStatic::Int(3)),
2060        min: Some(1.0),
2061        max: None,
2062        step: Some(1.0),
2063        enum_values: EMPTY_ENUM_VALUES,
2064        notes: None,
2065    },
2066    IndicatorParamInfo {
2067        key: "slowd_period",
2068        label: "Slow D Period",
2069        kind: IndicatorParamKind::Int,
2070        required: false,
2071        default: Some(ParamValueStatic::Int(3)),
2072        min: Some(1.0),
2073        max: None,
2074        step: Some(1.0),
2075        enum_values: EMPTY_ENUM_VALUES,
2076        notes: None,
2077    },
2078];
2079
2080const PARAM_STOCHF: &[IndicatorParamInfo] = &[
2081    IndicatorParamInfo {
2082        key: "fastk_period",
2083        label: "Fast K Period",
2084        kind: IndicatorParamKind::Int,
2085        required: false,
2086        default: Some(ParamValueStatic::Int(5)),
2087        min: Some(1.0),
2088        max: None,
2089        step: Some(1.0),
2090        enum_values: EMPTY_ENUM_VALUES,
2091        notes: None,
2092    },
2093    IndicatorParamInfo {
2094        key: "fastd_period",
2095        label: "Fast D Period",
2096        kind: IndicatorParamKind::Int,
2097        required: false,
2098        default: Some(ParamValueStatic::Int(3)),
2099        min: Some(1.0),
2100        max: None,
2101        step: Some(1.0),
2102        enum_values: EMPTY_ENUM_VALUES,
2103        notes: None,
2104    },
2105];
2106
2107const PARAM_VW_MACD: &[IndicatorParamInfo] = &[
2108    IndicatorParamInfo {
2109        key: "fast",
2110        label: "Fast",
2111        kind: IndicatorParamKind::Int,
2112        required: false,
2113        default: Some(ParamValueStatic::Int(12)),
2114        min: Some(1.0),
2115        max: None,
2116        step: Some(1.0),
2117        enum_values: EMPTY_ENUM_VALUES,
2118        notes: None,
2119    },
2120    IndicatorParamInfo {
2121        key: "slow",
2122        label: "Slow",
2123        kind: IndicatorParamKind::Int,
2124        required: false,
2125        default: Some(ParamValueStatic::Int(26)),
2126        min: Some(1.0),
2127        max: None,
2128        step: Some(1.0),
2129        enum_values: EMPTY_ENUM_VALUES,
2130        notes: None,
2131    },
2132    IndicatorParamInfo {
2133        key: "signal",
2134        label: "Signal",
2135        kind: IndicatorParamKind::Int,
2136        required: false,
2137        default: Some(ParamValueStatic::Int(9)),
2138        min: Some(1.0),
2139        max: None,
2140        step: Some(1.0),
2141        enum_values: EMPTY_ENUM_VALUES,
2142        notes: None,
2143    },
2144];
2145
2146const PARAM_VPCI: &[IndicatorParamInfo] = &[
2147    IndicatorParamInfo {
2148        key: "short_range",
2149        label: "Short Range",
2150        kind: IndicatorParamKind::Int,
2151        required: false,
2152        default: Some(ParamValueStatic::Int(5)),
2153        min: Some(1.0),
2154        max: None,
2155        step: Some(1.0),
2156        enum_values: EMPTY_ENUM_VALUES,
2157        notes: None,
2158    },
2159    IndicatorParamInfo {
2160        key: "long_range",
2161        label: "Long Range",
2162        kind: IndicatorParamKind::Int,
2163        required: false,
2164        default: Some(ParamValueStatic::Int(20)),
2165        min: Some(1.0),
2166        max: None,
2167        step: Some(1.0),
2168        enum_values: EMPTY_ENUM_VALUES,
2169        notes: None,
2170    },
2171];
2172
2173const PARAM_TTM_TREND: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2174    key: "period",
2175    label: "Period",
2176    kind: IndicatorParamKind::Int,
2177    required: false,
2178    default: Some(ParamValueStatic::Int(6)),
2179    min: Some(1.0),
2180    max: None,
2181    step: Some(1.0),
2182    enum_values: EMPTY_ENUM_VALUES,
2183    notes: None,
2184}];
2185
2186const PARAM_TTM_SQUEEZE: &[IndicatorParamInfo] = &[
2187    IndicatorParamInfo {
2188        key: "length",
2189        label: "Length",
2190        kind: IndicatorParamKind::Int,
2191        required: false,
2192        default: Some(ParamValueStatic::Int(20)),
2193        min: Some(1.0),
2194        max: None,
2195        step: Some(1.0),
2196        enum_values: EMPTY_ENUM_VALUES,
2197        notes: None,
2198    },
2199    IndicatorParamInfo {
2200        key: "bb_mult",
2201        label: "BB Mult",
2202        kind: IndicatorParamKind::Float,
2203        required: false,
2204        default: Some(ParamValueStatic::Float(2.0)),
2205        min: None,
2206        max: None,
2207        step: None,
2208        enum_values: EMPTY_ENUM_VALUES,
2209        notes: None,
2210    },
2211    IndicatorParamInfo {
2212        key: "kc_high",
2213        label: "KC High",
2214        kind: IndicatorParamKind::Float,
2215        required: false,
2216        default: Some(ParamValueStatic::Float(1.0)),
2217        min: None,
2218        max: None,
2219        step: None,
2220        enum_values: EMPTY_ENUM_VALUES,
2221        notes: None,
2222    },
2223    IndicatorParamInfo {
2224        key: "kc_mid",
2225        label: "KC Mid",
2226        kind: IndicatorParamKind::Float,
2227        required: false,
2228        default: Some(ParamValueStatic::Float(1.5)),
2229        min: None,
2230        max: None,
2231        step: None,
2232        enum_values: EMPTY_ENUM_VALUES,
2233        notes: None,
2234    },
2235    IndicatorParamInfo {
2236        key: "kc_low",
2237        label: "KC Low",
2238        kind: IndicatorParamKind::Float,
2239        required: false,
2240        default: Some(ParamValueStatic::Float(2.0)),
2241        min: None,
2242        max: None,
2243        step: None,
2244        enum_values: EMPTY_ENUM_VALUES,
2245        notes: None,
2246    },
2247];
2248
2249const PARAM_DI: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2250    key: "period",
2251    label: "Period",
2252    kind: IndicatorParamKind::Int,
2253    required: false,
2254    default: Some(ParamValueStatic::Int(14)),
2255    min: Some(1.0),
2256    max: None,
2257    step: Some(1.0),
2258    enum_values: EMPTY_ENUM_VALUES,
2259    notes: None,
2260}];
2261
2262const PARAM_DTI: &[IndicatorParamInfo] = &[
2263    IndicatorParamInfo {
2264        key: "r",
2265        label: "R",
2266        kind: IndicatorParamKind::Int,
2267        required: false,
2268        default: Some(ParamValueStatic::Int(14)),
2269        min: Some(1.0),
2270        max: None,
2271        step: Some(1.0),
2272        enum_values: EMPTY_ENUM_VALUES,
2273        notes: None,
2274    },
2275    IndicatorParamInfo {
2276        key: "s",
2277        label: "S",
2278        kind: IndicatorParamKind::Int,
2279        required: false,
2280        default: Some(ParamValueStatic::Int(10)),
2281        min: Some(1.0),
2282        max: None,
2283        step: Some(1.0),
2284        enum_values: EMPTY_ENUM_VALUES,
2285        notes: None,
2286    },
2287    IndicatorParamInfo {
2288        key: "u",
2289        label: "U",
2290        kind: IndicatorParamKind::Int,
2291        required: false,
2292        default: Some(ParamValueStatic::Int(5)),
2293        min: Some(1.0),
2294        max: None,
2295        step: Some(1.0),
2296        enum_values: EMPTY_ENUM_VALUES,
2297        notes: None,
2298    },
2299];
2300
2301const PARAM_DM: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2302    key: "period",
2303    label: "Period",
2304    kind: IndicatorParamKind::Int,
2305    required: false,
2306    default: Some(ParamValueStatic::Int(14)),
2307    min: Some(1.0),
2308    max: None,
2309    step: Some(1.0),
2310    enum_values: EMPTY_ENUM_VALUES,
2311    notes: None,
2312}];
2313
2314const PARAM_DONCHIAN: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2315    key: "period",
2316    label: "Period",
2317    kind: IndicatorParamKind::Int,
2318    required: false,
2319    default: Some(ParamValueStatic::Int(20)),
2320    min: Some(1.0),
2321    max: None,
2322    step: Some(1.0),
2323    enum_values: EMPTY_ENUM_VALUES,
2324    notes: None,
2325}];
2326
2327const PARAM_SUPERTREND: &[IndicatorParamInfo] = &[
2328    IndicatorParamInfo {
2329        key: "period",
2330        label: "Period",
2331        kind: IndicatorParamKind::Int,
2332        required: false,
2333        default: Some(ParamValueStatic::Int(10)),
2334        min: Some(1.0),
2335        max: None,
2336        step: Some(1.0),
2337        enum_values: EMPTY_ENUM_VALUES,
2338        notes: None,
2339    },
2340    IndicatorParamInfo {
2341        key: "factor",
2342        label: "Factor",
2343        kind: IndicatorParamKind::Float,
2344        required: false,
2345        default: Some(ParamValueStatic::Float(3.0)),
2346        min: Some(0.0),
2347        max: None,
2348        step: None,
2349        enum_values: EMPTY_ENUM_VALUES,
2350        notes: None,
2351    },
2352];
2353
2354const PARAM_KELTNER: &[IndicatorParamInfo] = &[
2355    IndicatorParamInfo {
2356        key: "period",
2357        label: "Period",
2358        kind: IndicatorParamKind::Int,
2359        required: false,
2360        default: Some(ParamValueStatic::Int(20)),
2361        min: Some(1.0),
2362        max: None,
2363        step: Some(1.0),
2364        enum_values: EMPTY_ENUM_VALUES,
2365        notes: None,
2366    },
2367    IndicatorParamInfo {
2368        key: "multiplier",
2369        label: "Multiplier",
2370        kind: IndicatorParamKind::Float,
2371        required: false,
2372        default: Some(ParamValueStatic::Float(2.0)),
2373        min: Some(0.0),
2374        max: None,
2375        step: None,
2376        enum_values: EMPTY_ENUM_VALUES,
2377        notes: None,
2378    },
2379    IndicatorParamInfo {
2380        key: "ma_type",
2381        label: "MA Type",
2382        kind: IndicatorParamKind::EnumString,
2383        required: false,
2384        default: Some(ParamValueStatic::EnumString("ema")),
2385        min: None,
2386        max: None,
2387        step: None,
2388        enum_values: EMPTY_ENUM_VALUES,
2389        notes: None,
2390    },
2391];
2392
2393const PARAM_AROON: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2394    key: "length",
2395    label: "Length",
2396    kind: IndicatorParamKind::Int,
2397    required: false,
2398    default: Some(ParamValueStatic::Int(14)),
2399    min: Some(1.0),
2400    max: None,
2401    step: Some(1.0),
2402    enum_values: EMPTY_ENUM_VALUES,
2403    notes: None,
2404}];
2405
2406const PARAM_SRSI: &[IndicatorParamInfo] = &[
2407    IndicatorParamInfo {
2408        key: "rsi_period",
2409        label: "RSI Period",
2410        kind: IndicatorParamKind::Int,
2411        required: false,
2412        default: Some(ParamValueStatic::Int(14)),
2413        min: Some(1.0),
2414        max: None,
2415        step: Some(1.0),
2416        enum_values: EMPTY_ENUM_VALUES,
2417        notes: None,
2418    },
2419    IndicatorParamInfo {
2420        key: "stoch_period",
2421        label: "Stoch Period",
2422        kind: IndicatorParamKind::Int,
2423        required: false,
2424        default: Some(ParamValueStatic::Int(14)),
2425        min: Some(1.0),
2426        max: None,
2427        step: Some(1.0),
2428        enum_values: EMPTY_ENUM_VALUES,
2429        notes: None,
2430    },
2431    IndicatorParamInfo {
2432        key: "k",
2433        label: "K",
2434        kind: IndicatorParamKind::Int,
2435        required: false,
2436        default: Some(ParamValueStatic::Int(3)),
2437        min: Some(1.0),
2438        max: None,
2439        step: Some(1.0),
2440        enum_values: EMPTY_ENUM_VALUES,
2441        notes: None,
2442    },
2443    IndicatorParamInfo {
2444        key: "d",
2445        label: "D",
2446        kind: IndicatorParamKind::Int,
2447        required: false,
2448        default: Some(ParamValueStatic::Int(3)),
2449        min: Some(1.0),
2450        max: None,
2451        step: Some(1.0),
2452        enum_values: EMPTY_ENUM_VALUES,
2453        notes: None,
2454    },
2455    IndicatorParamInfo {
2456        key: "source",
2457        label: "Source",
2458        kind: IndicatorParamKind::EnumString,
2459        required: false,
2460        default: Some(ParamValueStatic::EnumString("close")),
2461        min: None,
2462        max: None,
2463        step: None,
2464        enum_values: EMPTY_ENUM_VALUES,
2465        notes: None,
2466    },
2467];
2468
2469const PARAM_CHOP: &[IndicatorParamInfo] = &[
2470    IndicatorParamInfo {
2471        key: "period",
2472        label: "Period",
2473        kind: IndicatorParamKind::Int,
2474        required: false,
2475        default: Some(ParamValueStatic::Int(14)),
2476        min: Some(1.0),
2477        max: None,
2478        step: Some(1.0),
2479        enum_values: EMPTY_ENUM_VALUES,
2480        notes: None,
2481    },
2482    IndicatorParamInfo {
2483        key: "scalar",
2484        label: "Scalar",
2485        kind: IndicatorParamKind::Float,
2486        required: false,
2487        default: Some(ParamValueStatic::Float(100.0)),
2488        min: Some(0.0),
2489        max: None,
2490        step: None,
2491        enum_values: EMPTY_ENUM_VALUES,
2492        notes: None,
2493    },
2494    IndicatorParamInfo {
2495        key: "drift",
2496        label: "Drift",
2497        kind: IndicatorParamKind::Int,
2498        required: false,
2499        default: Some(ParamValueStatic::Int(1)),
2500        min: Some(1.0),
2501        max: None,
2502        step: Some(1.0),
2503        enum_values: EMPTY_ENUM_VALUES,
2504        notes: None,
2505    },
2506];
2507
2508const PARAM_SQUEEZE_MOMENTUM: &[IndicatorParamInfo] = &[
2509    IndicatorParamInfo {
2510        key: "length_bb",
2511        label: "BB Length",
2512        kind: IndicatorParamKind::Int,
2513        required: false,
2514        default: Some(ParamValueStatic::Int(20)),
2515        min: Some(1.0),
2516        max: None,
2517        step: Some(1.0),
2518        enum_values: EMPTY_ENUM_VALUES,
2519        notes: None,
2520    },
2521    IndicatorParamInfo {
2522        key: "mult_bb",
2523        label: "BB Mult",
2524        kind: IndicatorParamKind::Float,
2525        required: false,
2526        default: Some(ParamValueStatic::Float(2.0)),
2527        min: Some(0.0),
2528        max: None,
2529        step: None,
2530        enum_values: EMPTY_ENUM_VALUES,
2531        notes: None,
2532    },
2533    IndicatorParamInfo {
2534        key: "length_kc",
2535        label: "KC Length",
2536        kind: IndicatorParamKind::Int,
2537        required: false,
2538        default: Some(ParamValueStatic::Int(20)),
2539        min: Some(1.0),
2540        max: None,
2541        step: Some(1.0),
2542        enum_values: EMPTY_ENUM_VALUES,
2543        notes: None,
2544    },
2545    IndicatorParamInfo {
2546        key: "mult_kc",
2547        label: "KC Mult",
2548        kind: IndicatorParamKind::Float,
2549        required: false,
2550        default: Some(ParamValueStatic::Float(1.5)),
2551        min: Some(0.0),
2552        max: None,
2553        step: None,
2554        enum_values: EMPTY_ENUM_VALUES,
2555        notes: None,
2556    },
2557];
2558
2559const PARAM_WTO: &[IndicatorParamInfo] = &[
2560    IndicatorParamInfo {
2561        key: "channel_length",
2562        label: "Channel Length",
2563        kind: IndicatorParamKind::Int,
2564        required: false,
2565        default: Some(ParamValueStatic::Int(10)),
2566        min: Some(1.0),
2567        max: None,
2568        step: Some(1.0),
2569        enum_values: EMPTY_ENUM_VALUES,
2570        notes: None,
2571    },
2572    IndicatorParamInfo {
2573        key: "average_length",
2574        label: "Average Length",
2575        kind: IndicatorParamKind::Int,
2576        required: false,
2577        default: Some(ParamValueStatic::Int(21)),
2578        min: Some(1.0),
2579        max: None,
2580        step: Some(1.0),
2581        enum_values: EMPTY_ENUM_VALUES,
2582        notes: None,
2583    },
2584];
2585
2586const PARAM_WAVETREND: &[IndicatorParamInfo] = &[
2587    IndicatorParamInfo {
2588        key: "channel_length",
2589        label: "Channel Length",
2590        kind: IndicatorParamKind::Int,
2591        required: false,
2592        default: Some(ParamValueStatic::Int(9)),
2593        min: Some(1.0),
2594        max: None,
2595        step: Some(1.0),
2596        enum_values: EMPTY_ENUM_VALUES,
2597        notes: None,
2598    },
2599    IndicatorParamInfo {
2600        key: "average_length",
2601        label: "Average Length",
2602        kind: IndicatorParamKind::Int,
2603        required: false,
2604        default: Some(ParamValueStatic::Int(12)),
2605        min: Some(1.0),
2606        max: None,
2607        step: Some(1.0),
2608        enum_values: EMPTY_ENUM_VALUES,
2609        notes: None,
2610    },
2611    IndicatorParamInfo {
2612        key: "ma_length",
2613        label: "MA Length",
2614        kind: IndicatorParamKind::Int,
2615        required: false,
2616        default: Some(ParamValueStatic::Int(3)),
2617        min: Some(1.0),
2618        max: None,
2619        step: Some(1.0),
2620        enum_values: EMPTY_ENUM_VALUES,
2621        notes: None,
2622    },
2623    IndicatorParamInfo {
2624        key: "factor",
2625        label: "Factor",
2626        kind: IndicatorParamKind::Float,
2627        required: false,
2628        default: Some(ParamValueStatic::Float(0.015)),
2629        min: Some(0.0),
2630        max: None,
2631        step: None,
2632        enum_values: EMPTY_ENUM_VALUES,
2633        notes: None,
2634    },
2635];
2636
2637const PARAM_YANG_ZHANG: &[IndicatorParamInfo] = &[
2638    IndicatorParamInfo {
2639        key: "lookback",
2640        label: "Lookback",
2641        kind: IndicatorParamKind::Int,
2642        required: false,
2643        default: Some(ParamValueStatic::Int(14)),
2644        min: Some(1.0),
2645        max: None,
2646        step: Some(1.0),
2647        enum_values: EMPTY_ENUM_VALUES,
2648        notes: None,
2649    },
2650    IndicatorParamInfo {
2651        key: "k_override",
2652        label: "K Override",
2653        kind: IndicatorParamKind::Bool,
2654        required: false,
2655        default: Some(ParamValueStatic::Bool(false)),
2656        min: None,
2657        max: None,
2658        step: None,
2659        enum_values: ENUM_VALUES_TRUE_FALSE,
2660        notes: None,
2661    },
2662    IndicatorParamInfo {
2663        key: "k",
2664        label: "K",
2665        kind: IndicatorParamKind::Float,
2666        required: false,
2667        default: Some(ParamValueStatic::Float(0.34)),
2668        min: Some(0.0),
2669        max: None,
2670        step: None,
2671        enum_values: EMPTY_ENUM_VALUES,
2672        notes: None,
2673    },
2674];
2675
2676const PARAM_VI: &[IndicatorParamInfo] = &[IndicatorParamInfo {
2677    key: "period",
2678    label: "Period",
2679    kind: IndicatorParamKind::Int,
2680    required: false,
2681    default: Some(ParamValueStatic::Int(14)),
2682    min: Some(1.0),
2683    max: None,
2684    step: Some(1.0),
2685    enum_values: EMPTY_ENUM_VALUES,
2686    notes: None,
2687}];
2688
2689const PARAM_KDJ: &[IndicatorParamInfo] = &[
2690    IndicatorParamInfo {
2691        key: "fast_k_period",
2692        label: "Fast K Period",
2693        kind: IndicatorParamKind::Int,
2694        required: false,
2695        default: Some(ParamValueStatic::Int(9)),
2696        min: Some(1.0),
2697        max: None,
2698        step: Some(1.0),
2699        enum_values: EMPTY_ENUM_VALUES,
2700        notes: None,
2701    },
2702    IndicatorParamInfo {
2703        key: "slow_k_period",
2704        label: "Slow K Period",
2705        kind: IndicatorParamKind::Int,
2706        required: false,
2707        default: Some(ParamValueStatic::Int(3)),
2708        min: Some(1.0),
2709        max: None,
2710        step: Some(1.0),
2711        enum_values: EMPTY_ENUM_VALUES,
2712        notes: None,
2713    },
2714    IndicatorParamInfo {
2715        key: "slow_k_ma_type",
2716        label: "Slow K MA Type",
2717        kind: IndicatorParamKind::EnumString,
2718        required: false,
2719        default: Some(ParamValueStatic::EnumString("sma")),
2720        min: None,
2721        max: None,
2722        step: None,
2723        enum_values: EMPTY_ENUM_VALUES,
2724        notes: None,
2725    },
2726    IndicatorParamInfo {
2727        key: "slow_d_period",
2728        label: "Slow D Period",
2729        kind: IndicatorParamKind::Int,
2730        required: false,
2731        default: Some(ParamValueStatic::Int(3)),
2732        min: Some(1.0),
2733        max: None,
2734        step: Some(1.0),
2735        enum_values: EMPTY_ENUM_VALUES,
2736        notes: None,
2737    },
2738    IndicatorParamInfo {
2739        key: "slow_d_ma_type",
2740        label: "Slow D MA Type",
2741        kind: IndicatorParamKind::EnumString,
2742        required: false,
2743        default: Some(ParamValueStatic::EnumString("sma")),
2744        min: None,
2745        max: None,
2746        step: None,
2747        enum_values: EMPTY_ENUM_VALUES,
2748        notes: None,
2749    },
2750];
2751
2752const PARAM_ACOSC: &[IndicatorParamInfo] = PARAM_NONE;
2753
2754const PARAM_ALLIGATOR: &[IndicatorParamInfo] = &[
2755    IndicatorParamInfo {
2756        key: "jaw_period",
2757        label: "Jaw Period",
2758        kind: IndicatorParamKind::Int,
2759        required: false,
2760        default: Some(ParamValueStatic::Int(13)),
2761        min: Some(1.0),
2762        max: None,
2763        step: Some(1.0),
2764        enum_values: EMPTY_ENUM_VALUES,
2765        notes: None,
2766    },
2767    IndicatorParamInfo {
2768        key: "jaw_offset",
2769        label: "Jaw Offset",
2770        kind: IndicatorParamKind::Int,
2771        required: false,
2772        default: Some(ParamValueStatic::Int(8)),
2773        min: Some(0.0),
2774        max: None,
2775        step: Some(1.0),
2776        enum_values: EMPTY_ENUM_VALUES,
2777        notes: None,
2778    },
2779    IndicatorParamInfo {
2780        key: "teeth_period",
2781        label: "Teeth Period",
2782        kind: IndicatorParamKind::Int,
2783        required: false,
2784        default: Some(ParamValueStatic::Int(8)),
2785        min: Some(1.0),
2786        max: None,
2787        step: Some(1.0),
2788        enum_values: EMPTY_ENUM_VALUES,
2789        notes: None,
2790    },
2791    IndicatorParamInfo {
2792        key: "teeth_offset",
2793        label: "Teeth Offset",
2794        kind: IndicatorParamKind::Int,
2795        required: false,
2796        default: Some(ParamValueStatic::Int(5)),
2797        min: Some(0.0),
2798        max: None,
2799        step: Some(1.0),
2800        enum_values: EMPTY_ENUM_VALUES,
2801        notes: None,
2802    },
2803    IndicatorParamInfo {
2804        key: "lips_period",
2805        label: "Lips Period",
2806        kind: IndicatorParamKind::Int,
2807        required: false,
2808        default: Some(ParamValueStatic::Int(5)),
2809        min: Some(1.0),
2810        max: None,
2811        step: Some(1.0),
2812        enum_values: EMPTY_ENUM_VALUES,
2813        notes: None,
2814    },
2815    IndicatorParamInfo {
2816        key: "lips_offset",
2817        label: "Lips Offset",
2818        kind: IndicatorParamKind::Int,
2819        required: false,
2820        default: Some(ParamValueStatic::Int(3)),
2821        min: Some(0.0),
2822        max: None,
2823        step: Some(1.0),
2824        enum_values: EMPTY_ENUM_VALUES,
2825        notes: None,
2826    },
2827];
2828
2829const PARAM_ALPHATREND: &[IndicatorParamInfo] = &[
2830    IndicatorParamInfo {
2831        key: "coeff",
2832        label: "Coeff",
2833        kind: IndicatorParamKind::Float,
2834        required: false,
2835        default: Some(ParamValueStatic::Float(1.0)),
2836        min: Some(0.0),
2837        max: None,
2838        step: None,
2839        enum_values: EMPTY_ENUM_VALUES,
2840        notes: None,
2841    },
2842    IndicatorParamInfo {
2843        key: "period",
2844        label: "Period",
2845        kind: IndicatorParamKind::Int,
2846        required: false,
2847        default: Some(ParamValueStatic::Int(14)),
2848        min: Some(1.0),
2849        max: None,
2850        step: Some(1.0),
2851        enum_values: EMPTY_ENUM_VALUES,
2852        notes: None,
2853    },
2854    IndicatorParamInfo {
2855        key: "no_volume",
2856        label: "No Volume",
2857        kind: IndicatorParamKind::Bool,
2858        required: false,
2859        default: Some(ParamValueStatic::Bool(false)),
2860        min: None,
2861        max: None,
2862        step: None,
2863        enum_values: ENUM_VALUES_TRUE_FALSE,
2864        notes: None,
2865    },
2866];
2867
2868const PARAM_ASO: &[IndicatorParamInfo] = &[
2869    IndicatorParamInfo {
2870        key: "period",
2871        label: "Period",
2872        kind: IndicatorParamKind::Int,
2873        required: false,
2874        default: Some(ParamValueStatic::Int(10)),
2875        min: Some(1.0),
2876        max: None,
2877        step: Some(1.0),
2878        enum_values: EMPTY_ENUM_VALUES,
2879        notes: None,
2880    },
2881    IndicatorParamInfo {
2882        key: "mode",
2883        label: "Mode",
2884        kind: IndicatorParamKind::Int,
2885        required: false,
2886        default: Some(ParamValueStatic::Int(0)),
2887        min: Some(0.0),
2888        max: None,
2889        step: Some(1.0),
2890        enum_values: EMPTY_ENUM_VALUES,
2891        notes: None,
2892    },
2893];
2894
2895const PARAM_AVSL: &[IndicatorParamInfo] = &[
2896    IndicatorParamInfo {
2897        key: "fast_period",
2898        label: "Fast Period",
2899        kind: IndicatorParamKind::Int,
2900        required: false,
2901        default: Some(ParamValueStatic::Int(12)),
2902        min: Some(1.0),
2903        max: None,
2904        step: Some(1.0),
2905        enum_values: EMPTY_ENUM_VALUES,
2906        notes: None,
2907    },
2908    IndicatorParamInfo {
2909        key: "slow_period",
2910        label: "Slow Period",
2911        kind: IndicatorParamKind::Int,
2912        required: false,
2913        default: Some(ParamValueStatic::Int(26)),
2914        min: Some(1.0),
2915        max: None,
2916        step: Some(1.0),
2917        enum_values: EMPTY_ENUM_VALUES,
2918        notes: None,
2919    },
2920    IndicatorParamInfo {
2921        key: "multiplier",
2922        label: "Multiplier",
2923        kind: IndicatorParamKind::Float,
2924        required: false,
2925        default: Some(ParamValueStatic::Float(2.0)),
2926        min: Some(0.0),
2927        max: None,
2928        step: Some(0.1),
2929        enum_values: EMPTY_ENUM_VALUES,
2930        notes: None,
2931    },
2932];
2933
2934const PARAM_BANDPASS: &[IndicatorParamInfo] = &[
2935    IndicatorParamInfo {
2936        key: "period",
2937        label: "Period",
2938        kind: IndicatorParamKind::Int,
2939        required: false,
2940        default: Some(ParamValueStatic::Int(20)),
2941        min: Some(1.0),
2942        max: None,
2943        step: Some(1.0),
2944        enum_values: EMPTY_ENUM_VALUES,
2945        notes: None,
2946    },
2947    IndicatorParamInfo {
2948        key: "bandwidth",
2949        label: "Bandwidth",
2950        kind: IndicatorParamKind::Float,
2951        required: false,
2952        default: Some(ParamValueStatic::Float(0.3)),
2953        min: Some(0.0),
2954        max: None,
2955        step: None,
2956        enum_values: EMPTY_ENUM_VALUES,
2957        notes: None,
2958    },
2959];
2960
2961const PARAM_CHANDE: &[IndicatorParamInfo] = &[
2962    IndicatorParamInfo {
2963        key: "period",
2964        label: "Period",
2965        kind: IndicatorParamKind::Int,
2966        required: false,
2967        default: Some(ParamValueStatic::Int(22)),
2968        min: Some(1.0),
2969        max: None,
2970        step: Some(1.0),
2971        enum_values: EMPTY_ENUM_VALUES,
2972        notes: None,
2973    },
2974    IndicatorParamInfo {
2975        key: "mult",
2976        label: "Multiplier",
2977        kind: IndicatorParamKind::Float,
2978        required: false,
2979        default: Some(ParamValueStatic::Float(3.0)),
2980        min: Some(0.0),
2981        max: None,
2982        step: Some(0.1),
2983        enum_values: EMPTY_ENUM_VALUES,
2984        notes: None,
2985    },
2986    IndicatorParamInfo {
2987        key: "direction",
2988        label: "Direction",
2989        kind: IndicatorParamKind::EnumString,
2990        required: false,
2991        default: Some(ParamValueStatic::EnumString("long")),
2992        min: None,
2993        max: None,
2994        step: None,
2995        enum_values: &["long", "short"],
2996        notes: None,
2997    },
2998];
2999
3000const PARAM_CHANDELIER_EXIT: &[IndicatorParamInfo] = &[
3001    IndicatorParamInfo {
3002        key: "period",
3003        label: "Period",
3004        kind: IndicatorParamKind::Int,
3005        required: false,
3006        default: Some(ParamValueStatic::Int(22)),
3007        min: Some(1.0),
3008        max: None,
3009        step: Some(1.0),
3010        enum_values: EMPTY_ENUM_VALUES,
3011        notes: None,
3012    },
3013    IndicatorParamInfo {
3014        key: "mult",
3015        label: "Multiplier",
3016        kind: IndicatorParamKind::Float,
3017        required: false,
3018        default: Some(ParamValueStatic::Float(3.0)),
3019        min: Some(0.0),
3020        max: None,
3021        step: None,
3022        enum_values: EMPTY_ENUM_VALUES,
3023        notes: None,
3024    },
3025    IndicatorParamInfo {
3026        key: "use_close",
3027        label: "Use Close",
3028        kind: IndicatorParamKind::Bool,
3029        required: false,
3030        default: Some(ParamValueStatic::Bool(true)),
3031        min: None,
3032        max: None,
3033        step: None,
3034        enum_values: ENUM_VALUES_TRUE_FALSE,
3035        notes: None,
3036    },
3037];
3038
3039const PARAM_CKSP: &[IndicatorParamInfo] = &[
3040    IndicatorParamInfo {
3041        key: "p",
3042        label: "P",
3043        kind: IndicatorParamKind::Int,
3044        required: false,
3045        default: Some(ParamValueStatic::Int(10)),
3046        min: Some(1.0),
3047        max: None,
3048        step: Some(1.0),
3049        enum_values: EMPTY_ENUM_VALUES,
3050        notes: None,
3051    },
3052    IndicatorParamInfo {
3053        key: "x",
3054        label: "X",
3055        kind: IndicatorParamKind::Float,
3056        required: false,
3057        default: Some(ParamValueStatic::Float(1.0)),
3058        min: Some(0.0),
3059        max: None,
3060        step: None,
3061        enum_values: EMPTY_ENUM_VALUES,
3062        notes: None,
3063    },
3064    IndicatorParamInfo {
3065        key: "q",
3066        label: "Q",
3067        kind: IndicatorParamKind::Int,
3068        required: false,
3069        default: Some(ParamValueStatic::Int(9)),
3070        min: Some(1.0),
3071        max: None,
3072        step: Some(1.0),
3073        enum_values: EMPTY_ENUM_VALUES,
3074        notes: None,
3075    },
3076];
3077
3078const PARAM_CORRELATION_CYCLE: &[IndicatorParamInfo] = &[
3079    IndicatorParamInfo {
3080        key: "period",
3081        label: "Period",
3082        kind: IndicatorParamKind::Int,
3083        required: false,
3084        default: Some(ParamValueStatic::Int(20)),
3085        min: Some(1.0),
3086        max: None,
3087        step: Some(1.0),
3088        enum_values: EMPTY_ENUM_VALUES,
3089        notes: None,
3090    },
3091    IndicatorParamInfo {
3092        key: "threshold",
3093        label: "Threshold",
3094        kind: IndicatorParamKind::Float,
3095        required: false,
3096        default: Some(ParamValueStatic::Float(9.0)),
3097        min: None,
3098        max: None,
3099        step: None,
3100        enum_values: EMPTY_ENUM_VALUES,
3101        notes: None,
3102    },
3103];
3104
3105const PARAM_CORREL_HL: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3106    key: "period",
3107    label: "Period",
3108    kind: IndicatorParamKind::Int,
3109    required: false,
3110    default: Some(ParamValueStatic::Int(9)),
3111    min: Some(1.0),
3112    max: None,
3113    step: Some(1.0),
3114    enum_values: EMPTY_ENUM_VALUES,
3115    notes: None,
3116}];
3117
3118const PARAM_DAMIANI_VOLATMETER: &[IndicatorParamInfo] = &[
3119    IndicatorParamInfo {
3120        key: "vis_atr",
3121        label: "Vis ATR",
3122        kind: IndicatorParamKind::Int,
3123        required: false,
3124        default: Some(ParamValueStatic::Int(13)),
3125        min: Some(1.0),
3126        max: None,
3127        step: Some(1.0),
3128        enum_values: EMPTY_ENUM_VALUES,
3129        notes: None,
3130    },
3131    IndicatorParamInfo {
3132        key: "vis_std",
3133        label: "Vis STD",
3134        kind: IndicatorParamKind::Int,
3135        required: false,
3136        default: Some(ParamValueStatic::Int(20)),
3137        min: Some(1.0),
3138        max: None,
3139        step: Some(1.0),
3140        enum_values: EMPTY_ENUM_VALUES,
3141        notes: None,
3142    },
3143    IndicatorParamInfo {
3144        key: "sed_atr",
3145        label: "Sed ATR",
3146        kind: IndicatorParamKind::Int,
3147        required: false,
3148        default: Some(ParamValueStatic::Int(40)),
3149        min: Some(1.0),
3150        max: None,
3151        step: Some(1.0),
3152        enum_values: EMPTY_ENUM_VALUES,
3153        notes: None,
3154    },
3155    IndicatorParamInfo {
3156        key: "sed_std",
3157        label: "Sed STD",
3158        kind: IndicatorParamKind::Int,
3159        required: false,
3160        default: Some(ParamValueStatic::Int(100)),
3161        min: Some(1.0),
3162        max: None,
3163        step: Some(1.0),
3164        enum_values: EMPTY_ENUM_VALUES,
3165        notes: None,
3166    },
3167    IndicatorParamInfo {
3168        key: "threshold",
3169        label: "Threshold",
3170        kind: IndicatorParamKind::Float,
3171        required: false,
3172        default: Some(ParamValueStatic::Float(1.4)),
3173        min: None,
3174        max: None,
3175        step: None,
3176        enum_values: EMPTY_ENUM_VALUES,
3177        notes: None,
3178    },
3179];
3180
3181const PARAM_DVDIQQE: &[IndicatorParamInfo] = &[
3182    IndicatorParamInfo {
3183        key: "period",
3184        label: "Period",
3185        kind: IndicatorParamKind::Int,
3186        required: false,
3187        default: Some(ParamValueStatic::Int(13)),
3188        min: Some(1.0),
3189        max: None,
3190        step: Some(1.0),
3191        enum_values: EMPTY_ENUM_VALUES,
3192        notes: None,
3193    },
3194    IndicatorParamInfo {
3195        key: "smoothing_period",
3196        label: "Smoothing Period",
3197        kind: IndicatorParamKind::Int,
3198        required: false,
3199        default: Some(ParamValueStatic::Int(6)),
3200        min: Some(1.0),
3201        max: None,
3202        step: Some(1.0),
3203        enum_values: EMPTY_ENUM_VALUES,
3204        notes: None,
3205    },
3206    IndicatorParamInfo {
3207        key: "fast_multiplier",
3208        label: "Fast Multiplier",
3209        kind: IndicatorParamKind::Float,
3210        required: false,
3211        default: Some(ParamValueStatic::Float(2.618)),
3212        min: Some(0.0),
3213        max: None,
3214        step: None,
3215        enum_values: EMPTY_ENUM_VALUES,
3216        notes: None,
3217    },
3218    IndicatorParamInfo {
3219        key: "slow_multiplier",
3220        label: "Slow Multiplier",
3221        kind: IndicatorParamKind::Float,
3222        required: false,
3223        default: Some(ParamValueStatic::Float(4.236)),
3224        min: Some(0.0),
3225        max: None,
3226        step: None,
3227        enum_values: EMPTY_ENUM_VALUES,
3228        notes: None,
3229    },
3230    IndicatorParamInfo {
3231        key: "volume_type",
3232        label: "Volume Type",
3233        kind: IndicatorParamKind::EnumString,
3234        required: false,
3235        default: Some(ParamValueStatic::EnumString("default")),
3236        min: None,
3237        max: None,
3238        step: None,
3239        enum_values: EMPTY_ENUM_VALUES,
3240        notes: None,
3241    },
3242    IndicatorParamInfo {
3243        key: "center_type",
3244        label: "Center Type",
3245        kind: IndicatorParamKind::EnumString,
3246        required: false,
3247        default: Some(ParamValueStatic::EnumString("dynamic")),
3248        min: None,
3249        max: None,
3250        step: None,
3251        enum_values: EMPTY_ENUM_VALUES,
3252        notes: None,
3253    },
3254    IndicatorParamInfo {
3255        key: "tick_size",
3256        label: "Tick Size",
3257        kind: IndicatorParamKind::Float,
3258        required: false,
3259        default: Some(ParamValueStatic::Float(0.01)),
3260        min: Some(0.0),
3261        max: None,
3262        step: None,
3263        enum_values: EMPTY_ENUM_VALUES,
3264        notes: None,
3265    },
3266];
3267
3268const PARAM_EMD: &[IndicatorParamInfo] = &[
3269    IndicatorParamInfo {
3270        key: "period",
3271        label: "Period",
3272        kind: IndicatorParamKind::Int,
3273        required: false,
3274        default: Some(ParamValueStatic::Int(20)),
3275        min: Some(1.0),
3276        max: None,
3277        step: Some(1.0),
3278        enum_values: EMPTY_ENUM_VALUES,
3279        notes: None,
3280    },
3281    IndicatorParamInfo {
3282        key: "delta",
3283        label: "Delta",
3284        kind: IndicatorParamKind::Float,
3285        required: false,
3286        default: Some(ParamValueStatic::Float(0.5)),
3287        min: Some(0.0),
3288        max: None,
3289        step: None,
3290        enum_values: EMPTY_ENUM_VALUES,
3291        notes: None,
3292    },
3293    IndicatorParamInfo {
3294        key: "fraction",
3295        label: "Fraction",
3296        kind: IndicatorParamKind::Float,
3297        required: false,
3298        default: Some(ParamValueStatic::Float(0.1)),
3299        min: Some(0.0),
3300        max: None,
3301        step: None,
3302        enum_values: EMPTY_ENUM_VALUES,
3303        notes: None,
3304    },
3305];
3306
3307const PARAM_ERI: &[IndicatorParamInfo] = &[
3308    IndicatorParamInfo {
3309        key: "period",
3310        label: "Period",
3311        kind: IndicatorParamKind::Int,
3312        required: false,
3313        default: Some(ParamValueStatic::Int(13)),
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: "ma_type",
3322        label: "MA Type",
3323        kind: IndicatorParamKind::EnumString,
3324        required: false,
3325        default: Some(ParamValueStatic::EnumString("ema")),
3326        min: None,
3327        max: None,
3328        step: None,
3329        enum_values: EMPTY_ENUM_VALUES,
3330        notes: None,
3331    },
3332];
3333
3334const PARAM_FISHER: &[IndicatorParamInfo] = &[IndicatorParamInfo {
3335    key: "period",
3336    label: "Period",
3337    kind: IndicatorParamKind::Int,
3338    required: false,
3339    default: Some(ParamValueStatic::Int(9)),
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_FVG_TRAILING_STOP: &[IndicatorParamInfo] = &[
3348    IndicatorParamInfo {
3349        key: "unmitigated_fvg_lookback",
3350        label: "FVG Lookback",
3351        kind: IndicatorParamKind::Int,
3352        required: false,
3353        default: Some(ParamValueStatic::Int(5)),
3354        min: Some(1.0),
3355        max: None,
3356        step: Some(1.0),
3357        enum_values: EMPTY_ENUM_VALUES,
3358        notes: None,
3359    },
3360    IndicatorParamInfo {
3361        key: "smoothing_length",
3362        label: "Smoothing Length",
3363        kind: IndicatorParamKind::Int,
3364        required: false,
3365        default: Some(ParamValueStatic::Int(9)),
3366        min: Some(1.0),
3367        max: None,
3368        step: Some(1.0),
3369        enum_values: EMPTY_ENUM_VALUES,
3370        notes: None,
3371    },
3372    IndicatorParamInfo {
3373        key: "reset_on_cross",
3374        label: "Reset On Cross",
3375        kind: IndicatorParamKind::Bool,
3376        required: false,
3377        default: Some(ParamValueStatic::Bool(false)),
3378        min: None,
3379        max: None,
3380        step: None,
3381        enum_values: ENUM_VALUES_TRUE_FALSE,
3382        notes: None,
3383    },
3384];
3385
3386const PARAM_GATOROSC: &[IndicatorParamInfo] = &[
3387    IndicatorParamInfo {
3388        key: "jaws_length",
3389        label: "Jaws Length",
3390        kind: IndicatorParamKind::Int,
3391        required: false,
3392        default: Some(ParamValueStatic::Int(13)),
3393        min: Some(1.0),
3394        max: None,
3395        step: Some(1.0),
3396        enum_values: EMPTY_ENUM_VALUES,
3397        notes: None,
3398    },
3399    IndicatorParamInfo {
3400        key: "jaws_shift",
3401        label: "Jaws Shift",
3402        kind: IndicatorParamKind::Int,
3403        required: false,
3404        default: Some(ParamValueStatic::Int(8)),
3405        min: Some(0.0),
3406        max: None,
3407        step: Some(1.0),
3408        enum_values: EMPTY_ENUM_VALUES,
3409        notes: None,
3410    },
3411    IndicatorParamInfo {
3412        key: "teeth_length",
3413        label: "Teeth Length",
3414        kind: IndicatorParamKind::Int,
3415        required: false,
3416        default: Some(ParamValueStatic::Int(8)),
3417        min: Some(1.0),
3418        max: None,
3419        step: Some(1.0),
3420        enum_values: EMPTY_ENUM_VALUES,
3421        notes: None,
3422    },
3423    IndicatorParamInfo {
3424        key: "teeth_shift",
3425        label: "Teeth Shift",
3426        kind: IndicatorParamKind::Int,
3427        required: false,
3428        default: Some(ParamValueStatic::Int(5)),
3429        min: Some(0.0),
3430        max: None,
3431        step: Some(1.0),
3432        enum_values: EMPTY_ENUM_VALUES,
3433        notes: None,
3434    },
3435    IndicatorParamInfo {
3436        key: "lips_length",
3437        label: "Lips Length",
3438        kind: IndicatorParamKind::Int,
3439        required: false,
3440        default: Some(ParamValueStatic::Int(5)),
3441        min: Some(1.0),
3442        max: None,
3443        step: Some(1.0),
3444        enum_values: EMPTY_ENUM_VALUES,
3445        notes: None,
3446    },
3447    IndicatorParamInfo {
3448        key: "lips_shift",
3449        label: "Lips Shift",
3450        kind: IndicatorParamKind::Int,
3451        required: false,
3452        default: Some(ParamValueStatic::Int(3)),
3453        min: Some(0.0),
3454        max: None,
3455        step: Some(1.0),
3456        enum_values: EMPTY_ENUM_VALUES,
3457        notes: None,
3458    },
3459];
3460
3461const PARAM_HALFTREND: &[IndicatorParamInfo] = &[
3462    IndicatorParamInfo {
3463        key: "amplitude",
3464        label: "Amplitude",
3465        kind: IndicatorParamKind::Int,
3466        required: false,
3467        default: Some(ParamValueStatic::Int(2)),
3468        min: Some(1.0),
3469        max: None,
3470        step: Some(1.0),
3471        enum_values: EMPTY_ENUM_VALUES,
3472        notes: None,
3473    },
3474    IndicatorParamInfo {
3475        key: "channel_deviation",
3476        label: "Channel Deviation",
3477        kind: IndicatorParamKind::Float,
3478        required: false,
3479        default: Some(ParamValueStatic::Float(2.0)),
3480        min: Some(0.0),
3481        max: None,
3482        step: None,
3483        enum_values: EMPTY_ENUM_VALUES,
3484        notes: None,
3485    },
3486    IndicatorParamInfo {
3487        key: "atr_period",
3488        label: "ATR Period",
3489        kind: IndicatorParamKind::Int,
3490        required: false,
3491        default: Some(ParamValueStatic::Int(100)),
3492        min: Some(1.0),
3493        max: None,
3494        step: Some(1.0),
3495        enum_values: EMPTY_ENUM_VALUES,
3496        notes: None,
3497    },
3498];
3499
3500const PARAM_SAFEZONESTOP: &[IndicatorParamInfo] = &[
3501    IndicatorParamInfo {
3502        key: "period",
3503        label: "Period",
3504        kind: IndicatorParamKind::Int,
3505        required: false,
3506        default: Some(ParamValueStatic::Int(22)),
3507        min: Some(1.0),
3508        max: None,
3509        step: Some(1.0),
3510        enum_values: EMPTY_ENUM_VALUES,
3511        notes: None,
3512    },
3513    IndicatorParamInfo {
3514        key: "mult",
3515        label: "Multiplier",
3516        kind: IndicatorParamKind::Float,
3517        required: false,
3518        default: Some(ParamValueStatic::Float(2.5)),
3519        min: Some(0.0),
3520        max: None,
3521        step: None,
3522        enum_values: EMPTY_ENUM_VALUES,
3523        notes: None,
3524    },
3525    IndicatorParamInfo {
3526        key: "max_lookback",
3527        label: "Max Lookback",
3528        kind: IndicatorParamKind::Int,
3529        required: false,
3530        default: Some(ParamValueStatic::Int(3)),
3531        min: Some(1.0),
3532        max: None,
3533        step: Some(1.0),
3534        enum_values: EMPTY_ENUM_VALUES,
3535        notes: None,
3536    },
3537    IndicatorParamInfo {
3538        key: "direction",
3539        label: "Direction",
3540        kind: IndicatorParamKind::EnumString,
3541        required: false,
3542        default: Some(ParamValueStatic::EnumString("long")),
3543        min: None,
3544        max: None,
3545        step: None,
3546        enum_values: EMPTY_ENUM_VALUES,
3547        notes: None,
3548    },
3549];
3550
3551const PARAM_DEVSTOP: &[IndicatorParamInfo] = &[
3552    IndicatorParamInfo {
3553        key: "period",
3554        label: "Period",
3555        kind: IndicatorParamKind::Int,
3556        required: false,
3557        default: Some(ParamValueStatic::Int(20)),
3558        min: Some(1.0),
3559        max: None,
3560        step: Some(1.0),
3561        enum_values: EMPTY_ENUM_VALUES,
3562        notes: None,
3563    },
3564    IndicatorParamInfo {
3565        key: "mult",
3566        label: "Multiplier",
3567        kind: IndicatorParamKind::Float,
3568        required: false,
3569        default: Some(ParamValueStatic::Float(0.0)),
3570        min: Some(0.0),
3571        max: None,
3572        step: None,
3573        enum_values: EMPTY_ENUM_VALUES,
3574        notes: None,
3575    },
3576    IndicatorParamInfo {
3577        key: "devtype",
3578        label: "Dev Type",
3579        kind: IndicatorParamKind::Int,
3580        required: false,
3581        default: Some(ParamValueStatic::Int(0)),
3582        min: Some(0.0),
3583        max: None,
3584        step: Some(1.0),
3585        enum_values: EMPTY_ENUM_VALUES,
3586        notes: None,
3587    },
3588    IndicatorParamInfo {
3589        key: "direction",
3590        label: "Direction",
3591        kind: IndicatorParamKind::EnumString,
3592        required: false,
3593        default: Some(ParamValueStatic::EnumString("long")),
3594        min: None,
3595        max: None,
3596        step: None,
3597        enum_values: EMPTY_ENUM_VALUES,
3598        notes: None,
3599    },
3600    IndicatorParamInfo {
3601        key: "ma_type",
3602        label: "MA Type",
3603        kind: IndicatorParamKind::EnumString,
3604        required: false,
3605        default: Some(ParamValueStatic::EnumString("sma")),
3606        min: None,
3607        max: None,
3608        step: None,
3609        enum_values: EMPTY_ENUM_VALUES,
3610        notes: None,
3611    },
3612];
3613
3614const PARAM_MOD_GOD_MODE: &[IndicatorParamInfo] = &[
3615    IndicatorParamInfo {
3616        key: "n1",
3617        label: "N1",
3618        kind: IndicatorParamKind::Int,
3619        required: false,
3620        default: Some(ParamValueStatic::Int(17)),
3621        min: Some(1.0),
3622        max: None,
3623        step: Some(1.0),
3624        enum_values: EMPTY_ENUM_VALUES,
3625        notes: None,
3626    },
3627    IndicatorParamInfo {
3628        key: "n2",
3629        label: "N2",
3630        kind: IndicatorParamKind::Int,
3631        required: false,
3632        default: Some(ParamValueStatic::Int(6)),
3633        min: Some(1.0),
3634        max: None,
3635        step: Some(1.0),
3636        enum_values: EMPTY_ENUM_VALUES,
3637        notes: None,
3638    },
3639    IndicatorParamInfo {
3640        key: "n3",
3641        label: "N3",
3642        kind: IndicatorParamKind::Int,
3643        required: false,
3644        default: Some(ParamValueStatic::Int(4)),
3645        min: Some(1.0),
3646        max: None,
3647        step: Some(1.0),
3648        enum_values: EMPTY_ENUM_VALUES,
3649        notes: None,
3650    },
3651    IndicatorParamInfo {
3652        key: "mode",
3653        label: "Mode",
3654        kind: IndicatorParamKind::EnumString,
3655        required: false,
3656        default: Some(ParamValueStatic::EnumString("tradition_mg")),
3657        min: None,
3658        max: None,
3659        step: None,
3660        enum_values: EMPTY_ENUM_VALUES,
3661        notes: None,
3662    },
3663    IndicatorParamInfo {
3664        key: "use_volume",
3665        label: "Use Volume",
3666        kind: IndicatorParamKind::Bool,
3667        required: false,
3668        default: Some(ParamValueStatic::Bool(true)),
3669        min: None,
3670        max: None,
3671        step: None,
3672        enum_values: ENUM_VALUES_TRUE_FALSE,
3673        notes: None,
3674    },
3675];
3676
3677const PARAM_KST: &[IndicatorParamInfo] = &[
3678    IndicatorParamInfo {
3679        key: "sma_period1",
3680        label: "SMA 1",
3681        kind: IndicatorParamKind::Int,
3682        required: false,
3683        default: Some(ParamValueStatic::Int(10)),
3684        min: Some(1.0),
3685        max: None,
3686        step: Some(1.0),
3687        enum_values: EMPTY_ENUM_VALUES,
3688        notes: None,
3689    },
3690    IndicatorParamInfo {
3691        key: "sma_period2",
3692        label: "SMA 2",
3693        kind: IndicatorParamKind::Int,
3694        required: false,
3695        default: Some(ParamValueStatic::Int(10)),
3696        min: Some(1.0),
3697        max: None,
3698        step: Some(1.0),
3699        enum_values: EMPTY_ENUM_VALUES,
3700        notes: None,
3701    },
3702    IndicatorParamInfo {
3703        key: "sma_period3",
3704        label: "SMA 3",
3705        kind: IndicatorParamKind::Int,
3706        required: false,
3707        default: Some(ParamValueStatic::Int(10)),
3708        min: Some(1.0),
3709        max: None,
3710        step: Some(1.0),
3711        enum_values: EMPTY_ENUM_VALUES,
3712        notes: None,
3713    },
3714    IndicatorParamInfo {
3715        key: "sma_period4",
3716        label: "SMA 4",
3717        kind: IndicatorParamKind::Int,
3718        required: false,
3719        default: Some(ParamValueStatic::Int(15)),
3720        min: Some(1.0),
3721        max: None,
3722        step: Some(1.0),
3723        enum_values: EMPTY_ENUM_VALUES,
3724        notes: None,
3725    },
3726    IndicatorParamInfo {
3727        key: "roc_period1",
3728        label: "ROC 1",
3729        kind: IndicatorParamKind::Int,
3730        required: false,
3731        default: Some(ParamValueStatic::Int(10)),
3732        min: Some(1.0),
3733        max: None,
3734        step: Some(1.0),
3735        enum_values: EMPTY_ENUM_VALUES,
3736        notes: None,
3737    },
3738    IndicatorParamInfo {
3739        key: "roc_period2",
3740        label: "ROC 2",
3741        kind: IndicatorParamKind::Int,
3742        required: false,
3743        default: Some(ParamValueStatic::Int(15)),
3744        min: Some(1.0),
3745        max: None,
3746        step: Some(1.0),
3747        enum_values: EMPTY_ENUM_VALUES,
3748        notes: None,
3749    },
3750    IndicatorParamInfo {
3751        key: "roc_period3",
3752        label: "ROC 3",
3753        kind: IndicatorParamKind::Int,
3754        required: false,
3755        default: Some(ParamValueStatic::Int(20)),
3756        min: Some(1.0),
3757        max: None,
3758        step: Some(1.0),
3759        enum_values: EMPTY_ENUM_VALUES,
3760        notes: None,
3761    },
3762    IndicatorParamInfo {
3763        key: "roc_period4",
3764        label: "ROC 4",
3765        kind: IndicatorParamKind::Int,
3766        required: false,
3767        default: Some(ParamValueStatic::Int(30)),
3768        min: Some(1.0),
3769        max: None,
3770        step: Some(1.0),
3771        enum_values: EMPTY_ENUM_VALUES,
3772        notes: None,
3773    },
3774    IndicatorParamInfo {
3775        key: "signal_period",
3776        label: "Signal Period",
3777        kind: IndicatorParamKind::Int,
3778        required: false,
3779        default: Some(ParamValueStatic::Int(9)),
3780        min: Some(1.0),
3781        max: None,
3782        step: Some(1.0),
3783        enum_values: EMPTY_ENUM_VALUES,
3784        notes: None,
3785    },
3786];
3787
3788const PARAM_KAUFMANSTOP: &[IndicatorParamInfo] = &[
3789    IndicatorParamInfo {
3790        key: "period",
3791        label: "Period",
3792        kind: IndicatorParamKind::Int,
3793        required: false,
3794        default: Some(ParamValueStatic::Int(22)),
3795        min: Some(1.0),
3796        max: None,
3797        step: Some(1.0),
3798        enum_values: EMPTY_ENUM_VALUES,
3799        notes: None,
3800    },
3801    IndicatorParamInfo {
3802        key: "mult",
3803        label: "Multiplier",
3804        kind: IndicatorParamKind::Float,
3805        required: false,
3806        default: Some(ParamValueStatic::Float(2.0)),
3807        min: Some(0.0),
3808        max: None,
3809        step: None,
3810        enum_values: EMPTY_ENUM_VALUES,
3811        notes: None,
3812    },
3813    IndicatorParamInfo {
3814        key: "direction",
3815        label: "Direction",
3816        kind: IndicatorParamKind::EnumString,
3817        required: false,
3818        default: Some(ParamValueStatic::EnumString("long")),
3819        min: None,
3820        max: None,
3821        step: None,
3822        enum_values: EMPTY_ENUM_VALUES,
3823        notes: None,
3824    },
3825    IndicatorParamInfo {
3826        key: "ma_type",
3827        label: "MA Type",
3828        kind: IndicatorParamKind::EnumString,
3829        required: false,
3830        default: Some(ParamValueStatic::EnumString("sma")),
3831        min: None,
3832        max: None,
3833        step: None,
3834        enum_values: EMPTY_ENUM_VALUES,
3835        notes: None,
3836    },
3837];
3838
3839const PARAM_LPC: &[IndicatorParamInfo] = &[
3840    IndicatorParamInfo {
3841        key: "cutoff_type",
3842        label: "Cutoff Type",
3843        kind: IndicatorParamKind::EnumString,
3844        required: false,
3845        default: Some(ParamValueStatic::EnumString("adaptive")),
3846        min: None,
3847        max: None,
3848        step: None,
3849        enum_values: EMPTY_ENUM_VALUES,
3850        notes: None,
3851    },
3852    IndicatorParamInfo {
3853        key: "fixed_period",
3854        label: "Fixed Period",
3855        kind: IndicatorParamKind::Int,
3856        required: false,
3857        default: Some(ParamValueStatic::Int(20)),
3858        min: Some(1.0),
3859        max: None,
3860        step: Some(1.0),
3861        enum_values: EMPTY_ENUM_VALUES,
3862        notes: None,
3863    },
3864    IndicatorParamInfo {
3865        key: "max_cycle_limit",
3866        label: "Max Cycle Limit",
3867        kind: IndicatorParamKind::Int,
3868        required: false,
3869        default: Some(ParamValueStatic::Int(60)),
3870        min: Some(1.0),
3871        max: None,
3872        step: Some(1.0),
3873        enum_values: EMPTY_ENUM_VALUES,
3874        notes: None,
3875    },
3876    IndicatorParamInfo {
3877        key: "cycle_mult",
3878        label: "Cycle Mult",
3879        kind: IndicatorParamKind::Float,
3880        required: false,
3881        default: Some(ParamValueStatic::Float(1.0)),
3882        min: Some(0.0),
3883        max: None,
3884        step: None,
3885        enum_values: EMPTY_ENUM_VALUES,
3886        notes: None,
3887    },
3888    IndicatorParamInfo {
3889        key: "tr_mult",
3890        label: "TR Mult",
3891        kind: IndicatorParamKind::Float,
3892        required: false,
3893        default: Some(ParamValueStatic::Float(1.0)),
3894        min: Some(0.0),
3895        max: None,
3896        step: None,
3897        enum_values: EMPTY_ENUM_VALUES,
3898        notes: None,
3899    },
3900];
3901
3902const PARAM_MAB: &[IndicatorParamInfo] = &[
3903    IndicatorParamInfo {
3904        key: "fast_period",
3905        label: "Fast Period",
3906        kind: IndicatorParamKind::Int,
3907        required: false,
3908        default: Some(ParamValueStatic::Int(10)),
3909        min: Some(1.0),
3910        max: None,
3911        step: Some(1.0),
3912        enum_values: EMPTY_ENUM_VALUES,
3913        notes: None,
3914    },
3915    IndicatorParamInfo {
3916        key: "slow_period",
3917        label: "Slow Period",
3918        kind: IndicatorParamKind::Int,
3919        required: false,
3920        default: Some(ParamValueStatic::Int(50)),
3921        min: Some(1.0),
3922        max: None,
3923        step: Some(1.0),
3924        enum_values: EMPTY_ENUM_VALUES,
3925        notes: None,
3926    },
3927    IndicatorParamInfo {
3928        key: "devup",
3929        label: "Dev Up",
3930        kind: IndicatorParamKind::Float,
3931        required: false,
3932        default: Some(ParamValueStatic::Float(1.0)),
3933        min: Some(0.0),
3934        max: None,
3935        step: None,
3936        enum_values: EMPTY_ENUM_VALUES,
3937        notes: None,
3938    },
3939    IndicatorParamInfo {
3940        key: "devdn",
3941        label: "Dev Down",
3942        kind: IndicatorParamKind::Float,
3943        required: false,
3944        default: Some(ParamValueStatic::Float(1.0)),
3945        min: Some(0.0),
3946        max: None,
3947        step: None,
3948        enum_values: EMPTY_ENUM_VALUES,
3949        notes: None,
3950    },
3951    IndicatorParamInfo {
3952        key: "fast_ma_type",
3953        label: "Fast MA Type",
3954        kind: IndicatorParamKind::EnumString,
3955        required: false,
3956        default: Some(ParamValueStatic::EnumString("sma")),
3957        min: None,
3958        max: None,
3959        step: None,
3960        enum_values: EMPTY_ENUM_VALUES,
3961        notes: None,
3962    },
3963    IndicatorParamInfo {
3964        key: "slow_ma_type",
3965        label: "Slow MA Type",
3966        kind: IndicatorParamKind::EnumString,
3967        required: false,
3968        default: Some(ParamValueStatic::EnumString("sma")),
3969        min: None,
3970        max: None,
3971        step: None,
3972        enum_values: EMPTY_ENUM_VALUES,
3973        notes: None,
3974    },
3975];
3976
3977const PARAM_MACZ: &[IndicatorParamInfo] = &[
3978    IndicatorParamInfo {
3979        key: "fast_length",
3980        label: "Fast Length",
3981        kind: IndicatorParamKind::Int,
3982        required: false,
3983        default: Some(ParamValueStatic::Int(12)),
3984        min: Some(1.0),
3985        max: None,
3986        step: Some(1.0),
3987        enum_values: EMPTY_ENUM_VALUES,
3988        notes: None,
3989    },
3990    IndicatorParamInfo {
3991        key: "slow_length",
3992        label: "Slow Length",
3993        kind: IndicatorParamKind::Int,
3994        required: false,
3995        default: Some(ParamValueStatic::Int(25)),
3996        min: Some(1.0),
3997        max: None,
3998        step: Some(1.0),
3999        enum_values: EMPTY_ENUM_VALUES,
4000        notes: None,
4001    },
4002    IndicatorParamInfo {
4003        key: "signal_length",
4004        label: "Signal Length",
4005        kind: IndicatorParamKind::Int,
4006        required: false,
4007        default: Some(ParamValueStatic::Int(9)),
4008        min: Some(1.0),
4009        max: None,
4010        step: Some(1.0),
4011        enum_values: EMPTY_ENUM_VALUES,
4012        notes: None,
4013    },
4014    IndicatorParamInfo {
4015        key: "lengthz",
4016        label: "Length Z",
4017        kind: IndicatorParamKind::Int,
4018        required: false,
4019        default: Some(ParamValueStatic::Int(20)),
4020        min: Some(1.0),
4021        max: None,
4022        step: Some(1.0),
4023        enum_values: EMPTY_ENUM_VALUES,
4024        notes: None,
4025    },
4026    IndicatorParamInfo {
4027        key: "length_stdev",
4028        label: "Length StdDev",
4029        kind: IndicatorParamKind::Int,
4030        required: false,
4031        default: Some(ParamValueStatic::Int(25)),
4032        min: Some(1.0),
4033        max: None,
4034        step: Some(1.0),
4035        enum_values: EMPTY_ENUM_VALUES,
4036        notes: None,
4037    },
4038    IndicatorParamInfo {
4039        key: "a",
4040        label: "A",
4041        kind: IndicatorParamKind::Float,
4042        required: false,
4043        default: Some(ParamValueStatic::Float(1.0)),
4044        min: None,
4045        max: None,
4046        step: None,
4047        enum_values: EMPTY_ENUM_VALUES,
4048        notes: None,
4049    },
4050    IndicatorParamInfo {
4051        key: "b",
4052        label: "B",
4053        kind: IndicatorParamKind::Float,
4054        required: false,
4055        default: Some(ParamValueStatic::Float(1.0)),
4056        min: None,
4057        max: None,
4058        step: None,
4059        enum_values: EMPTY_ENUM_VALUES,
4060        notes: None,
4061    },
4062    IndicatorParamInfo {
4063        key: "use_lag",
4064        label: "Use Lag",
4065        kind: IndicatorParamKind::Bool,
4066        required: false,
4067        default: Some(ParamValueStatic::Bool(false)),
4068        min: None,
4069        max: None,
4070        step: None,
4071        enum_values: ENUM_VALUES_TRUE_FALSE,
4072        notes: None,
4073    },
4074    IndicatorParamInfo {
4075        key: "gamma",
4076        label: "Gamma",
4077        kind: IndicatorParamKind::Float,
4078        required: false,
4079        default: Some(ParamValueStatic::Float(0.02)),
4080        min: None,
4081        max: None,
4082        step: None,
4083        enum_values: EMPTY_ENUM_VALUES,
4084        notes: None,
4085    },
4086];
4087
4088const PARAM_MINMAX: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4089    key: "order",
4090    label: "Order",
4091    kind: IndicatorParamKind::Int,
4092    required: false,
4093    default: Some(ParamValueStatic::Int(3)),
4094    min: Some(1.0),
4095    max: None,
4096    step: Some(1.0),
4097    enum_values: EMPTY_ENUM_VALUES,
4098    notes: None,
4099}];
4100
4101const PARAM_MSW: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4102    key: "period",
4103    label: "Period",
4104    kind: IndicatorParamKind::Int,
4105    required: false,
4106    default: Some(ParamValueStatic::Int(5)),
4107    min: Some(1.0),
4108    max: None,
4109    step: Some(1.0),
4110    enum_values: EMPTY_ENUM_VALUES,
4111    notes: None,
4112}];
4113
4114const PARAM_NWE: &[IndicatorParamInfo] = &[
4115    IndicatorParamInfo {
4116        key: "bandwidth",
4117        label: "Bandwidth",
4118        kind: IndicatorParamKind::Float,
4119        required: false,
4120        default: Some(ParamValueStatic::Float(8.0)),
4121        min: Some(0.0),
4122        max: None,
4123        step: None,
4124        enum_values: EMPTY_ENUM_VALUES,
4125        notes: None,
4126    },
4127    IndicatorParamInfo {
4128        key: "multiplier",
4129        label: "Multiplier",
4130        kind: IndicatorParamKind::Float,
4131        required: false,
4132        default: Some(ParamValueStatic::Float(3.0)),
4133        min: Some(0.0),
4134        max: None,
4135        step: None,
4136        enum_values: EMPTY_ENUM_VALUES,
4137        notes: None,
4138    },
4139    IndicatorParamInfo {
4140        key: "lookback",
4141        label: "Lookback",
4142        kind: IndicatorParamKind::Int,
4143        required: false,
4144        default: Some(ParamValueStatic::Int(500)),
4145        min: Some(1.0),
4146        max: None,
4147        step: Some(1.0),
4148        enum_values: EMPTY_ENUM_VALUES,
4149        notes: None,
4150    },
4151];
4152
4153const PARAM_OTT: &[IndicatorParamInfo] = &[
4154    IndicatorParamInfo {
4155        key: "period",
4156        label: "Period",
4157        kind: IndicatorParamKind::Int,
4158        required: false,
4159        default: Some(ParamValueStatic::Int(2)),
4160        min: Some(1.0),
4161        max: None,
4162        step: Some(1.0),
4163        enum_values: EMPTY_ENUM_VALUES,
4164        notes: None,
4165    },
4166    IndicatorParamInfo {
4167        key: "percent",
4168        label: "Percent",
4169        kind: IndicatorParamKind::Float,
4170        required: false,
4171        default: Some(ParamValueStatic::Float(1.4)),
4172        min: Some(0.0),
4173        max: None,
4174        step: None,
4175        enum_values: EMPTY_ENUM_VALUES,
4176        notes: None,
4177    },
4178    IndicatorParamInfo {
4179        key: "ma_type",
4180        label: "MA Type",
4181        kind: IndicatorParamKind::EnumString,
4182        required: false,
4183        default: Some(ParamValueStatic::EnumString("VAR")),
4184        min: None,
4185        max: None,
4186        step: None,
4187        enum_values: EMPTY_ENUM_VALUES,
4188        notes: None,
4189    },
4190];
4191
4192const PARAM_OTTO: &[IndicatorParamInfo] = &[
4193    IndicatorParamInfo {
4194        key: "ott_period",
4195        label: "OTT Period",
4196        kind: IndicatorParamKind::Int,
4197        required: false,
4198        default: Some(ParamValueStatic::Int(2)),
4199        min: Some(1.0),
4200        max: None,
4201        step: Some(1.0),
4202        enum_values: EMPTY_ENUM_VALUES,
4203        notes: None,
4204    },
4205    IndicatorParamInfo {
4206        key: "ott_percent",
4207        label: "OTT Percent",
4208        kind: IndicatorParamKind::Float,
4209        required: false,
4210        default: Some(ParamValueStatic::Float(0.6)),
4211        min: Some(0.0),
4212        max: None,
4213        step: None,
4214        enum_values: EMPTY_ENUM_VALUES,
4215        notes: None,
4216    },
4217    IndicatorParamInfo {
4218        key: "fast_vidya_length",
4219        label: "Fast VIDYA Length",
4220        kind: IndicatorParamKind::Int,
4221        required: false,
4222        default: Some(ParamValueStatic::Int(10)),
4223        min: Some(1.0),
4224        max: None,
4225        step: Some(1.0),
4226        enum_values: EMPTY_ENUM_VALUES,
4227        notes: None,
4228    },
4229    IndicatorParamInfo {
4230        key: "slow_vidya_length",
4231        label: "Slow VIDYA Length",
4232        kind: IndicatorParamKind::Int,
4233        required: false,
4234        default: Some(ParamValueStatic::Int(25)),
4235        min: Some(1.0),
4236        max: None,
4237        step: Some(1.0),
4238        enum_values: EMPTY_ENUM_VALUES,
4239        notes: None,
4240    },
4241    IndicatorParamInfo {
4242        key: "correcting_constant",
4243        label: "Correcting Constant",
4244        kind: IndicatorParamKind::Float,
4245        required: false,
4246        default: Some(ParamValueStatic::Float(100000.0)),
4247        min: Some(0.0),
4248        max: None,
4249        step: None,
4250        enum_values: EMPTY_ENUM_VALUES,
4251        notes: None,
4252    },
4253    IndicatorParamInfo {
4254        key: "ma_type",
4255        label: "MA Type",
4256        kind: IndicatorParamKind::EnumString,
4257        required: false,
4258        default: Some(ParamValueStatic::EnumString("VAR")),
4259        min: None,
4260        max: None,
4261        step: None,
4262        enum_values: EMPTY_ENUM_VALUES,
4263        notes: None,
4264    },
4265];
4266
4267const PARAM_PMA: &[IndicatorParamInfo] = PARAM_NONE;
4268
4269const PARAM_PRB: &[IndicatorParamInfo] = &[
4270    IndicatorParamInfo {
4271        key: "smooth_data",
4272        label: "Smooth Data",
4273        kind: IndicatorParamKind::Bool,
4274        required: false,
4275        default: Some(ParamValueStatic::Bool(true)),
4276        min: None,
4277        max: None,
4278        step: None,
4279        enum_values: ENUM_VALUES_TRUE_FALSE,
4280        notes: None,
4281    },
4282    IndicatorParamInfo {
4283        key: "smooth_period",
4284        label: "Smooth Period",
4285        kind: IndicatorParamKind::Int,
4286        required: false,
4287        default: Some(ParamValueStatic::Int(10)),
4288        min: Some(1.0),
4289        max: None,
4290        step: Some(1.0),
4291        enum_values: EMPTY_ENUM_VALUES,
4292        notes: None,
4293    },
4294    IndicatorParamInfo {
4295        key: "regression_period",
4296        label: "Regression Period",
4297        kind: IndicatorParamKind::Int,
4298        required: false,
4299        default: Some(ParamValueStatic::Int(100)),
4300        min: Some(1.0),
4301        max: None,
4302        step: Some(1.0),
4303        enum_values: EMPTY_ENUM_VALUES,
4304        notes: None,
4305    },
4306    IndicatorParamInfo {
4307        key: "polynomial_order",
4308        label: "Polynomial Order",
4309        kind: IndicatorParamKind::Int,
4310        required: false,
4311        default: Some(ParamValueStatic::Int(2)),
4312        min: Some(1.0),
4313        max: None,
4314        step: Some(1.0),
4315        enum_values: EMPTY_ENUM_VALUES,
4316        notes: None,
4317    },
4318    IndicatorParamInfo {
4319        key: "regression_offset",
4320        label: "Regression Offset",
4321        kind: IndicatorParamKind::Int,
4322        required: false,
4323        default: Some(ParamValueStatic::Int(0)),
4324        min: None,
4325        max: None,
4326        step: Some(1.0),
4327        enum_values: EMPTY_ENUM_VALUES,
4328        notes: None,
4329    },
4330    IndicatorParamInfo {
4331        key: "ndev",
4332        label: "NDev",
4333        kind: IndicatorParamKind::Float,
4334        required: false,
4335        default: Some(ParamValueStatic::Float(2.0)),
4336        min: Some(0.0),
4337        max: None,
4338        step: None,
4339        enum_values: EMPTY_ENUM_VALUES,
4340        notes: None,
4341    },
4342    IndicatorParamInfo {
4343        key: "equ_from",
4344        label: "Equ From",
4345        kind: IndicatorParamKind::Int,
4346        required: false,
4347        default: Some(ParamValueStatic::Int(0)),
4348        min: Some(0.0),
4349        max: None,
4350        step: Some(1.0),
4351        enum_values: EMPTY_ENUM_VALUES,
4352        notes: None,
4353    },
4354];
4355
4356const PARAM_QQE: &[IndicatorParamInfo] = &[
4357    IndicatorParamInfo {
4358        key: "rsi_period",
4359        label: "RSI Period",
4360        kind: IndicatorParamKind::Int,
4361        required: false,
4362        default: Some(ParamValueStatic::Int(14)),
4363        min: Some(1.0),
4364        max: None,
4365        step: Some(1.0),
4366        enum_values: EMPTY_ENUM_VALUES,
4367        notes: None,
4368    },
4369    IndicatorParamInfo {
4370        key: "smoothing_factor",
4371        label: "Smoothing Factor",
4372        kind: IndicatorParamKind::Int,
4373        required: false,
4374        default: Some(ParamValueStatic::Int(5)),
4375        min: Some(1.0),
4376        max: None,
4377        step: Some(1.0),
4378        enum_values: EMPTY_ENUM_VALUES,
4379        notes: None,
4380    },
4381    IndicatorParamInfo {
4382        key: "fast_factor",
4383        label: "Fast Factor",
4384        kind: IndicatorParamKind::Float,
4385        required: false,
4386        default: Some(ParamValueStatic::Float(4.236)),
4387        min: Some(0.0),
4388        max: None,
4389        step: None,
4390        enum_values: EMPTY_ENUM_VALUES,
4391        notes: None,
4392    },
4393];
4394
4395const PARAM_RANGE_FILTER: &[IndicatorParamInfo] = &[
4396    IndicatorParamInfo {
4397        key: "range_size",
4398        label: "Range Size",
4399        kind: IndicatorParamKind::Float,
4400        required: false,
4401        default: Some(ParamValueStatic::Float(2.618)),
4402        min: Some(0.0),
4403        max: None,
4404        step: None,
4405        enum_values: EMPTY_ENUM_VALUES,
4406        notes: None,
4407    },
4408    IndicatorParamInfo {
4409        key: "range_period",
4410        label: "Range Period",
4411        kind: IndicatorParamKind::Int,
4412        required: false,
4413        default: Some(ParamValueStatic::Int(14)),
4414        min: Some(1.0),
4415        max: None,
4416        step: Some(1.0),
4417        enum_values: EMPTY_ENUM_VALUES,
4418        notes: None,
4419    },
4420    IndicatorParamInfo {
4421        key: "smooth_range",
4422        label: "Smooth Range",
4423        kind: IndicatorParamKind::Bool,
4424        required: false,
4425        default: Some(ParamValueStatic::Bool(true)),
4426        min: None,
4427        max: None,
4428        step: None,
4429        enum_values: ENUM_VALUES_TRUE_FALSE,
4430        notes: None,
4431    },
4432    IndicatorParamInfo {
4433        key: "smooth_period",
4434        label: "Smooth Period",
4435        kind: IndicatorParamKind::Int,
4436        required: false,
4437        default: Some(ParamValueStatic::Int(27)),
4438        min: Some(1.0),
4439        max: None,
4440        step: Some(1.0),
4441        enum_values: EMPTY_ENUM_VALUES,
4442        notes: None,
4443    },
4444];
4445
4446const PARAM_RSMK: &[IndicatorParamInfo] = &[
4447    IndicatorParamInfo {
4448        key: "lookback",
4449        label: "Lookback",
4450        kind: IndicatorParamKind::Int,
4451        required: false,
4452        default: Some(ParamValueStatic::Int(90)),
4453        min: Some(1.0),
4454        max: None,
4455        step: Some(1.0),
4456        enum_values: EMPTY_ENUM_VALUES,
4457        notes: None,
4458    },
4459    IndicatorParamInfo {
4460        key: "period",
4461        label: "Period",
4462        kind: IndicatorParamKind::Int,
4463        required: false,
4464        default: Some(ParamValueStatic::Int(3)),
4465        min: Some(1.0),
4466        max: None,
4467        step: Some(1.0),
4468        enum_values: EMPTY_ENUM_VALUES,
4469        notes: None,
4470    },
4471    IndicatorParamInfo {
4472        key: "signal_period",
4473        label: "Signal Period",
4474        kind: IndicatorParamKind::Int,
4475        required: false,
4476        default: Some(ParamValueStatic::Int(20)),
4477        min: Some(1.0),
4478        max: None,
4479        step: Some(1.0),
4480        enum_values: EMPTY_ENUM_VALUES,
4481        notes: None,
4482    },
4483    IndicatorParamInfo {
4484        key: "matype",
4485        label: "MA Type",
4486        kind: IndicatorParamKind::EnumString,
4487        required: false,
4488        default: Some(ParamValueStatic::EnumString("ema")),
4489        min: None,
4490        max: None,
4491        step: None,
4492        enum_values: EMPTY_ENUM_VALUES,
4493        notes: None,
4494    },
4495    IndicatorParamInfo {
4496        key: "signal_matype",
4497        label: "Signal MA Type",
4498        kind: IndicatorParamKind::EnumString,
4499        required: false,
4500        default: Some(ParamValueStatic::EnumString("ema")),
4501        min: None,
4502        max: None,
4503        step: None,
4504        enum_values: EMPTY_ENUM_VALUES,
4505        notes: None,
4506    },
4507];
4508
4509const PARAM_VOSS: &[IndicatorParamInfo] = &[
4510    IndicatorParamInfo {
4511        key: "period",
4512        label: "Period",
4513        kind: IndicatorParamKind::Int,
4514        required: false,
4515        default: Some(ParamValueStatic::Int(20)),
4516        min: Some(1.0),
4517        max: None,
4518        step: Some(1.0),
4519        enum_values: EMPTY_ENUM_VALUES,
4520        notes: None,
4521    },
4522    IndicatorParamInfo {
4523        key: "predict",
4524        label: "Predict",
4525        kind: IndicatorParamKind::Int,
4526        required: false,
4527        default: Some(ParamValueStatic::Int(3)),
4528        min: Some(1.0),
4529        max: None,
4530        step: Some(1.0),
4531        enum_values: EMPTY_ENUM_VALUES,
4532        notes: None,
4533    },
4534    IndicatorParamInfo {
4535        key: "bandwidth",
4536        label: "Bandwidth",
4537        kind: IndicatorParamKind::Float,
4538        required: false,
4539        default: Some(ParamValueStatic::Float(0.25)),
4540        min: Some(0.0),
4541        max: None,
4542        step: None,
4543        enum_values: EMPTY_ENUM_VALUES,
4544        notes: None,
4545    },
4546];
4547
4548const PARAM_STC: &[IndicatorParamInfo] = &[
4549    IndicatorParamInfo {
4550        key: "fast_period",
4551        label: "Fast Period",
4552        kind: IndicatorParamKind::Int,
4553        required: false,
4554        default: Some(ParamValueStatic::Int(23)),
4555        min: Some(1.0),
4556        max: None,
4557        step: Some(1.0),
4558        enum_values: EMPTY_ENUM_VALUES,
4559        notes: None,
4560    },
4561    IndicatorParamInfo {
4562        key: "slow_period",
4563        label: "Slow Period",
4564        kind: IndicatorParamKind::Int,
4565        required: false,
4566        default: Some(ParamValueStatic::Int(50)),
4567        min: Some(1.0),
4568        max: None,
4569        step: Some(1.0),
4570        enum_values: EMPTY_ENUM_VALUES,
4571        notes: None,
4572    },
4573    IndicatorParamInfo {
4574        key: "k_period",
4575        label: "K Period",
4576        kind: IndicatorParamKind::Int,
4577        required: false,
4578        default: Some(ParamValueStatic::Int(10)),
4579        min: Some(1.0),
4580        max: None,
4581        step: Some(1.0),
4582        enum_values: EMPTY_ENUM_VALUES,
4583        notes: None,
4584    },
4585    IndicatorParamInfo {
4586        key: "d_period",
4587        label: "D Period",
4588        kind: IndicatorParamKind::Int,
4589        required: false,
4590        default: Some(ParamValueStatic::Int(3)),
4591        min: Some(1.0),
4592        max: None,
4593        step: Some(1.0),
4594        enum_values: EMPTY_ENUM_VALUES,
4595        notes: None,
4596    },
4597];
4598
4599const PARAM_RVI: &[IndicatorParamInfo] = &[
4600    IndicatorParamInfo {
4601        key: "period",
4602        label: "Period",
4603        kind: IndicatorParamKind::Int,
4604        required: false,
4605        default: Some(ParamValueStatic::Int(10)),
4606        min: Some(1.0),
4607        max: None,
4608        step: Some(1.0),
4609        enum_values: EMPTY_ENUM_VALUES,
4610        notes: None,
4611    },
4612    IndicatorParamInfo {
4613        key: "ma_len",
4614        label: "MA Length",
4615        kind: IndicatorParamKind::Int,
4616        required: false,
4617        default: Some(ParamValueStatic::Int(14)),
4618        min: Some(1.0),
4619        max: None,
4620        step: Some(1.0),
4621        enum_values: EMPTY_ENUM_VALUES,
4622        notes: None,
4623    },
4624    IndicatorParamInfo {
4625        key: "matype",
4626        label: "MA Type",
4627        kind: IndicatorParamKind::Int,
4628        required: false,
4629        default: Some(ParamValueStatic::Int(1)),
4630        min: Some(0.0),
4631        max: None,
4632        step: Some(1.0),
4633        enum_values: EMPTY_ENUM_VALUES,
4634        notes: None,
4635    },
4636    IndicatorParamInfo {
4637        key: "devtype",
4638        label: "Deviation Type",
4639        kind: IndicatorParamKind::Int,
4640        required: false,
4641        default: Some(ParamValueStatic::Int(0)),
4642        min: Some(0.0),
4643        max: None,
4644        step: Some(1.0),
4645        enum_values: EMPTY_ENUM_VALUES,
4646        notes: None,
4647    },
4648];
4649
4650const PARAM_COPPOCK: &[IndicatorParamInfo] = &[
4651    IndicatorParamInfo {
4652        key: "short_roc_period",
4653        label: "Short ROC Period",
4654        kind: IndicatorParamKind::Int,
4655        required: false,
4656        default: Some(ParamValueStatic::Int(11)),
4657        min: Some(1.0),
4658        max: None,
4659        step: Some(1.0),
4660        enum_values: EMPTY_ENUM_VALUES,
4661        notes: None,
4662    },
4663    IndicatorParamInfo {
4664        key: "long_roc_period",
4665        label: "Long ROC Period",
4666        kind: IndicatorParamKind::Int,
4667        required: false,
4668        default: Some(ParamValueStatic::Int(14)),
4669        min: Some(1.0),
4670        max: None,
4671        step: Some(1.0),
4672        enum_values: EMPTY_ENUM_VALUES,
4673        notes: None,
4674    },
4675    IndicatorParamInfo {
4676        key: "ma_period",
4677        label: "MA Period",
4678        kind: IndicatorParamKind::Int,
4679        required: false,
4680        default: Some(ParamValueStatic::Int(10)),
4681        min: Some(1.0),
4682        max: None,
4683        step: Some(1.0),
4684        enum_values: EMPTY_ENUM_VALUES,
4685        notes: None,
4686    },
4687];
4688
4689const PARAM_PIVOT: &[IndicatorParamInfo] = &[IndicatorParamInfo {
4690    key: "mode",
4691    label: "Mode",
4692    kind: IndicatorParamKind::Int,
4693    required: false,
4694    default: Some(ParamValueStatic::Int(3)),
4695    min: Some(0.0),
4696    max: None,
4697    step: Some(1.0),
4698    enum_values: EMPTY_ENUM_VALUES,
4699    notes: None,
4700}];
4701
4702const SUPPLEMENTAL_SEED_NOTE: &str =
4703    "Phase 1 seed metadata; parameter and capability metadata will expand.";
4704
4705struct SupplementalIndicatorSeed {
4706    id: &'static str,
4707    label: &'static str,
4708    category: &'static str,
4709    input_kind: IndicatorInputKind,
4710    outputs: &'static [IndicatorOutputInfo],
4711    params: &'static [IndicatorParamInfo],
4712}
4713
4714const SUPPLEMENTAL_INDICATORS: &[SupplementalIndicatorSeed] = &[
4715    SupplementalIndicatorSeed {
4716        id: "adx",
4717        label: "ADX",
4718        category: "trend",
4719        input_kind: IndicatorInputKind::Ohlc,
4720        outputs: OUTPUTS_VALUE_F64,
4721        params: PARAM_ADX_PERIOD,
4722    },
4723    SupplementalIndicatorSeed {
4724        id: "adxr",
4725        label: "ADXR",
4726        category: "trend",
4727        input_kind: IndicatorInputKind::Ohlc,
4728        outputs: OUTPUTS_VALUE_F64,
4729        params: PARAM_ADX_PERIOD,
4730    },
4731    SupplementalIndicatorSeed {
4732        id: "dx",
4733        label: "DX",
4734        category: "trend",
4735        input_kind: IndicatorInputKind::Ohlc,
4736        outputs: OUTPUTS_VALUE_F64,
4737        params: PARAM_DX_PERIOD,
4738    },
4739    SupplementalIndicatorSeed {
4740        id: "di",
4741        label: "DI",
4742        category: "trend",
4743        input_kind: IndicatorInputKind::Ohlc,
4744        outputs: OUTPUTS_PLUS_MINUS,
4745        params: PARAM_DI,
4746    },
4747    SupplementalIndicatorSeed {
4748        id: "dm",
4749        label: "DM",
4750        category: "trend",
4751        input_kind: IndicatorInputKind::HighLow,
4752        outputs: OUTPUTS_PLUS_MINUS,
4753        params: PARAM_DM,
4754    },
4755    SupplementalIndicatorSeed {
4756        id: "vi",
4757        label: "VI",
4758        category: "trend",
4759        input_kind: IndicatorInputKind::Ohlc,
4760        outputs: OUTPUTS_PLUS_MINUS,
4761        params: PARAM_VI,
4762    },
4763    SupplementalIndicatorSeed {
4764        id: "donchian",
4765        label: "Donchian",
4766        category: "volatility",
4767        input_kind: IndicatorInputKind::HighLow,
4768        outputs: OUTPUTS_BOLLINGER,
4769        params: PARAM_DONCHIAN,
4770    },
4771    SupplementalIndicatorSeed {
4772        id: "supertrend",
4773        label: "SuperTrend",
4774        category: "trend",
4775        input_kind: IndicatorInputKind::Ohlc,
4776        outputs: OUTPUTS_TREND_CHANGED,
4777        params: PARAM_SUPERTREND,
4778    },
4779    SupplementalIndicatorSeed {
4780        id: "keltner",
4781        label: "Keltner",
4782        category: "volatility",
4783        input_kind: IndicatorInputKind::Ohlc,
4784        outputs: OUTPUTS_BOLLINGER,
4785        params: PARAM_KELTNER,
4786    },
4787    SupplementalIndicatorSeed {
4788        id: "aroon",
4789        label: "Aroon",
4790        category: "trend",
4791        input_kind: IndicatorInputKind::HighLow,
4792        outputs: OUTPUTS_UP_DOWN,
4793        params: PARAM_AROON,
4794    },
4795    SupplementalIndicatorSeed {
4796        id: "aroonosc",
4797        label: "Aroon Oscillator",
4798        category: "momentum",
4799        input_kind: IndicatorInputKind::HighLow,
4800        outputs: OUTPUTS_VALUE_F64,
4801        params: PARAM_AROON,
4802    },
4803    SupplementalIndicatorSeed {
4804        id: "srsi",
4805        label: "Stochastic RSI",
4806        category: "momentum",
4807        input_kind: IndicatorInputKind::Slice,
4808        outputs: OUTPUTS_STOCH,
4809        params: PARAM_SRSI,
4810    },
4811    SupplementalIndicatorSeed {
4812        id: "kdj",
4813        label: "KDJ",
4814        category: "momentum",
4815        input_kind: IndicatorInputKind::Ohlc,
4816        outputs: OUTPUTS_KDJ,
4817        params: PARAM_KDJ,
4818    },
4819    SupplementalIndicatorSeed {
4820        id: "squeeze_momentum",
4821        label: "Squeeze Momentum",
4822        category: "momentum",
4823        input_kind: IndicatorInputKind::Ohlc,
4824        outputs: OUTPUTS_SQUEEZE_MOMENTUM,
4825        params: PARAM_SQUEEZE_MOMENTUM,
4826    },
4827    SupplementalIndicatorSeed {
4828        id: "wavetrend",
4829        label: "WaveTrend",
4830        category: "momentum",
4831        input_kind: IndicatorInputKind::Slice,
4832        outputs: OUTPUTS_WAVETREND,
4833        params: PARAM_WAVETREND,
4834    },
4835    SupplementalIndicatorSeed {
4836        id: "wto",
4837        label: "WTO",
4838        category: "momentum",
4839        input_kind: IndicatorInputKind::Slice,
4840        outputs: OUTPUTS_WTO,
4841        params: PARAM_WTO,
4842    },
4843    SupplementalIndicatorSeed {
4844        id: "yang_zhang_volatility",
4845        label: "Yang-Zhang Volatility",
4846        category: "volatility",
4847        input_kind: IndicatorInputKind::Ohlc,
4848        outputs: OUTPUTS_YANG_ZHANG,
4849        params: PARAM_YANG_ZHANG,
4850    },
4851    SupplementalIndicatorSeed {
4852        id: "atr",
4853        label: "ATR",
4854        category: "volatility",
4855        input_kind: IndicatorInputKind::Ohlc,
4856        outputs: OUTPUTS_VALUE_F64,
4857        params: PARAM_ATR_PERIOD,
4858    },
4859    SupplementalIndicatorSeed {
4860        id: "ad",
4861        label: "AD",
4862        category: "volume",
4863        input_kind: IndicatorInputKind::Ohlcv,
4864        outputs: OUTPUTS_VALUE_F64,
4865        params: PARAM_NONE,
4866    },
4867    SupplementalIndicatorSeed {
4868        id: "adosc",
4869        label: "ADOSC",
4870        category: "volume",
4871        input_kind: IndicatorInputKind::Ohlcv,
4872        outputs: OUTPUTS_VALUE_F64,
4873        params: PARAM_ADOSC,
4874    },
4875    SupplementalIndicatorSeed {
4876        id: "ao",
4877        label: "AO",
4878        category: "momentum",
4879        input_kind: IndicatorInputKind::HighLow,
4880        outputs: OUTPUTS_VALUE_F64,
4881        params: PARAM_AO,
4882    },
4883    SupplementalIndicatorSeed {
4884        id: "bop",
4885        label: "BOP",
4886        category: "momentum",
4887        input_kind: IndicatorInputKind::Ohlc,
4888        outputs: OUTPUTS_VALUE_F64,
4889        params: PARAM_NONE,
4890    },
4891    SupplementalIndicatorSeed {
4892        id: "emv",
4893        label: "EMV",
4894        category: "volume",
4895        input_kind: IndicatorInputKind::Ohlcv,
4896        outputs: OUTPUTS_VALUE_F64,
4897        params: PARAM_NONE,
4898    },
4899    SupplementalIndicatorSeed {
4900        id: "efi",
4901        label: "EFI",
4902        category: "volume",
4903        input_kind: IndicatorInputKind::CloseVolume,
4904        outputs: OUTPUTS_VALUE_F64,
4905        params: PARAM_EFI_PERIOD,
4906    },
4907    SupplementalIndicatorSeed {
4908        id: "dti",
4909        label: "DTI",
4910        category: "momentum",
4911        input_kind: IndicatorInputKind::HighLow,
4912        outputs: OUTPUTS_VALUE_F64,
4913        params: PARAM_DTI,
4914    },
4915    SupplementalIndicatorSeed {
4916        id: "mfi",
4917        label: "MFI",
4918        category: "volume",
4919        input_kind: IndicatorInputKind::CloseVolume,
4920        outputs: OUTPUTS_VALUE_F64,
4921        params: PARAM_MFI_PERIOD,
4922    },
4923    SupplementalIndicatorSeed {
4924        id: "mass",
4925        label: "MASS",
4926        category: "volatility",
4927        input_kind: IndicatorInputKind::HighLow,
4928        outputs: OUTPUTS_VALUE_F64,
4929        params: PARAM_MASS_PERIOD,
4930    },
4931    SupplementalIndicatorSeed {
4932        id: "kvo",
4933        label: "KVO",
4934        category: "volume",
4935        input_kind: IndicatorInputKind::Ohlcv,
4936        outputs: OUTPUTS_VALUE_F64,
4937        params: PARAM_KVO,
4938    },
4939    SupplementalIndicatorSeed {
4940        id: "vosc",
4941        label: "VOSC",
4942        category: "volume",
4943        input_kind: IndicatorInputKind::Slice,
4944        outputs: OUTPUTS_VALUE_F64,
4945        params: PARAM_VOSC,
4946    },
4947    SupplementalIndicatorSeed {
4948        id: "rsi",
4949        label: "RSI",
4950        category: "momentum",
4951        input_kind: IndicatorInputKind::Slice,
4952        outputs: OUTPUTS_VALUE_F64,
4953        params: PARAM_RSI_PERIOD,
4954    },
4955    SupplementalIndicatorSeed {
4956        id: "rsx",
4957        label: "RSX",
4958        category: "momentum",
4959        input_kind: IndicatorInputKind::Slice,
4960        outputs: OUTPUTS_VALUE_F64,
4961        params: PARAM_RSI_PERIOD,
4962    },
4963    SupplementalIndicatorSeed {
4964        id: "roc",
4965        label: "ROC",
4966        category: "momentum",
4967        input_kind: IndicatorInputKind::Slice,
4968        outputs: OUTPUTS_VALUE_F64,
4969        params: PARAM_ROC_PERIOD,
4970    },
4971    SupplementalIndicatorSeed {
4972        id: "apo",
4973        label: "APO",
4974        category: "momentum",
4975        input_kind: IndicatorInputKind::Slice,
4976        outputs: OUTPUTS_VALUE_F64,
4977        params: PARAM_APO,
4978    },
4979    SupplementalIndicatorSeed {
4980        id: "cci",
4981        label: "CCI",
4982        category: "momentum",
4983        input_kind: IndicatorInputKind::Slice,
4984        outputs: OUTPUTS_VALUE_F64,
4985        params: PARAM_CCI_PERIOD,
4986    },
4987    SupplementalIndicatorSeed {
4988        id: "cci_cycle",
4989        label: "CCI Cycle",
4990        category: "momentum",
4991        input_kind: IndicatorInputKind::Slice,
4992        outputs: OUTPUTS_VALUE_F64,
4993        params: PARAM_CCI_CYCLE,
4994    },
4995    SupplementalIndicatorSeed {
4996        id: "cfo",
4997        label: "CFO",
4998        category: "momentum",
4999        input_kind: IndicatorInputKind::Slice,
5000        outputs: OUTPUTS_VALUE_F64,
5001        params: PARAM_CFO,
5002    },
5003    SupplementalIndicatorSeed {
5004        id: "cg",
5005        label: "CG",
5006        category: "momentum",
5007        input_kind: IndicatorInputKind::Slice,
5008        outputs: OUTPUTS_VALUE_F64,
5009        params: PARAM_CG_PERIOD,
5010    },
5011    SupplementalIndicatorSeed {
5012        id: "er",
5013        label: "ER",
5014        category: "momentum",
5015        input_kind: IndicatorInputKind::Slice,
5016        outputs: OUTPUTS_VALUE_F64,
5017        params: PARAM_ER_PERIOD,
5018    },
5019    SupplementalIndicatorSeed {
5020        id: "kurtosis",
5021        label: "Kurtosis",
5022        category: "statistics",
5023        input_kind: IndicatorInputKind::Slice,
5024        outputs: OUTPUTS_VALUE_F64,
5025        params: PARAM_KURTOSIS_PERIOD,
5026    },
5027    SupplementalIndicatorSeed {
5028        id: "natr",
5029        label: "NATR",
5030        category: "volatility",
5031        input_kind: IndicatorInputKind::Ohlc,
5032        outputs: OUTPUTS_VALUE_F64,
5033        params: PARAM_NATR_PERIOD,
5034    },
5035    SupplementalIndicatorSeed {
5036        id: "mean_ad",
5037        label: "Mean AD",
5038        category: "statistics",
5039        input_kind: IndicatorInputKind::Slice,
5040        outputs: OUTPUTS_VALUE_F64,
5041        params: PARAM_MEAN_AD_PERIOD,
5042    },
5043    SupplementalIndicatorSeed {
5044        id: "medium_ad",
5045        label: "Medium AD",
5046        category: "statistics",
5047        input_kind: IndicatorInputKind::Slice,
5048        outputs: OUTPUTS_VALUE_F64,
5049        params: PARAM_MEDIUM_AD_PERIOD,
5050    },
5051    SupplementalIndicatorSeed {
5052        id: "deviation",
5053        label: "Deviation",
5054        category: "statistics",
5055        input_kind: IndicatorInputKind::Slice,
5056        outputs: OUTPUTS_VALUE_F64,
5057        params: PARAM_DEVIATION,
5058    },
5059    SupplementalIndicatorSeed {
5060        id: "dpo",
5061        label: "DPO",
5062        category: "trend",
5063        input_kind: IndicatorInputKind::Slice,
5064        outputs: OUTPUTS_VALUE_F64,
5065        params: PARAM_DPO_PERIOD,
5066    },
5067    SupplementalIndicatorSeed {
5068        id: "fosc",
5069        label: "FOSC",
5070        category: "momentum",
5071        input_kind: IndicatorInputKind::Slice,
5072        outputs: OUTPUTS_VALUE_F64,
5073        params: PARAM_FOSC_PERIOD,
5074    },
5075    SupplementalIndicatorSeed {
5076        id: "ift_rsi",
5077        label: "IFT RSI",
5078        category: "momentum",
5079        input_kind: IndicatorInputKind::Slice,
5080        outputs: OUTPUTS_VALUE_F64,
5081        params: PARAM_IFT_RSI,
5082    },
5083    SupplementalIndicatorSeed {
5084        id: "linearreg_angle",
5085        label: "Linear Regression Angle",
5086        category: "trend",
5087        input_kind: IndicatorInputKind::Slice,
5088        outputs: OUTPUTS_VALUE_F64,
5089        params: PARAM_LINEARREG_ANGLE_PERIOD,
5090    },
5091    SupplementalIndicatorSeed {
5092        id: "linearreg_intercept",
5093        label: "Linear Regression Intercept",
5094        category: "trend",
5095        input_kind: IndicatorInputKind::Slice,
5096        outputs: OUTPUTS_VALUE_F64,
5097        params: PARAM_LINEARREG_INTERCEPT_PERIOD,
5098    },
5099    SupplementalIndicatorSeed {
5100        id: "linearreg_slope",
5101        label: "Linear Regression Slope",
5102        category: "trend",
5103        input_kind: IndicatorInputKind::Slice,
5104        outputs: OUTPUTS_VALUE_F64,
5105        params: PARAM_LINEARREG_SLOPE_PERIOD,
5106    },
5107    SupplementalIndicatorSeed {
5108        id: "pfe",
5109        label: "PFE",
5110        category: "trend",
5111        input_kind: IndicatorInputKind::Slice,
5112        outputs: OUTPUTS_VALUE_F64,
5113        params: PARAM_PFE,
5114    },
5115    SupplementalIndicatorSeed {
5116        id: "qstick",
5117        label: "QStick",
5118        category: "trend",
5119        input_kind: IndicatorInputKind::Ohlc,
5120        outputs: OUTPUTS_VALUE_F64,
5121        params: PARAM_QSTICK,
5122    },
5123    SupplementalIndicatorSeed {
5124        id: "reverse_rsi",
5125        label: "Reverse RSI",
5126        category: "momentum",
5127        input_kind: IndicatorInputKind::Slice,
5128        outputs: OUTPUTS_VALUE_F64,
5129        params: PARAM_REVERSE_RSI,
5130    },
5131    SupplementalIndicatorSeed {
5132        id: "percentile_nearest_rank",
5133        label: "Percentile Nearest Rank",
5134        category: "statistics",
5135        input_kind: IndicatorInputKind::Slice,
5136        outputs: OUTPUTS_VALUE_F64,
5137        params: PARAM_PERCENTILE_NEAREST_RANK,
5138    },
5139    SupplementalIndicatorSeed {
5140        id: "ui",
5141        label: "UI",
5142        category: "volatility",
5143        input_kind: IndicatorInputKind::Slice,
5144        outputs: OUTPUTS_VALUE_F64,
5145        params: PARAM_UI,
5146    },
5147    SupplementalIndicatorSeed {
5148        id: "zscore",
5149        label: "Zscore",
5150        category: "statistics",
5151        input_kind: IndicatorInputKind::Slice,
5152        outputs: OUTPUTS_VALUE_F64,
5153        params: PARAM_ZSCORE,
5154    },
5155    SupplementalIndicatorSeed {
5156        id: "medprice",
5157        label: "Medprice",
5158        category: "price",
5159        input_kind: IndicatorInputKind::HighLow,
5160        outputs: OUTPUTS_VALUE_F64,
5161        params: PARAM_NONE,
5162    },
5163    SupplementalIndicatorSeed {
5164        id: "midpoint",
5165        label: "Midpoint",
5166        category: "price",
5167        input_kind: IndicatorInputKind::Slice,
5168        outputs: OUTPUTS_VALUE_F64,
5169        params: PARAM_MIDPOINT_PERIOD,
5170    },
5171    SupplementalIndicatorSeed {
5172        id: "midprice",
5173        label: "Midprice",
5174        category: "price",
5175        input_kind: IndicatorInputKind::HighLow,
5176        outputs: OUTPUTS_VALUE_F64,
5177        params: PARAM_MIDPRICE_PERIOD,
5178    },
5179    SupplementalIndicatorSeed {
5180        id: "wclprice",
5181        label: "WCLPRICE",
5182        category: "price",
5183        input_kind: IndicatorInputKind::Ohlc,
5184        outputs: OUTPUTS_VALUE_F64,
5185        params: PARAM_NONE,
5186    },
5187    SupplementalIndicatorSeed {
5188        id: "obv",
5189        label: "OBV",
5190        category: "volume",
5191        input_kind: IndicatorInputKind::CloseVolume,
5192        outputs: OUTPUTS_VALUE_F64,
5193        params: PARAM_NONE,
5194    },
5195    SupplementalIndicatorSeed {
5196        id: "vpt",
5197        label: "VPT",
5198        category: "volume",
5199        input_kind: IndicatorInputKind::CloseVolume,
5200        outputs: OUTPUTS_VALUE_F64,
5201        params: PARAM_NONE,
5202    },
5203    SupplementalIndicatorSeed {
5204        id: "nvi",
5205        label: "NVI",
5206        category: "volume",
5207        input_kind: IndicatorInputKind::CloseVolume,
5208        outputs: OUTPUTS_VALUE_F64,
5209        params: PARAM_NONE,
5210    },
5211    SupplementalIndicatorSeed {
5212        id: "pvi",
5213        label: "PVI",
5214        category: "volume",
5215        input_kind: IndicatorInputKind::CloseVolume,
5216        outputs: OUTPUTS_VALUE_F64,
5217        params: PARAM_PVI,
5218    },
5219    SupplementalIndicatorSeed {
5220        id: "mom",
5221        label: "MOM",
5222        category: "momentum",
5223        input_kind: IndicatorInputKind::Slice,
5224        outputs: OUTPUTS_VALUE_F64,
5225        params: PARAM_MOM_PERIOD,
5226    },
5227    SupplementalIndicatorSeed {
5228        id: "cmo",
5229        label: "CMO",
5230        category: "momentum",
5231        input_kind: IndicatorInputKind::Slice,
5232        outputs: OUTPUTS_VALUE_F64,
5233        params: PARAM_CMO_PERIOD,
5234    },
5235    SupplementalIndicatorSeed {
5236        id: "dec_osc",
5237        label: "Dec Osc",
5238        category: "momentum",
5239        input_kind: IndicatorInputKind::Slice,
5240        outputs: OUTPUTS_VALUE_F64,
5241        params: PARAM_DEC_OSC,
5242    },
5243    SupplementalIndicatorSeed {
5244        id: "lrsi",
5245        label: "LRSI",
5246        category: "momentum",
5247        input_kind: IndicatorInputKind::HighLow,
5248        outputs: OUTPUTS_VALUE_F64,
5249        params: PARAM_LRSI_ALPHA,
5250    },
5251    SupplementalIndicatorSeed {
5252        id: "rocp",
5253        label: "ROCP",
5254        category: "momentum",
5255        input_kind: IndicatorInputKind::Slice,
5256        outputs: OUTPUTS_VALUE_F64,
5257        params: PARAM_ROCP_PERIOD,
5258    },
5259    SupplementalIndicatorSeed {
5260        id: "rocr",
5261        label: "ROCR",
5262        category: "momentum",
5263        input_kind: IndicatorInputKind::Slice,
5264        outputs: OUTPUTS_VALUE_F64,
5265        params: PARAM_ROCR_PERIOD,
5266    },
5267    SupplementalIndicatorSeed {
5268        id: "tsf",
5269        label: "TSF",
5270        category: "trend",
5271        input_kind: IndicatorInputKind::Slice,
5272        outputs: OUTPUTS_VALUE_F64,
5273        params: PARAM_TSF_PERIOD,
5274    },
5275    SupplementalIndicatorSeed {
5276        id: "ppo",
5277        label: "PPO",
5278        category: "momentum",
5279        input_kind: IndicatorInputKind::Slice,
5280        outputs: OUTPUTS_VALUE_F64,
5281        params: PARAM_PPO,
5282    },
5283    SupplementalIndicatorSeed {
5284        id: "trix",
5285        label: "TRIX",
5286        category: "momentum",
5287        input_kind: IndicatorInputKind::Slice,
5288        outputs: OUTPUTS_VALUE_F64,
5289        params: PARAM_TRIX_PERIOD,
5290    },
5291    SupplementalIndicatorSeed {
5292        id: "tsi",
5293        label: "TSI",
5294        category: "momentum",
5295        input_kind: IndicatorInputKind::Slice,
5296        outputs: OUTPUTS_VALUE_F64,
5297        params: PARAM_TSI,
5298    },
5299    SupplementalIndicatorSeed {
5300        id: "stddev",
5301        label: "StdDev",
5302        category: "volatility",
5303        input_kind: IndicatorInputKind::Slice,
5304        outputs: OUTPUTS_VALUE_F64,
5305        params: PARAM_STDDEV,
5306    },
5307    SupplementalIndicatorSeed {
5308        id: "var",
5309        label: "VAR",
5310        category: "volatility",
5311        input_kind: IndicatorInputKind::Slice,
5312        outputs: OUTPUTS_VALUE_F64,
5313        params: PARAM_VAR,
5314    },
5315    SupplementalIndicatorSeed {
5316        id: "willr",
5317        label: "WILLR",
5318        category: "momentum",
5319        input_kind: IndicatorInputKind::Ohlc,
5320        outputs: OUTPUTS_VALUE_F64,
5321        params: PARAM_WILLR_PERIOD,
5322    },
5323    SupplementalIndicatorSeed {
5324        id: "ultosc",
5325        label: "ULTOSC",
5326        category: "momentum",
5327        input_kind: IndicatorInputKind::Ohlc,
5328        outputs: OUTPUTS_VALUE_F64,
5329        params: PARAM_ULTOSC,
5330    },
5331    SupplementalIndicatorSeed {
5332        id: "macd",
5333        label: "MACD",
5334        category: "momentum",
5335        input_kind: IndicatorInputKind::Slice,
5336        outputs: OUTPUTS_MACD,
5337        params: PARAM_MACD,
5338    },
5339    SupplementalIndicatorSeed {
5340        id: "bollinger_bands",
5341        label: "Bollinger Bands",
5342        category: "volatility",
5343        input_kind: IndicatorInputKind::Slice,
5344        outputs: OUTPUTS_BOLLINGER,
5345        params: PARAM_BOLLINGER,
5346    },
5347    SupplementalIndicatorSeed {
5348        id: "bollinger_bands_width",
5349        label: "Bollinger Bands Width",
5350        category: "volatility",
5351        input_kind: IndicatorInputKind::Slice,
5352        outputs: OUTPUTS_VALUE_F64,
5353        params: PARAM_BOLLINGER,
5354    },
5355    SupplementalIndicatorSeed {
5356        id: "stoch",
5357        label: "Stochastic",
5358        category: "momentum",
5359        input_kind: IndicatorInputKind::Ohlc,
5360        outputs: OUTPUTS_STOCH,
5361        params: PARAM_STOCH,
5362    },
5363    SupplementalIndicatorSeed {
5364        id: "stochf",
5365        label: "Fast Stochastic",
5366        category: "momentum",
5367        input_kind: IndicatorInputKind::Ohlc,
5368        outputs: OUTPUTS_STOCH,
5369        params: PARAM_STOCHF,
5370    },
5371    SupplementalIndicatorSeed {
5372        id: "vwmacd",
5373        label: "VWMACD",
5374        category: "volume",
5375        input_kind: IndicatorInputKind::CloseVolume,
5376        outputs: OUTPUTS_MACD,
5377        params: PARAM_VW_MACD,
5378    },
5379    SupplementalIndicatorSeed {
5380        id: "vpci",
5381        label: "VPCI",
5382        category: "volume",
5383        input_kind: IndicatorInputKind::CloseVolume,
5384        outputs: OUTPUTS_VPCI,
5385        params: PARAM_VPCI,
5386    },
5387    SupplementalIndicatorSeed {
5388        id: "ttm_trend",
5389        label: "TTM Trend",
5390        category: "trend",
5391        input_kind: IndicatorInputKind::Ohlc,
5392        outputs: OUTPUTS_VALUE_BOOL,
5393        params: PARAM_TTM_TREND,
5394    },
5395    SupplementalIndicatorSeed {
5396        id: "ttm_squeeze",
5397        label: "TTM Squeeze",
5398        category: "momentum",
5399        input_kind: IndicatorInputKind::Ohlc,
5400        outputs: OUTPUTS_TTM_SQUEEZE,
5401        params: PARAM_TTM_SQUEEZE,
5402    },
5403    SupplementalIndicatorSeed {
5404        id: "acosc",
5405        label: "Acosc",
5406        category: "momentum",
5407        input_kind: IndicatorInputKind::HighLow,
5408        outputs: OUTPUTS_ACOSC,
5409        params: PARAM_ACOSC,
5410    },
5411    SupplementalIndicatorSeed {
5412        id: "alligator",
5413        label: "Alligator",
5414        category: "trend",
5415        input_kind: IndicatorInputKind::Slice,
5416        outputs: OUTPUTS_ALLIGATOR,
5417        params: PARAM_ALLIGATOR,
5418    },
5419    SupplementalIndicatorSeed {
5420        id: "alphatrend",
5421        label: "AlphaTrend",
5422        category: "trend",
5423        input_kind: IndicatorInputKind::Ohlcv,
5424        outputs: OUTPUTS_K1_K2,
5425        params: PARAM_ALPHATREND,
5426    },
5427    SupplementalIndicatorSeed {
5428        id: "aso",
5429        label: "ASO",
5430        category: "momentum",
5431        input_kind: IndicatorInputKind::Ohlc,
5432        outputs: OUTPUTS_BULLS_BEARS,
5433        params: PARAM_ASO,
5434    },
5435    SupplementalIndicatorSeed {
5436        id: "avsl",
5437        label: "AVSL",
5438        category: "trend",
5439        input_kind: IndicatorInputKind::Ohlcv,
5440        outputs: OUTPUTS_VALUE_F64,
5441        params: PARAM_AVSL,
5442    },
5443    SupplementalIndicatorSeed {
5444        id: "bandpass",
5445        label: "BandPass",
5446        category: "cycle",
5447        input_kind: IndicatorInputKind::Slice,
5448        outputs: OUTPUTS_BANDPASS,
5449        params: PARAM_BANDPASS,
5450    },
5451    SupplementalIndicatorSeed {
5452        id: "chande",
5453        label: "Chande",
5454        category: "trend",
5455        input_kind: IndicatorInputKind::Ohlc,
5456        outputs: OUTPUTS_VALUE_F64,
5457        params: PARAM_CHANDE,
5458    },
5459    SupplementalIndicatorSeed {
5460        id: "chandelier_exit",
5461        label: "Chandelier Exit",
5462        category: "trend",
5463        input_kind: IndicatorInputKind::Ohlc,
5464        outputs: OUTPUTS_LONG_SHORT_STOP,
5465        params: PARAM_CHANDELIER_EXIT,
5466    },
5467    SupplementalIndicatorSeed {
5468        id: "cksp",
5469        label: "CKSP",
5470        category: "trend",
5471        input_kind: IndicatorInputKind::Ohlc,
5472        outputs: OUTPUTS_LONG_SHORT_VALUES,
5473        params: PARAM_CKSP,
5474    },
5475    SupplementalIndicatorSeed {
5476        id: "correlation_cycle",
5477        label: "Correlation Cycle",
5478        category: "cycle",
5479        input_kind: IndicatorInputKind::Slice,
5480        outputs: OUTPUTS_CORRELATION_CYCLE,
5481        params: PARAM_CORRELATION_CYCLE,
5482    },
5483    SupplementalIndicatorSeed {
5484        id: "correl_hl",
5485        label: "Correl HL",
5486        category: "statistics",
5487        input_kind: IndicatorInputKind::HighLow,
5488        outputs: OUTPUTS_VALUE_F64,
5489        params: PARAM_CORREL_HL,
5490    },
5491    SupplementalIndicatorSeed {
5492        id: "decycler",
5493        label: "Decycler",
5494        category: "trend",
5495        input_kind: IndicatorInputKind::Slice,
5496        outputs: OUTPUTS_VALUE_F64,
5497        params: PARAM_DECYCLER,
5498    },
5499    SupplementalIndicatorSeed {
5500        id: "damiani_volatmeter",
5501        label: "Damiani Volatmeter",
5502        category: "volatility",
5503        input_kind: IndicatorInputKind::Slice,
5504        outputs: OUTPUTS_VOL_ANTI,
5505        params: PARAM_DAMIANI_VOLATMETER,
5506    },
5507    SupplementalIndicatorSeed {
5508        id: "dvdiqqe",
5509        label: "DVDIQQE",
5510        category: "volume",
5511        input_kind: IndicatorInputKind::Ohlc,
5512        outputs: OUTPUTS_DVDIQQE,
5513        params: PARAM_DVDIQQE,
5514    },
5515    SupplementalIndicatorSeed {
5516        id: "emd",
5517        label: "EMD",
5518        category: "volatility",
5519        input_kind: IndicatorInputKind::Ohlcv,
5520        outputs: OUTPUTS_UPPER_MIDDLE_LOWER_BAND,
5521        params: PARAM_EMD,
5522    },
5523    SupplementalIndicatorSeed {
5524        id: "eri",
5525        label: "ERI",
5526        category: "trend",
5527        input_kind: IndicatorInputKind::Ohlc,
5528        outputs: OUTPUTS_BULL_BEAR,
5529        params: PARAM_ERI,
5530    },
5531    SupplementalIndicatorSeed {
5532        id: "fisher",
5533        label: "Fisher",
5534        category: "momentum",
5535        input_kind: IndicatorInputKind::HighLow,
5536        outputs: OUTPUTS_FISHER,
5537        params: PARAM_FISHER,
5538    },
5539    SupplementalIndicatorSeed {
5540        id: "fvg_trailing_stop",
5541        label: "FVG Trailing Stop",
5542        category: "trend",
5543        input_kind: IndicatorInputKind::Ohlc,
5544        outputs: OUTPUTS_FVG_TS,
5545        params: PARAM_FVG_TRAILING_STOP,
5546    },
5547    SupplementalIndicatorSeed {
5548        id: "gatorosc",
5549        label: "Gator Oscillator",
5550        category: "trend",
5551        input_kind: IndicatorInputKind::Slice,
5552        outputs: OUTPUTS_GATOROSC,
5553        params: PARAM_GATOROSC,
5554    },
5555    SupplementalIndicatorSeed {
5556        id: "halftrend",
5557        label: "HalfTrend",
5558        category: "trend",
5559        input_kind: IndicatorInputKind::Ohlc,
5560        outputs: OUTPUTS_HALFTREND,
5561        params: PARAM_HALFTREND,
5562    },
5563    SupplementalIndicatorSeed {
5564        id: "kst",
5565        label: "KST",
5566        category: "momentum",
5567        input_kind: IndicatorInputKind::Slice,
5568        outputs: OUTPUTS_LINE_SIGNAL,
5569        params: PARAM_KST,
5570    },
5571    SupplementalIndicatorSeed {
5572        id: "kaufmanstop",
5573        label: "Kaufmanstop",
5574        category: "trend",
5575        input_kind: IndicatorInputKind::HighLow,
5576        outputs: OUTPUTS_VALUE_F64,
5577        params: PARAM_KAUFMANSTOP,
5578    },
5579    SupplementalIndicatorSeed {
5580        id: "lpc",
5581        label: "LPC",
5582        category: "cycle",
5583        input_kind: IndicatorInputKind::Ohlc,
5584        outputs: OUTPUTS_FILTER_BANDS,
5585        params: PARAM_LPC,
5586    },
5587    SupplementalIndicatorSeed {
5588        id: "mab",
5589        label: "MAB",
5590        category: "volatility",
5591        input_kind: IndicatorInputKind::Slice,
5592        outputs: OUTPUTS_UPPER_MIDDLE_LOWER_BAND,
5593        params: PARAM_MAB,
5594    },
5595    SupplementalIndicatorSeed {
5596        id: "macz",
5597        label: "MACZ",
5598        category: "momentum",
5599        input_kind: IndicatorInputKind::Slice,
5600        outputs: OUTPUTS_VALUE_F64,
5601        params: PARAM_MACZ,
5602    },
5603    SupplementalIndicatorSeed {
5604        id: "minmax",
5605        label: "MinMax",
5606        category: "pattern",
5607        input_kind: IndicatorInputKind::HighLow,
5608        outputs: OUTPUTS_MINMAX,
5609        params: PARAM_MINMAX,
5610    },
5611    SupplementalIndicatorSeed {
5612        id: "mod_god_mode",
5613        label: "Mod God Mode",
5614        category: "momentum",
5615        input_kind: IndicatorInputKind::Ohlc,
5616        outputs: OUTPUTS_MOD_GOD_MODE,
5617        params: PARAM_MOD_GOD_MODE,
5618    },
5619    SupplementalIndicatorSeed {
5620        id: "pattern_recognition",
5621        label: "Pattern Recognition",
5622        category: "pattern",
5623        input_kind: IndicatorInputKind::Ohlc,
5624        outputs: OUTPUTS_MATRIX_BOOL,
5625        params: PARAM_NONE,
5626    },
5627    SupplementalIndicatorSeed {
5628        id: "msw",
5629        label: "MSW",
5630        category: "cycle",
5631        input_kind: IndicatorInputKind::Slice,
5632        outputs: OUTPUTS_SINE_LEAD,
5633        params: PARAM_MSW,
5634    },
5635    SupplementalIndicatorSeed {
5636        id: "nadaraya_watson_envelope",
5637        label: "Nadaraya Watson Envelope",
5638        category: "volatility",
5639        input_kind: IndicatorInputKind::Slice,
5640        outputs: OUTPUTS_UPPER_LOWER,
5641        params: PARAM_NWE,
5642    },
5643    SupplementalIndicatorSeed {
5644        id: "ott",
5645        label: "OTT",
5646        category: "trend",
5647        input_kind: IndicatorInputKind::Slice,
5648        outputs: OUTPUTS_VALUE_F64,
5649        params: PARAM_OTT,
5650    },
5651    SupplementalIndicatorSeed {
5652        id: "otto",
5653        label: "OTTO",
5654        category: "trend",
5655        input_kind: IndicatorInputKind::Slice,
5656        outputs: OUTPUTS_HOTT_LOTT,
5657        params: PARAM_OTTO,
5658    },
5659    SupplementalIndicatorSeed {
5660        id: "vidya",
5661        label: "VIDYA",
5662        category: "trend",
5663        input_kind: IndicatorInputKind::Slice,
5664        outputs: OUTPUTS_VALUE_F64,
5665        params: PARAM_VIDYA,
5666    },
5667    SupplementalIndicatorSeed {
5668        id: "vlma",
5669        label: "VLMA",
5670        category: "trend",
5671        input_kind: IndicatorInputKind::Slice,
5672        outputs: OUTPUTS_VALUE_F64,
5673        params: PARAM_VLMA,
5674    },
5675    SupplementalIndicatorSeed {
5676        id: "pma",
5677        label: "PMA",
5678        category: "trend",
5679        input_kind: IndicatorInputKind::Slice,
5680        outputs: OUTPUTS_EHLERS_PMA,
5681        params: PARAM_PMA,
5682    },
5683    SupplementalIndicatorSeed {
5684        id: "prb",
5685        label: "PRB",
5686        category: "statistics",
5687        input_kind: IndicatorInputKind::Slice,
5688        outputs: OUTPUTS_PRB,
5689        params: PARAM_PRB,
5690    },
5691    SupplementalIndicatorSeed {
5692        id: "qqe",
5693        label: "QQE",
5694        category: "momentum",
5695        input_kind: IndicatorInputKind::Slice,
5696        outputs: &[OUTPUT_FAST, OUTPUT_SLOW],
5697        params: PARAM_QQE,
5698    },
5699    SupplementalIndicatorSeed {
5700        id: "range_filter",
5701        label: "Range Filter",
5702        category: "volatility",
5703        input_kind: IndicatorInputKind::Slice,
5704        outputs: OUTPUTS_FILTER_BANDS,
5705        params: PARAM_RANGE_FILTER,
5706    },
5707    SupplementalIndicatorSeed {
5708        id: "coppock",
5709        label: "Coppock",
5710        category: "momentum",
5711        input_kind: IndicatorInputKind::Slice,
5712        outputs: OUTPUTS_VALUE_F64,
5713        params: PARAM_COPPOCK,
5714    },
5715    SupplementalIndicatorSeed {
5716        id: "rsmk",
5717        label: "RSMK",
5718        category: "relative_strength",
5719        input_kind: IndicatorInputKind::CloseVolume,
5720        outputs: OUTPUTS_INDICATOR_SIGNAL,
5721        params: PARAM_RSMK,
5722    },
5723    SupplementalIndicatorSeed {
5724        id: "voss",
5725        label: "Voss",
5726        category: "cycle",
5727        input_kind: IndicatorInputKind::Slice,
5728        outputs: OUTPUTS_VOSS,
5729        params: PARAM_VOSS,
5730    },
5731    SupplementalIndicatorSeed {
5732        id: "stc",
5733        label: "STC",
5734        category: "momentum",
5735        input_kind: IndicatorInputKind::Slice,
5736        outputs: OUTPUTS_VALUE_F64,
5737        params: PARAM_STC,
5738    },
5739    SupplementalIndicatorSeed {
5740        id: "rvi",
5741        label: "RVI",
5742        category: "volatility",
5743        input_kind: IndicatorInputKind::Slice,
5744        outputs: OUTPUTS_VALUE_F64,
5745        params: PARAM_RVI,
5746    },
5747    SupplementalIndicatorSeed {
5748        id: "safezonestop",
5749        label: "SafeZoneStop",
5750        category: "trend",
5751        input_kind: IndicatorInputKind::HighLow,
5752        outputs: OUTPUTS_VALUE_F64,
5753        params: PARAM_SAFEZONESTOP,
5754    },
5755    SupplementalIndicatorSeed {
5756        id: "chop",
5757        label: "CHOP",
5758        category: "trend",
5759        input_kind: IndicatorInputKind::Ohlc,
5760        outputs: OUTPUTS_VALUE_F64,
5761        params: PARAM_CHOP,
5762    },
5763    SupplementalIndicatorSeed {
5764        id: "devstop",
5765        label: "DevStop",
5766        category: "trend",
5767        input_kind: IndicatorInputKind::HighLow,
5768        outputs: OUTPUTS_VALUE_F64,
5769        params: PARAM_DEVSTOP,
5770    },
5771    SupplementalIndicatorSeed {
5772        id: "net_myrsi",
5773        label: "NET_MyRSI",
5774        category: "momentum",
5775        input_kind: IndicatorInputKind::Slice,
5776        outputs: OUTPUTS_VALUE_F64,
5777        params: PARAMS_PERIOD_ONLY,
5778    },
5779    SupplementalIndicatorSeed {
5780        id: "wad",
5781        label: "WAD",
5782        category: "volume",
5783        input_kind: IndicatorInputKind::Ohlc,
5784        outputs: OUTPUTS_VALUE_F64,
5785        params: PARAM_NONE,
5786    },
5787    SupplementalIndicatorSeed {
5788        id: "pivot",
5789        label: "Pivot",
5790        category: "price",
5791        input_kind: IndicatorInputKind::Ohlc,
5792        outputs: OUTPUTS_PIVOT,
5793        params: PARAM_PIVOT,
5794    },
5795];
5796
5797fn supplemental_supports_cpu_batch(id: &str) -> bool {
5798    matches!(
5799        id,
5800        "adx"
5801            | "adxr"
5802            | "atr"
5803            | "ad"
5804            | "adosc"
5805            | "ao"
5806            | "dti"
5807            | "dx"
5808            | "di"
5809            | "dm"
5810            | "vi"
5811            | "donchian"
5812            | "supertrend"
5813            | "keltner"
5814            | "aroon"
5815            | "srsi"
5816            | "kdj"
5817            | "squeeze_momentum"
5818            | "wavetrend"
5819            | "wto"
5820            | "yang_zhang_volatility"
5821            | "bop"
5822            | "emv"
5823            | "efi"
5824            | "mfi"
5825            | "mass"
5826            | "kvo"
5827            | "wad"
5828            | "vosc"
5829            | "rvi"
5830            | "coppock"
5831            | "rsi"
5832            | "roc"
5833            | "apo"
5834            | "cci"
5835            | "cci_cycle"
5836            | "cfo"
5837            | "cg"
5838            | "er"
5839            | "kurtosis"
5840            | "natr"
5841            | "net_myrsi"
5842            | "mean_ad"
5843            | "medium_ad"
5844            | "deviation"
5845            | "mod_god_mode"
5846            | "dpo"
5847            | "lrsi"
5848            | "fosc"
5849            | "ift_rsi"
5850            | "linearreg_angle"
5851            | "linearreg_intercept"
5852            | "linearreg_slope"
5853            | "pfe"
5854            | "percentile_nearest_rank"
5855            | "ui"
5856            | "zscore"
5857            | "medprice"
5858            | "midpoint"
5859            | "midprice"
5860            | "wclprice"
5861            | "obv"
5862            | "vpt"
5863            | "nvi"
5864            | "pvi"
5865            | "mom"
5866            | "cmo"
5867            | "rocp"
5868            | "rocr"
5869            | "tsf"
5870            | "ppo"
5871            | "trix"
5872            | "tsi"
5873            | "stddev"
5874            | "var"
5875            | "willr"
5876            | "ultosc"
5877            | "macd"
5878            | "bollinger_bands"
5879            | "bollinger_bands_width"
5880            | "stoch"
5881            | "stochf"
5882            | "vwmacd"
5883            | "stc"
5884            | "vpci"
5885            | "ttm_trend"
5886            | "ttm_squeeze"
5887            | "acosc"
5888            | "alligator"
5889            | "alphatrend"
5890            | "aso"
5891            | "bandpass"
5892            | "chande"
5893            | "chandelier_exit"
5894            | "cksp"
5895            | "coppock"
5896            | "correl_hl"
5897            | "correlation_cycle"
5898            | "chop"
5899            | "damiani_volatmeter"
5900            | "dvdiqqe"
5901            | "emd"
5902            | "eri"
5903            | "fisher"
5904            | "fvg_trailing_stop"
5905            | "gatorosc"
5906            | "halftrend"
5907            | "kst"
5908            | "lpc"
5909            | "mab"
5910            | "macz"
5911            | "minmax"
5912            | "msw"
5913            | "nadaraya_watson_envelope"
5914            | "otto"
5915            | "vidya"
5916            | "vlma"
5917            | "pma"
5918            | "prb"
5919            | "qqe"
5920            | "range_filter"
5921            | "rsmk"
5922            | "safezonestop"
5923            | "devstop"
5924            | "voss"
5925            | "pivot"
5926    )
5927}
5928
5929fn supplemental_supports_cuda_single(id: &str) -> bool {
5930    matches!(id, "pattern_recognition")
5931}
5932
5933fn supplemental_supports_cuda_batch(id: &str) -> bool {
5934    matches!(
5935        id,
5936        "acosc"
5937            | "adosc"
5938            | "adx"
5939            | "adxr"
5940            | "alligator"
5941            | "alphatrend"
5942            | "ao"
5943            | "apo"
5944            | "aroon"
5945            | "aroonosc"
5946            | "aso"
5947            | "atr"
5948            | "avsl"
5949            | "bandpass"
5950            | "bollinger_bands"
5951            | "bollinger_bands_width"
5952            | "bop"
5953            | "cci"
5954            | "cci_cycle"
5955            | "cfo"
5956            | "cg"
5957            | "chande"
5958            | "chandelier_exit"
5959            | "chop"
5960            | "cksp"
5961            | "cmo"
5962            | "coppock"
5963            | "correl_hl"
5964            | "correlation_cycle"
5965            | "cvi"
5966            | "damiani_volatmeter"
5967            | "dec_osc"
5968            | "decycler"
5969            | "deviation"
5970            | "devstop"
5971            | "di"
5972            | "dm"
5973            | "donchian"
5974            | "dpo"
5975            | "dti"
5976            | "dvdiqqe"
5977            | "dx"
5978            | "efi"
5979            | "emd"
5980            | "emv"
5981            | "er"
5982            | "eri"
5983            | "fisher"
5984            | "fosc"
5985            | "fvg_trailing_stop"
5986            | "gatorosc"
5987            | "halftrend"
5988            | "ift_rsi"
5989            | "kaufmanstop"
5990            | "kdj"
5991            | "keltner"
5992            | "kst"
5993            | "kurtosis"
5994            | "kvo"
5995            | "linearreg_angle"
5996            | "linearreg_intercept"
5997            | "linearreg_slope"
5998            | "lpc"
5999            | "lrsi"
6000            | "mab"
6001            | "macd"
6002            | "macz"
6003            | "marketefi"
6004            | "mass"
6005            | "mean_ad"
6006            | "medium_ad"
6007            | "medprice"
6008            | "mfi"
6009            | "minmax"
6010            | "mod_god_mode"
6011            | "mom"
6012            | "msw"
6013            | "nadaraya_watson_envelope"
6014            | "natr"
6015            | "net_myrsi"
6016            | "nvi"
6017            | "obv"
6018            | "ott"
6019            | "otto"
6020            | "percentile_nearest_rank"
6021            | "pfe"
6022            | "pivot"
6023            | "pma"
6024            | "ppo"
6025            | "prb"
6026            | "pvi"
6027            | "qqe"
6028            | "qstick"
6029            | "range_filter"
6030            | "reverse_rsi"
6031            | "roc"
6032            | "rocp"
6033            | "rocr"
6034            | "rsi"
6035            | "rsmk"
6036            | "rsx"
6037            | "rvi"
6038            | "safezonestop"
6039            | "sar"
6040            | "squeeze_momentum"
6041            | "srsi"
6042            | "stc"
6043            | "stddev"
6044            | "stoch"
6045            | "stochf"
6046            | "supertrend"
6047            | "trix"
6048            | "tsf"
6049            | "tsi"
6050            | "ttm_squeeze"
6051            | "ttm_trend"
6052            | "ui"
6053            | "ultosc"
6054            | "var"
6055            | "vi"
6056            | "vidya"
6057            | "vlma"
6058            | "vosc"
6059            | "voss"
6060            | "vpci"
6061            | "vpt"
6062            | "vwmacd"
6063            | "wad"
6064            | "wavetrend"
6065            | "wclprice"
6066            | "willr"
6067            | "wto"
6068            | "yang_zhang_volatility"
6069            | "zscore"
6070    )
6071}
6072
6073fn supplemental_supports_cuda_vram(id: &str) -> bool {
6074    matches!(id, "pattern_recognition") || supplemental_supports_cuda_batch(id)
6075}
6076
6077pub fn is_bucket_b_indicator(id: &str) -> bool {
6078    BUCKET_B_INDICATORS
6079        .iter()
6080        .any(|item| item.eq_ignore_ascii_case(id))
6081}
6082
6083static INDICATOR_REGISTRY: Lazy<Vec<IndicatorInfo>> = Lazy::new(build_registry);
6084static INDICATOR_EXACT_INDEX: Lazy<HashMap<&'static str, usize>> = Lazy::new(|| {
6085    let mut map = HashMap::with_capacity(INDICATOR_REGISTRY.len());
6086    for (idx, info) in INDICATOR_REGISTRY.iter().enumerate() {
6087        map.insert(info.id, idx);
6088    }
6089    map
6090});
6091
6092fn ma_outputs_for(ma_id: &str) -> Vec<IndicatorOutputInfo> {
6093    match ma_id {
6094        "mama" => OUTPUTS_MAMA.to_vec(),
6095        "ehlers_pma" => OUTPUTS_EHLERS_PMA.to_vec(),
6096        "buff_averages" => OUTPUTS_BUFF_AVERAGES.to_vec(),
6097        _ => OUTPUTS_VALUE_F64.to_vec(),
6098    }
6099}
6100
6101fn ma_params_for(ma_id: &str, period_based: bool) -> Vec<IndicatorParamInfo> {
6102    let mut params = Vec::new();
6103    if period_based {
6104        params.push(PARAM_PERIOD);
6105    }
6106    for item in ma_param_schema(ma_id).iter() {
6107        let kind = match item.kind {
6108            MaParamKind::Float => IndicatorParamKind::Float,
6109            MaParamKind::Int => IndicatorParamKind::Int,
6110        };
6111        let default = match kind {
6112            IndicatorParamKind::Float => Some(ParamValueStatic::Float(item.default)),
6113            IndicatorParamKind::Int => Some(ParamValueStatic::Int(item.default as i64)),
6114            IndicatorParamKind::Bool | IndicatorParamKind::EnumString => None,
6115        };
6116        params.push(IndicatorParamInfo {
6117            key: item.key,
6118            label: item.label,
6119            kind,
6120            required: false,
6121            default,
6122            min: item.min,
6123            max: item.max,
6124            step: item.step,
6125            enum_values: EMPTY_ENUM_VALUES,
6126            notes: item.notes,
6127        });
6128    }
6129    match ma_id {
6130        "mama" => params.push(PARAM_OUTPUT_MAMA),
6131        "ehlers_pma" => params.push(PARAM_OUTPUT_EHLERS_PMA),
6132        "buff_averages" => params.push(PARAM_OUTPUT_BUFF_AVERAGES),
6133        "vwap" => params.push(PARAM_ANCHOR),
6134        "volume_adjusted_ma" => params.push(PARAM_STRICT),
6135        _ => {}
6136    }
6137    params
6138}
6139
6140fn build_registry() -> Vec<IndicatorInfo> {
6141    let mut out = Vec::new();
6142
6143    for ma in list_moving_averages().iter() {
6144        out.push(IndicatorInfo {
6145            id: ma.id,
6146            label: ma.label,
6147            category: "moving_averages",
6148            dynamic_strategy_eligible: true,
6149            input_kind: if ma.requires_candles {
6150                IndicatorInputKind::Candles
6151            } else {
6152                IndicatorInputKind::Slice
6153            },
6154            outputs: ma_outputs_for(ma.id),
6155            params: ma_params_for(ma.id, ma.period_based),
6156            capabilities: IndicatorCapabilities {
6157                supports_cpu_single: ma.supports_cpu_single,
6158                supports_cpu_batch: ma.supports_cpu_batch,
6159                supports_cuda_single: ma.supports_cuda_single,
6160                supports_cuda_batch: ma.supports_cuda_sweep,
6161                supports_cuda_vram: ma.supports_cuda_sweep,
6162            },
6163            notes: ma.notes,
6164        });
6165    }
6166
6167    for seed in SUPPLEMENTAL_INDICATORS.iter() {
6168        let info = IndicatorInfo {
6169            id: seed.id,
6170            label: seed.label,
6171            category: seed.category,
6172            dynamic_strategy_eligible: true,
6173            input_kind: seed.input_kind,
6174            outputs: seed.outputs.to_vec(),
6175            params: seed.params.to_vec(),
6176            capabilities: IndicatorCapabilities {
6177                supports_cpu_single: true,
6178                supports_cpu_batch: supplemental_supports_cpu_batch(seed.id),
6179                supports_cuda_single: supplemental_supports_cuda_single(seed.id),
6180                supports_cuda_batch: supplemental_supports_cuda_batch(seed.id),
6181                supports_cuda_vram: supplemental_supports_cuda_vram(seed.id),
6182            },
6183            notes: Some(SUPPLEMENTAL_SEED_NOTE),
6184        };
6185
6186        if let Some(existing) = out
6187            .iter_mut()
6188            .find(|item| item.id.eq_ignore_ascii_case(seed.id))
6189        {
6190            *existing = info;
6191        } else {
6192            out.push(info);
6193        }
6194    }
6195
6196    out.sort_by(|a, b| a.id.cmp(b.id));
6197    out
6198}
6199
6200pub fn list_indicators() -> &'static [IndicatorInfo] {
6201    INDICATOR_REGISTRY.as_slice()
6202}
6203
6204pub fn get_indicator(id: &str) -> Option<&'static IndicatorInfo> {
6205    let indicators = list_indicators();
6206    if let Some(idx) = INDICATOR_EXACT_INDEX.get(id).copied() {
6207        return Some(&indicators[idx]);
6208    }
6209    if let Ok(idx) = indicators.binary_search_by(|info| info.id.cmp(id)) {
6210        return Some(&indicators[idx]);
6211    }
6212    indicators
6213        .iter()
6214        .find(|info| info.id.eq_ignore_ascii_case(id))
6215}
6216
6217pub fn indicator_param_schema(id: &str) -> Option<&'static [IndicatorParamInfo]> {
6218    get_indicator(id).map(|info| info.params.as_slice())
6219}
6220
6221pub fn indicator_output_schema(id: &str) -> Option<&'static [IndicatorOutputInfo]> {
6222    get_indicator(id).map(|info| info.outputs.as_slice())
6223}
6224
6225pub fn indicator_capabilities(id: &str) -> Option<IndicatorCapabilities> {
6226    get_indicator(id).map(|info| info.capabilities)
6227}
6228
6229#[cfg(test)]
6230mod tests {
6231    use super::*;
6232
6233    #[test]
6234    fn registry_is_non_empty() {
6235        assert!(!list_indicators().is_empty());
6236    }
6237
6238    #[test]
6239    fn ids_are_unique_case_insensitive() {
6240        use std::collections::HashSet;
6241        let mut seen = HashSet::new();
6242        for info in list_indicators().iter() {
6243            let lower = info.id.to_ascii_lowercase();
6244            assert!(seen.insert(lower), "duplicate id {}", info.id);
6245        }
6246    }
6247
6248    #[test]
6249    fn all_registered_entries_have_output_schema() {
6250        for info in list_indicators().iter() {
6251            assert!(
6252                !info.outputs.is_empty(),
6253                "indicator {} has no output schema",
6254                info.id
6255            );
6256        }
6257    }
6258
6259    #[test]
6260    fn ma_registry_is_mirrored() {
6261        for ma in list_moving_averages().iter() {
6262            assert!(
6263                get_indicator(ma.id).is_some(),
6264                "missing moving average {} in global registry",
6265                ma.id
6266            );
6267        }
6268    }
6269
6270    #[test]
6271    fn lookup_is_case_insensitive() {
6272        assert!(get_indicator("SMA").is_some());
6273        assert!(get_indicator("sma").is_some());
6274    }
6275
6276    #[test]
6277    fn schema_accessors_work() {
6278        assert!(indicator_output_schema("macd").is_some());
6279        assert!(indicator_param_schema("sma").is_some());
6280        assert!(indicator_capabilities("sma").is_some());
6281        assert!(indicator_output_schema("not_real").is_none());
6282    }
6283
6284    #[test]
6285    fn pattern_recognition_capability_is_registered_as_non_batch() {
6286        let info = get_indicator("pattern_recognition").unwrap();
6287        assert_eq!(info.input_kind, IndicatorInputKind::Ohlc);
6288        assert_eq!(info.outputs.len(), 1);
6289        assert_eq!(info.outputs[0].id, "matrix");
6290        assert!(info.capabilities.supports_cpu_single);
6291        assert!(!info.capabilities.supports_cpu_batch);
6292        assert!(info.capabilities.supports_cuda_single);
6293        assert!(!info.capabilities.supports_cuda_batch);
6294        assert!(info.capabilities.supports_cuda_vram);
6295    }
6296
6297    #[test]
6298    fn dec_osc_and_rsx_are_registered_for_cuda_batch() {
6299        let dec_osc = get_indicator("dec_osc").unwrap();
6300        assert_eq!(dec_osc.input_kind, IndicatorInputKind::Slice);
6301        assert_eq!(dec_osc.outputs.len(), 1);
6302        assert_eq!(dec_osc.outputs[0].id, "value");
6303        assert!(dec_osc.capabilities.supports_cuda_batch);
6304        assert!(dec_osc.capabilities.supports_cuda_vram);
6305
6306        let rsx = get_indicator("rsx").unwrap();
6307        assert_eq!(rsx.input_kind, IndicatorInputKind::Slice);
6308        assert_eq!(rsx.outputs.len(), 1);
6309        assert_eq!(rsx.outputs[0].id, "value");
6310        assert!(rsx.capabilities.supports_cuda_batch);
6311        assert!(rsx.capabilities.supports_cuda_vram);
6312    }
6313
6314    #[test]
6315    fn chande_is_registered_for_cpu_and_cuda_batch() {
6316        assert!(supplemental_supports_cpu_batch("chande"));
6317        assert!(supplemental_supports_cuda_batch("chande"));
6318        let chande = get_indicator("chande").unwrap();
6319        assert_eq!(chande.input_kind, IndicatorInputKind::Ohlc);
6320        assert_eq!(chande.outputs.len(), 1);
6321        assert_eq!(chande.outputs[0].id, "value");
6322        assert!(chande.capabilities.supports_cpu_batch);
6323        assert!(chande.capabilities.supports_cuda_batch);
6324        assert!(chande.capabilities.supports_cuda_vram);
6325    }
6326
6327    #[test]
6328    fn bucket_b_ma_capabilities_follow_ma_registry() {
6329        let mama = indicator_capabilities("mama").unwrap();
6330        assert!(mama.supports_cpu_batch);
6331        assert!(mama.supports_cuda_batch);
6332        assert!(mama.supports_cuda_vram);
6333
6334        let vwap = indicator_capabilities("vwap").unwrap();
6335        assert!(vwap.supports_cpu_batch);
6336        assert!(vwap.supports_cuda_batch);
6337        assert!(vwap.supports_cuda_vram);
6338    }
6339
6340    #[test]
6341    fn bucket_membership_lookup_is_case_insensitive() {
6342        assert!(is_bucket_b_indicator("MAMA"));
6343        assert!(is_bucket_b_indicator("pivot"));
6344        assert!(!is_bucket_b_indicator("sma"));
6345        assert!(!is_bucket_b_indicator("adx"));
6346    }
6347
6348    #[test]
6349    fn lrsi_is_registered_for_cuda_batch() {
6350        let lrsi = get_indicator("lrsi").unwrap();
6351        assert_eq!(lrsi.input_kind, IndicatorInputKind::HighLow);
6352        assert_eq!(lrsi.outputs.len(), 1);
6353        assert_eq!(lrsi.outputs[0].id, "value");
6354        assert!(lrsi.capabilities.supports_cpu_batch);
6355        assert!(lrsi.capabilities.supports_cuda_batch);
6356        assert!(lrsi.capabilities.supports_cuda_vram);
6357    }
6358}