log_difference

Function log_difference 

Source
pub fn log_difference(prices: &[f64]) -> Vec<f64>
Expand description

Calculates the difference between the natural logarithm at t and t-1

§Arguments

  • prices - Slice of prices

§Panics

Panics if prices.is_empty()

§Examples

let prices = vec![100.0, 102.0, 103.0, 101.0];
let log_difference = rust_ti::basic_indicators::bulk::log_difference(&prices);
assert_eq!(
    vec![0.019802627296178876, 0.009756174945365181, -0.01960847138837618],
    log_difference
);
Examples found in repository?
examples/reference.rs (line 333)
14fn main() {
15    let now = Instant::now();
16
17    let open = vec![
18        4334.23, 4364.27, 4366.21, 4384.37, 4391.41, 4364.15, 4406.66, 4458.97, 4505.30, 4497.08,
19        4509.55, 4511.70, 4538.77, 4553.04, 4555.84, 4554.86, 4545.55, 4571.84, 4554.87, 4559.43,
20        4564.37, 4557.25, 4586.23, 4568.84, 4576.20, 4593.39, 4618.30, 4646.20, 4721.04, 4714.23,
21        4725.58, 4743.72, 4764.73, 4724.29, 4753.92, 4758.86, 4773.45, 4786.44, 4782.88, 4745.20,
22        4725.07, 4697.42, 4690.57, 4703.70, 4741.93, 4759.94, 4792.13, 4791.18, 4772.35, 4739.13,
23        4760.10, 4796.28, 4853.42, 4856.80, 4888.56, 4886.66, 4888.91, 4892.95, 4925.89, 4899.19,
24        4861.11, 4916.06, 4957.19, 4950.16, 4973.05, 4995.16, 5004.17, 5026.83, 4967.94, 4976.44,
25        5003.14, 5031.13, 4989.32, 4963.03, 5038.83, 5100.92, 5093.00, 5074.60, 5067.20, 5085.36,
26        5098.51, 5130.99, 5110.52, 5108.03, 5132.38, 5164.46, 5111.96, 5134.30, 5173.49, 5175.14,
27        5123.31, 5154.77, 5139.09, 5181.69, 5253.43, 5242.48, 5219.52, 5228.85, 5226.31, 5248.03,
28        5257.97, 5204.29, 5194.37, 5244.05, 5158.95, 5211.37, 5217.03, 5167.88, 5172.95, 5171.51,
29        5149.67, 5064.59, 5068.97, 5031.52, 5005.44, 4987.33, 5028.85, 5084.86, 5019.88, 5084.65,
30        5114.13, 5103.78, 5029.03, 5049.32, 5122.78, 5142.42, 5187.20, 5168.98, 5189.03, 5225.49,
31        5233.08, 5221.10, 5263.26, 5310.07, 5303.10, 5305.35, 5298.69, 5319.28, 5340.26, 5281.45,
32        5315.91, 5278.73, 5259.77, 5243.21, 5297.15, 5278.24, 5314.48, 5357.80, 5343.81, 5341.22,
33        5353.00, 5409.13, 5441.93, 5424.08, 5431.11, 5476.15, 5499.99, 5466.77, 5459.58, 5460.73,
34        5460.71, 5473.59, 5488.48, 5471.08, 5461.84, 5507.44, 5537.91, 5572.75, 5584.24, 5591.26,
35        5635.21, 5590.76, 5638.16, 5644.09, 5610.07, 5608.56,
36    ];
37
38    let high = vec![
39        4373.62, 4372.21, 4386.26, 4391.20, 4393.40, 4418.03, 4421.76, 4508.67, 4521.17, 4511.99,
40        4520.12, 4557.11, 4542.14, 4568.43, 4560.31, 4560.52, 4568.14, 4587.64, 4569.89, 4599.39,
41        4572.37, 4578.56, 4590.74, 4590.92, 4609.23, 4623.71, 4643.93, 4709.69, 4738.57, 4725.53,
42        4749.52, 4768.69, 4778.01, 4748.71, 4772.94, 4784.72, 4785.39, 4793.30, 4788.43, 4754.33,
43        4729.29, 4726.78, 4721.49, 4764.54, 4765.47, 4790.80, 4798.50, 4802.40, 4782.34, 4744.23,
44        4785.79, 4842.07, 4868.41, 4866.48, 4903.68, 4898.15, 4906.69, 4929.31, 4931.09, 4906.75,
45        4906.97, 4975.29, 4957.19, 4957.77, 4999.89, 5000.40, 5030.06, 5048.39, 4971.30, 5002.52,
46        5032.72, 5038.70, 4993.71, 4983.21, 5094.39, 5111.06, 5097.66, 5080.69, 5077.37, 5104.99,
47        5140.33, 5149.67, 5114.54, 5127.97, 5165.62, 5189.26, 5124.66, 5179.87, 5179.14, 5176.85,
48        5136.86, 5175.60, 5180.31, 5226.19, 5261.10, 5246.09, 5229.09, 5235.16, 5249.26, 5264.85,
49        5263.95, 5208.34, 5228.75, 5256.59, 5222.18, 5219.57, 5224.81, 5178.43, 5211.78, 5175.03,
50        5168.43, 5079.84, 5077.96, 5056.66, 5019.02, 5038.84, 5076.12, 5089.48, 5057.75, 5114.62,
51        5123.49, 5110.83, 5096.12, 5073.21, 5139.12, 5181.00, 5200.23, 5191.95, 5215.30, 5239.66,
52        5237.26, 5250.37, 5311.76, 5325.49, 5305.45, 5325.32, 5324.32, 5323.18, 5341.88, 5311.65,
53        5315.91, 5282.27, 5260.21, 5280.33, 5302.11, 5298.80, 5354.16, 5362.35, 5375.08, 5365.79,
54        5375.95, 5447.25, 5441.93, 5432.39, 5488.50, 5490.38, 5505.53, 5478.31, 5490.66, 5472.88,
55        5483.14, 5490.81, 5523.64, 5479.55, 5509.69, 5539.27, 5570.33, 5583.11, 5590.75, 5635.39,
56        5642.45, 5655.56, 5666.94, 5669.67, 5622.49, 5614.05,
57    ];
58
59    let low = vec![
60        4334.23, 4347.53, 4355.41, 4359.76, 4343.94, 4353.34, 4393.82, 4458.97, 4495.31, 4487.83,
61        4499.66, 4510.36, 4525.51, 4545.05, 4552.80, 4546.32, 4540.51, 4547.15, 4537.24, 4554.71,
62        4546.72, 4551.68, 4546.50, 4565.22, 4574.06, 4593.39, 4608.09, 4643.23, 4694.34, 4704.69,
63        4725.58, 4743.72, 4697.82, 4708.35, 4736.77, 4758.45, 4768.90, 4780.98, 4751.99, 4722.67,
64        4699.71, 4687.53, 4682.11, 4699.82, 4730.35, 4756.20, 4739.58, 4768.98, 4747.12, 4714.82,
65        4740.57, 4785.87, 4844.05, 4844.37, 4865.94, 4869.34, 4881.47, 4887.40, 4916.27, 4845.15,
66        4853.52, 4907.99, 4918.09, 4934.88, 4969.05, 4987.09, 5000.34, 5016.83, 4920.31, 4956.45,
67        4999.44, 4999.52, 4955.02, 4946.00, 5038.83, 5081.46, 5068.91, 5057.29, 5058.35, 5061.89,
68        5094.16, 5127.18, 5056.82, 5092.22, 5128.21, 5117.50, 5091.14, 5114.48, 5151.88, 5123.30,
69        5104.35, 5145.47, 5131.59, 5171.55, 5240.66, 5229.87, 5216.09, 5203.42, 5213.92, 5245.82,
70        5229.20, 5184.05, 5194.37, 5146.06, 5157.21, 5197.35, 5160.78, 5138.70, 5138.77, 5107.94,
71        5052.47, 5039.83, 5007.25, 5001.89, 4953.56, 4969.40, 5027.96, 5047.02, 4990.58, 5073.14,
72        5088.65, 5035.31, 5013.45, 5011.05, 5101.22, 5142.42, 5178.96, 5165.86, 5180.41, 5209.68,
73        5211.16, 5217.98, 5263.26, 5296.19, 5283.59, 5302.40, 5297.87, 5286.01, 5256.93, 5278.39,
74        5280.89, 5262.70, 5222.10, 5191.68, 5234.32, 5257.63, 5297.64, 5335.36, 5331.33, 5331.52,
75        5327.25, 5409.13, 5402.51, 5403.75, 5420.40, 5471.32, 5455.56, 5452.03, 5447.59, 5446.56,
76        5451.87, 5467.54, 5451.12, 5446.53, 5458.43, 5507.42, 5531.63, 5562.51, 5574.57, 5586.44,
77        5576.53, 5590.44, 5614.75, 5639.02, 5584.81, 5522.81,
78    ];
79
80    let close = vec![
81        4358.34, 4365.98, 4378.38, 4382.78, 4347.35, 4415.24, 4411.55, 4495.70, 4502.88, 4508.24,
82        4514.02, 4547.38, 4538.19, 4556.62, 4559.34, 4550.43, 4554.89, 4550.58, 4567.80, 4594.63,
83        4569.78, 4567.18, 4549.34, 4585.59, 4604.37, 4622.44, 4643.70, 4707.09, 4719.55, 4719.19,
84        4740.56, 4768.37, 4698.35, 4746.75, 4754.63, 4774.75, 4781.58, 4783.35, 4769.83, 4742.83,
85        4704.81, 4688.68, 4697.24, 4763.54, 4756.50, 4783.45, 4780.24, 4783.83, 4765.98, 4739.21,
86        4780.94, 4839.81, 4850.43, 4864.60, 4868.55, 4894.16, 4890.97, 4927.93, 4924.97, 4845.65,
87        4906.19, 4958.61, 4942.81, 4954.23, 4995.06, 4997.91, 5026.61, 5021.84, 4953.17, 5000.62,
88        5029.73, 5005.57, 4975.51, 4981.80, 5087.03, 5088.80, 5069.53, 5078.18, 5069.76, 5096.27,
89        5137.08, 5130.95, 5078.65, 5104.76, 5157.36, 5123.69, 5117.94, 5175.27, 5165.31, 5150.48,
90        5117.09, 5149.42, 5178.51, 5224.62, 5241.53, 5234.18, 5218.19, 5203.58, 5248.49, 5254.35,
91        5243.77, 5205.81, 5211.49, 5147.21, 5204.34, 5202.39, 5209.91, 5160.64, 5199.06, 5123.41,
92        5061.82, 5051.41, 5022.21, 5011.12, 4967.23, 5010.60, 5070.55, 5071.63, 5048.42, 5099.96,
93        5116.17, 5035.69, 5018.39, 5064.20, 5127.79, 5180.74, 5187.70, 5187.67, 5214.08, 5222.68,
94        5221.42, 5246.68, 5308.15, 5297.10, 5303.27, 5308.13, 5321.41, 5307.01, 5267.84, 5304.72,
95        5306.04, 5266.95, 5235.48, 5277.51, 5283.40, 5291.34, 5354.03, 5352.96, 5346.99, 5360.79,
96        5375.32, 5421.03, 5433.74, 5431.60, 5473.23, 5487.03, 5473.17, 5464.62, 5447.87, 5469.30,
97        5477.90, 5482.87, 5460.48, 5475.09, 5509.01, 5537.02, 5567.19, 5572.85, 5576.98, 5633.91,
98        5584.54, 5615.35, 5631.22, 5667.20, 5588.27, 5544.59,
99    ];
100
101    let volume = vec![
102        4570960000.0,
103        3656340000.0,
104        3791230000.0,
105        3729510000.0,
106        3900780000.0,
107        3665080000.0,
108        3326240000.0,
109        4700350000.0,
110        4347170000.0,
111        3964520000.0,
112        3777240000.0,
113        3644790000.0,
114        3511080000.0,
115        3042810000.0,
116        1639500000.0,
117        3403990000.0,
118        3586240000.0,
119        4418760000.0,
120        5399300000.0,
121        4397120000.0,
122        4369910000.0,
123        3909950000.0,
124        4245680000.0,
125        3818880000.0,
126        3707010000.0,
127        3823210000.0,
128        3808380000.0,
129        5063650000.0,
130        6314040000.0,
131        8218980000.0,
132        4060340000.0,
133        4026970000.0,
134        4201320000.0,
135        3431180000.0,
136        3046770000.0,
137        2513910000.0,
138        2748450000.0,
139        2698860000.0,
140        3126060000.0,
141        3743050000.0,
142        3950760000.0,
143        3715480000.0,
144        3844370000.0,
145        3742320000.0,
146        3529960000.0,
147        3498680000.0,
148        3759890000.0,
149        3486340000.0,
150        4260550000.0,
151        3928600000.0,
152        4019000000.0,
153        4287200000.0,
154        4297610000.0,
155        3912800000.0,
156        4330030000.0,
157        4020430000.0,
158        3353400000.0,
159        3525160000.0,
160        3836130000.0,
161        4696120000.0,
162        4386090000.0,
163        3974350000.0,
164        4023640000.0,
165        4440880000.0,
166        4895590000.0,
167        4341860000.0,
168        3912990000.0,
169        3805740000.0,
170        4302190000.0,
171        3845600000.0,
172        4137970000.0,
173        3833270000.0,
174        4034880000.0,
175        3788390000.0,
176        4051710000.0,
177        3672790000.0,
178        3683930000.0,
179        3925950000.0,
180        3789370000.0,
181        5219740000.0,
182        4748110000.0,
183        4758440000.0,
184        4418410000.0,
185        4559050000.0,
186        4137980000.0,
187        4208870000.0,
188        3896430000.0,
189        4080510000.0,
190        4282890000.0,
191        4687970000.0,
192        7753670000.0,
193        4036220000.0,
194        4031760000.0,
195        4064850000.0,
196        4207730000.0,
197        3374700000.0,
198        3331360000.0,
199        3871790000.0,
200        3850500000.0,
201        3998270000.0,
202        3325930000.0,
203        3886590000.0,
204        3703250000.0,
205        4075680000.0,
206        3386780000.0,
207        3278180000.0,
208        3400680000.0,
209        3845930000.0,
210        3509380000.0,
211        3963220000.0,
212        3950210000.0,
213        4006200000.0,
214        3596130000.0,
215        3619760000.0,
216        3878750000.0,
217        3820250000.0,
218        3751400000.0,
219        3656740000.0,
220        3958050000.0,
221        3604140000.0,
222        3447450000.0,
223        4082470000.0,
224        4544170000.0,
225        4381660000.0,
226        3924990000.0,
227        3683250000.0,
228        3987890000.0,
229        3842100000.0,
230        3727370000.0,
231        3617900000.0,
232        4255710000.0,
233        4763580000.0,
234        4360810000.0,
235        3817470000.0,
236        3578120000.0,
237        3420100000.0,
238        3662240000.0,
239        3847130000.0,
240        3869520000.0,
241        3005510000.0,
242        3751540000.0,
243        3552750000.0,
244        3818750000.0,
245        5437160000.0,
246        4046920000.0,
247        3707900000.0,
248        3591460000.0,
249        3609990000.0,
250        3692760000.0,
251        3622280000.0,
252        3568030000.0,
253        3962840000.0,
254        3530380000.0,
255        3438650000.0,
256        3447840000.0,
257        3544330000.0,
258        3847060000.0,
259        6773800000.0,
260        3696750000.0,
261        3591960000.0,
262        3563920000.0,
263        3589530000.0,
264        7199220000.0,
265        3488760000.0,
266        3329950000.0,
267        2179470000.0,
268        3253080000.0,
269        3185670000.0,
270        3232920000.0,
271        3336100000.0,
272        4020950000.0,
273        3700280000.0,
274        3620470000.0,
275        4041760000.0,
276        4246450000.0,
277        2926006284.0,
278    ];
279
280    let length = close.len();
281
282    // Derived data
283    let mut typical_price = Vec::with_capacity(length);
284    for i in 0..length {
285        typical_price.push((close[i] + high[i] + low[i]) / 3.0);
286    }
287
288    // Constants and available models
289    let numerator = 5.0;
290    let denominator = 4.0;
291    let period: usize = 5;
292    let long_period: usize = 20;
293    let previous_mcginley_dynamic = 0.0;
294
295    let available_models = vec![
296        rust_ti::ConstantModelType::SimpleMovingAverage,
297        rust_ti::ConstantModelType::SmoothedMovingAverage,
298        rust_ti::ConstantModelType::ExponentialMovingAverage,
299        rust_ti::ConstantModelType::PersonalisedMovingAverage {
300            alpha_num: numerator,
301            alpha_den: denominator,
302        },
303        rust_ti::ConstantModelType::SimpleMovingMedian,
304        rust_ti::ConstantModelType::SimpleMovingMode,
305    ];
306    let available_deviations = vec![
307        rust_ti::DeviationModel::StandardDeviation,
308        rust_ti::DeviationModel::MeanAbsoluteDeviation,
309        rust_ti::DeviationModel::MedianAbsoluteDeviation,
310        rust_ti::DeviationModel::ModeAbsoluteDeviation,
311        rust_ti::DeviationModel::UlcerIndex,
312    ];
313    let available_moving_averages = vec![
314        rust_ti::MovingAverageType::Simple,
315        rust_ti::MovingAverageType::Smoothed,
316        rust_ti::MovingAverageType::Exponential,
317        rust_ti::MovingAverageType::Personalised {
318            alpha_num: numerator,
319            alpha_den: denominator,
320        },
321    ];
322
323    // Basic indicators
324    let median = rust_ti::basic_indicators::bulk::median(&typical_price, period);
325    println!("Median: {:?}", median);
326
327    let mode = rust_ti::basic_indicators::bulk::mode(&typical_price, period);
328    println!("Mode: {:?}", mode);
329
330    let log = rust_ti::basic_indicators::bulk::log(&typical_price);
331    println!("Log: {:?}", log);
332
333    let log_diff = rust_ti::basic_indicators::bulk::log_difference(&typical_price);
334    println!("Log difference: {:?}", log_diff);
335
336    let variance = rust_ti::basic_indicators::bulk::variance(&typical_price, period);
337    println!("Variance: {:?}", variance);
338
339    let standard_dev = rust_ti::basic_indicators::bulk::standard_deviation(&typical_price, period);
340    println!("Standard Deviation: {:?}", standard_dev);
341
342    let mean_ad = rust_ti::basic_indicators::bulk::absolute_deviation(
343        &typical_price,
344        period,
345        AbsDevConfig {
346            center: CentralPoint::Mean,
347            aggregate: DeviationAggregate::Mean,
348        },
349    );
350    println!("Mean Absolute Deviation: {:?}", mean_ad);
351
352    let median_ad = rust_ti::basic_indicators::bulk::absolute_deviation(
353        &typical_price,
354        period,
355        AbsDevConfig {
356            center: CentralPoint::Median,
357            aggregate: DeviationAggregate::Median,
358        },
359    );
360    println!("Median Absolute Deviation: {:?}", median_ad);
361
362    let mode_ad = rust_ti::basic_indicators::bulk::absolute_deviation(
363        &typical_price,
364        period,
365        AbsDevConfig {
366            center: CentralPoint::Mode,
367            aggregate: DeviationAggregate::Mode,
368        },
369    );
370    println!("Mode Absolute Deviation: {:?}", mode_ad);
371
372    // Candle indicators
373    let difference = 2.0;
374    for model in &available_models {
375        let envelope = rust_ti::candle_indicators::bulk::moving_constant_envelopes(
376            &typical_price,
377            *model,
378            difference,
379            period,
380        );
381        println!("{:?} Envelope: {:?}", model, envelope);
382    }
383
384    let mcginley_envelope = rust_ti::candle_indicators::bulk::mcginley_dynamic_envelopes(
385        &typical_price,
386        difference,
387        previous_mcginley_dynamic,
388        period,
389    );
390    println!("McGinley Envelope: {:?}", mcginley_envelope);
391
392    let deviation_multiplier = 2.0;
393    for model in &available_models {
394        for deviation in &available_deviations {
395            let bands = rust_ti::candle_indicators::bulk::moving_constant_bands(
396                &typical_price,
397                *model,
398                *deviation,
399                deviation_multiplier,
400                period,
401            );
402            println!("{:?} Band, {:?}: {:?}", model, deviation, bands);
403        }
404    }
405
406    for deviation in &available_deviations {
407        let md_bands = rust_ti::candle_indicators::bulk::mcginley_dynamic_bands(
408            &typical_price,
409            *deviation,
410            deviation_multiplier,
411            previous_mcginley_dynamic,
412            period,
413        );
414        println!("McGinley Dynamic Band {:?}: {:?}", deviation, md_bands);
415    }
416
417    let ichimoku_cloud =
418        rust_ti::candle_indicators::bulk::ichimoku_cloud(&high, &low, &close, 9, 26, 52);
419    println!("Ichimoku cloud: {:?}", ichimoku_cloud);
420
421    let donchian_channels =
422        rust_ti::candle_indicators::bulk::donchian_channels(&high, &low, period);
423    println!("Donchian Channels: {:?}", donchian_channels);
424
425    let multiplier = 2.0;
426    for model in &available_models {
427        for atr_model in &available_models {
428            let keltner_channel = rust_ti::candle_indicators::bulk::keltner_channel(
429                &high[1..],
430                &low[1..],
431                &close[..length - 1],
432                *model,
433                *atr_model,
434                multiplier,
435                period,
436            );
437            println!(
438                "Keltner Channel {:?} {:?}: {:?}",
439                model, atr_model, keltner_channel
440            );
441        }
442    }
443
444    for model in &available_models {
445        let supertrend = rust_ti::candle_indicators::bulk::supertrend(
446            &high, &low, &close, *model, multiplier, period,
447        );
448        println!("Supertrend {:?}: {:?}", model, supertrend);
449    }
450
451    // Momentum indicators
452    for model in &available_models {
453        let rsi = rust_ti::momentum_indicators::bulk::relative_strength_index(
454            &typical_price,
455            *model,
456            period,
457        );
458        println!("{:?} RSI: {:?}", model, rsi);
459    }
460
461    let stochastic_oscillator =
462        rust_ti::momentum_indicators::bulk::stochastic_oscillator(&typical_price, period);
463    println!("Stochastic Oscillator: {:?}", stochastic_oscillator);
464
465    for model in &available_models {
466        let slow_so = rust_ti::momentum_indicators::bulk::slow_stochastic(
467            &stochastic_oscillator,
468            *model,
469            period,
470        );
471        println!("Slow Stochastic {:?}: {:?}", model, slow_so);
472
473        for slowest_model in &available_models {
474            let slowest_so = rust_ti::momentum_indicators::bulk::slowest_stochastic(
475                &slow_so,
476                *slowest_model,
477                period,
478            );
479            println!("Slowest Stochastic {:?}: {:?}", slowest_model, slowest_so);
480        }
481    }
482
483    let mfi = rust_ti::momentum_indicators::bulk::money_flow_index(&typical_price, &volume, period);
484    println!("Money Flow Index: {:?}", mfi);
485
486    let roc = rust_ti::momentum_indicators::bulk::rate_of_change(&typical_price);
487    println!("Rate of Change: {:?}", roc);
488
489    let previous_obv = 0.0;
490    let obv = rust_ti::momentum_indicators::bulk::on_balance_volume(
491        &typical_price,
492        &volume,
493        previous_obv,
494    );
495    println!("On Balance Volume: {:?}", obv);
496
497    let constant_multiplier = 0.015;
498    for model in &available_models {
499        for deviation_model in &available_deviations {
500            let cci = rust_ti::momentum_indicators::bulk::commodity_channel_index(
501                &typical_price,
502                *model,
503                *deviation_model,
504                constant_multiplier,
505                period,
506            );
507            println!("CCI {:?} {:?}: {:?}", model, deviation_model, cci);
508        }
509    }
510
511    for deviation_model in &available_deviations {
512        let md_cci = rust_ti::momentum_indicators::bulk::mcginley_dynamic_commodity_channel_index(
513            &typical_price,
514            previous_mcginley_dynamic,
515            *deviation_model,
516            constant_multiplier,
517            period,
518        );
519        println!("McGinley Dynamic CCI {:?}: {:?}", deviation_model, md_cci);
520    }
521
522    for short_model in &available_models {
523        for long_model in &available_models {
524            let macd = rust_ti::momentum_indicators::bulk::macd_line(
525                &typical_price,
526                period,
527                *short_model,
528                long_period,
529                *long_model,
530            );
531            println!("MACD {:?} {:?}: {:?}", short_model, long_model, macd);
532
533            for signal_model in &available_models {
534                let signal =
535                    rust_ti::momentum_indicators::bulk::signal_line(&macd, *signal_model, period);
536                println!("Signal line {:?}: {:?}", signal_model, signal);
537            }
538        }
539    }
540
541    let md_macd = rust_ti::momentum_indicators::bulk::mcginley_dynamic_macd_line(
542        &typical_price,
543        period,
544        previous_mcginley_dynamic,
545        long_period,
546        previous_mcginley_dynamic,
547    );
548    println!("McGinley Dynamic MACD: {:?}", md_macd);
549
550    let previous_ad = 0.0;
551    for short_model in &available_models {
552        for long_model in &available_models {
553            let co = rust_ti::momentum_indicators::bulk::chaikin_oscillator(
554                &high,
555                &low,
556                &close,
557                &volume,
558                period,
559                long_period,
560                previous_ad,
561                *short_model,
562                *long_model,
563            );
564            println!(
565                "Chaikin Oscillator {:?} {:?}: {:?}",
566                short_model, long_model, co
567            );
568        }
569    }
570
571    for model in &available_models {
572        let ppo = rust_ti::momentum_indicators::bulk::percentage_price_oscillator(
573            &typical_price,
574            period,
575            long_period,
576            *model,
577        );
578        println!("PPO {:?}: {:?}", model, ppo);
579        for moving_average in &available_moving_averages {
580            let signal =
581                rust_ti::moving_average::bulk::moving_average(&ppo, *moving_average, period);
582            println!("{:?} Signal Line: {:?}", moving_average, signal);
583        }
584    }
585
586    let cmo =
587        rust_ti::momentum_indicators::bulk::chande_momentum_oscillator(&typical_price, period);
588    println!("Chande Momentum Oscillator: {:?}", cmo);
589
590    // Moving Averages
591    for moving_average in &available_moving_averages {
592        let ma =
593            rust_ti::moving_average::bulk::moving_average(&typical_price, *moving_average, period);
594        println!("{:?} Moving Average: {:?}", moving_average, ma);
595    }
596
597    let mcginley_dynamic =
598        rust_ti::moving_average::bulk::mcginley_dynamic(&typical_price, 0.0, period);
599    println!("McGinley Dynamic: {:?}", mcginley_dynamic);
600
601    // Other indicators
602    let true_range = rust_ti::other_indicators::bulk::true_range(&close, &high, &low);
603    println!("True Range: {:?}", true_range);
604
605    for model in &available_models {
606        let average_true_range = rust_ti::other_indicators::bulk::average_true_range(
607            &close, &high, &low, *model, period,
608        );
609        println!("{:?} Average True Range: {:?}", model, average_true_range);
610    }
611
612    let ibs = rust_ti::other_indicators::bulk::internal_bar_strength(&high, &low, &close);
613    println!("Internal Bar Strength: {:?}", ibs);
614
615    for model in &available_models {
616        let pi = rust_ti::other_indicators::bulk::positivity_indicator(
617            &open[1..],
618            &close[..length - 1],
619            period,
620            *model,
621        );
622        println!("{:?} Positivity Index: {:?}", model, pi);
623    }
624
625    // Strength indicators
626    let ad = rust_ti::strength_indicators::bulk::accumulation_distribution(
627        &high, &low, &close, &volume, 0.0,
628    );
629    println!("Accumulation Distribution: {:?}", ad);
630
631    let pvi = rust_ti::strength_indicators::bulk::positive_volume_index(&close, &volume, 0.0);
632    println!("Positive Volume Index: {:?}", pvi);
633
634    let nvi = rust_ti::strength_indicators::bulk::negative_volume_index(&close, &volume, 0.0);
635    println!("Negative Volume Index: {:?}", nvi);
636
637    for model in &available_models {
638        let rvi = rust_ti::strength_indicators::bulk::relative_vigor_index(
639            &open, &high, &low, &close, *model, period,
640        );
641        println!("{:?} Relative Vigor Index: {:?}", model, rvi);
642        for signal_model in &available_moving_averages {
643            let signal = rust_ti::moving_average::bulk::moving_average(&rvi, *signal_model, period);
644            println!("{:?} Signal Line: {:?}", signal_model, signal);
645        }
646    }
647
648    // Trend indicators
649    let aroon_indicator = rust_ti::trend_indicators::bulk::aroon_indicator(&high, &low, period);
650    println!("Aroon Indicator: {:?}", aroon_indicator);
651
652    let ptps = rust_ti::trend_indicators::bulk::parabolic_time_price_system(
653        &high,
654        &low,
655        0.02,
656        0.2,
657        0.02,
658        rust_ti::Position::Long,
659        0.0,
660    );
661    println!("Parabolic Time Price System: {:?}", ptps);
662
663    for model in &available_models {
664        let dms = rust_ti::trend_indicators::bulk::directional_movement_system(
665            &high, &low, &close, period, *model,
666        );
667        println!("{:?} Directional Movement System: {:?}", model, dms);
668    }
669
670    let vpt =
671        rust_ti::trend_indicators::bulk::volume_price_trend(&typical_price, &volume[1..], 0.0);
672    println!("Volume Price Trend: {:?}", vpt);
673
674    for first_model in &available_models {
675        for second_model in &available_models {
676            let tsi = rust_ti::trend_indicators::bulk::true_strength_index(
677                &typical_price,
678                *first_model,
679                period,
680                *second_model,
681                period,
682            );
683            println!(
684                "{:?} {:?} True Strength Index: {:?}",
685                first_model, second_model, tsi
686            );
687            for signal_model in &available_moving_averages {
688                let signal =
689                    rust_ti::moving_average::bulk::moving_average(&tsi, *signal_model, period);
690                println!("{:?} Signal Line: {:?}", signal_model, signal);
691            }
692        }
693    }
694
695    // Volatility indicators
696    let ulcer_index = rust_ti::volatility_indicators::bulk::ulcer_index(&typical_price, period);
697    println!("Ulcer Index: {:?}", ulcer_index);
698
699    let constant_multiplier = 3.0;
700    for model in &available_models {
701        let vs = rust_ti::volatility_indicators::bulk::volatility_system(
702            &high,
703            &low,
704            &close,
705            period,
706            constant_multiplier,
707            *model,
708        );
709        println!("{:?} Volatility System: {:?}", model, vs);
710    }
711
712    // Chart trends (truncated, see documentation for argument meaning)
713    let trend_break_config = rust_ti::chart_trends::TrendBreakConfig::default();
714    let break_down_trends = rust_ti::chart_trends::break_down_trends(&close, trend_break_config);
715    println!("Broken down trends: {:?}", break_down_trends);
716
717    let valleys = rust_ti::chart_trends::valleys(&close, 30, 5);
718    println!("Valleys: {:?}", valleys);
719
720    let peaks = rust_ti::chart_trends::peaks(&close, 30, 5);
721    println!("Peaks: {:?}", peaks);
722
723    // Distributions
724    println!("\n=== Distributions ===");
725
726    // Normal Distribution
727    let normal = rust_ti::distributions::Normal::new(0.0, 1.0);
728    println!(
729        "Normal (μ=0, σ=1) - Mean: {}, Variance: {}, Std Dev: {}",
730        normal.mean(),
731        normal.variance(),
732        normal.std_dev()
733    );
734    println!("Normal PDF at x=0.0: {:.6}", normal.pdf(0.0));
735    println!("Normal CDF at x=0.0: {:.6}", normal.cdf(0.0));
736
737    let custom_normal = rust_ti::distributions::Normal::new(100.0, 15.0);
738    println!(
739        "Normal (μ=100, σ=15) - Mean: {}, PDF at x=100.0: {:.6}",
740        custom_normal.mean(),
741        custom_normal.pdf(100.0)
742    );
743
744    // Cauchy Distribution
745    let cauchy = rust_ti::distributions::Cauchy::standard();
746    println!(
747        "Cauchy (standard) - Mean: {} (undefined), Variance: {} (undefined)",
748        cauchy.mean(),
749        cauchy.variance()
750    );
751    println!("Cauchy PDF at x=0.0: {:.6}", cauchy.pdf(0.0));
752    println!("Cauchy CDF at x=0.0: {:.6}", cauchy.cdf(0.0));
753
754    // Student's t-Distribution
755    let student_t = rust_ti::distributions::StudentT::new(5.0);
756    println!(
757        "Student-t (df=5) - Mean: {}, Variance: {:.6}",
758        student_t.mean(),
759        student_t.variance()
760    );
761    println!("Student-t PDF at x=0.0: {:.6}", student_t.pdf(0.0));
762    println!("Student-t CDF at x=0.0: {:.6}", student_t.cdf(0.0));
763
764    // Laplace Distribution
765    let laplace = rust_ti::distributions::Laplace::standard();
766    println!(
767        "Laplace (standard) - Mean: {}, Variance: {}",
768        laplace.mean(),
769        laplace.variance()
770    );
771    println!("Laplace PDF at x=0.0: {:.6}", laplace.pdf(0.0));
772    println!("Laplace CDF at x=0.0: {:.6}", laplace.cdf(0.0));
773
774    // Log-Normal Distribution
775    let lognormal = rust_ti::distributions::LogNormal::standard();
776    println!(
777        "LogNormal (standard) - Mean: {:.6}, Variance: {:.6}",
778        lognormal.mean(),
779        lognormal.variance()
780    );
781    println!("LogNormal PDF at x=1.0: {:.6}", lognormal.pdf(1.0));
782    println!("LogNormal CDF at x=1.0: {:.6}", lognormal.cdf(1.0));
783
784    // Tail probability comparison
785    let normal_tail = 1.0 - rust_ti::distributions::Normal::standard().cdf(3.0);
786    let cauchy_tail = 1.0 - rust_ti::distributions::Cauchy::standard().cdf(3.0);
787    let student_t_tail = 1.0 - rust_ti::distributions::StudentT::new(5.0).cdf(3.0);
788    let laplace_tail = 1.0 - rust_ti::distributions::Laplace::standard().cdf(3.0);
789    println!(
790        "Tail probabilities P(X > 3): Normal={:.6}, Cauchy={:.6}, Student-t={:.6}, Laplace={:.6}",
791        normal_tail, cauchy_tail, student_t_tail, laplace_tail
792    );
793
794    let elapsed = now.elapsed();
795    println!("\nElapsed: {:.2?}", elapsed);
796}