private void Add(CoinJoinFeeRateStat feeRateStat) { CoinJoinFeeRateStats.Add(feeRateStat); DefaultAverages = TimeFrames.Select(t => new CoinJoinFeeRateAverage(t, GetAverage(t))).ToArray(); // Prune old items. DateTimeOffset removeBefore = DateTimeOffset.UtcNow - MaximumTimeToStore; while (CoinJoinFeeRateStats.Any() && CoinJoinFeeRateStats[0].DateTimeOffset < removeBefore) { CoinJoinFeeRateStats.RemoveAt(0); } }
private FeeRate GetMedian(TimeSpan timeFrame) { var from = DateTimeOffset.UtcNow - timeFrame; var feeRates = CoinJoinFeeRateStats .Where(x => x.DateTimeOffset >= from) .OrderByDescending(x => x.FeeRate.SatoshiPerByte) .ToArray(); // If the median is even, then it's the average of the middle two numbers. FeeRate med = feeRates.Length % 2 == 0 ? new FeeRate((feeRates[feeRates.Length / 2].FeeRate.SatoshiPerByte + feeRates[(feeRates.Length / 2) - 1].FeeRate.SatoshiPerByte) / 2) : feeRates[feeRates.Length / 2].FeeRate; return(med); }
private FeeRate GetAverage(TimeSpan timeFrame) { var from = DateTimeOffset.UtcNow - timeFrame; return(new FeeRate(CoinJoinFeeRateStats.Where(x => x.DateTimeOffset >= from).Average(x => x.FeeRate.SatoshiPerByte))); }