using KLHZ.Trader.Core.Contracts.Declisions.Dtos; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace KLHZ.Trader.Core.Math.Declisions.Utils { public static class Statistics { public static decimal Mean(this CachedValue[] values) { return values.Sum(x => x.Value)/ values.Length; } private static (decimal mean, decimal std) CaclSigma(decimal[] values) { var mean = values.Sum() / values.Length; var data = new decimal[values.Length]; Array.Copy(values, data, data.Length); for (int i = 0; i < data.Length; i++) { var v = data[i] - mean; data[i] = v * v; } var std = System.Math.Pow((double)(data.Sum() / (data.Length - 1)), 0.5); return (mean,(decimal)std); } public static decimal[] ClearNSigmaReqursive(decimal[] values, int depth = 0, int sigmasCount = 3) { if (values.Length <= 1 || depth>10) return values; var sigmaRes = CaclSigma(values); var std = sigmaRes.std; var mean = sigmaRes.mean; var forRes = new List(); var _3std = sigmasCount * std; foreach (var v in values) { if (System.Math.Abs(mean - v)< _3std) { forRes.Add(v); } } if (forRes.Count != values.Length) { return ClearNSigmaReqursive(forRes.ToArray(), depth+1); } else { return forRes.ToArray(); } } } }