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}