Files
Miha Kralj 060649192f docs: remove C# Implementation Considerations sections, clean up temp scripts, reorganize test files
- Remove 'C# Implementation Considerations' sections from 34 indicator .md files
- Delete 29 temp PowerShell scripts (_fix_mojibake.ps1, _hex_scan.ps1, etc.)
- Move test files into tests/ subdirectories for consistent project structure
- Add trader-focused bullet points to indicator documentation
2026-03-12 12:34:16 -07:00

97 lines
2.6 KiB
C#

using OoplesFinance.StockIndicators;
using OoplesFinance.StockIndicators.Models;
using Skender.Stock.Indicators;
namespace QuanTAlib.Tests;
public sealed class RmaValidationTests : IDisposable
{
private readonly ValidationTestData _testData;
private bool _disposed;
public RmaValidationTests()
{
_testData = new ValidationTestData(count: 10000, seed: 123);
}
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
_disposed = true;
if (disposing)
{
_testData?.Dispose();
}
}
[Fact]
public void Rma_Matches_Skender_Smma()
{
// Arrange
const int period = 14;
// QuanTAlib RMA
var rma = new Rma(period);
var quantalibResults = new TSeries();
foreach (var item in _testData.Data)
{
quantalibResults.Add(rma.Update(item));
}
// Skender SMMA
var skenderResults = _testData.SkenderQuotes.GetSmma(period).ToList();
// Assert
// Skip warmup period for comparison
// Skender uses SMA initialization, QuanTAlib uses zero-lag compensator
// They should converge after some periods
int skip = period * 30;
int itemsToVerify = _testData.Data.Count - skip;
ValidationHelper.VerifyData(quantalibResults, skenderResults, (s) => s.Smma, skip: itemsToVerify, tolerance: ValidationHelper.OoplesTolerance);
}
[Fact]
public void Validate_Against_Ooples()
{
// Arrange
int period = 14;
// QuanTAlib RMA
var rma = new Rma(period);
var qResult = rma.Update(_testData.Data);
// Ooples WWMA (Welles Wilder Moving Average)
var ooplesData = _testData.SkenderQuotes.Select(q => new TickerData
{
Date = q.Date,
Close = (double)q.Close,
High = (double)q.High,
Low = (double)q.Low,
Open = (double)q.Open,
Volume = (double)q.Volume
}).ToList();
var stockData = new StockData(ooplesData);
var oResult = stockData.CalculateWellesWilderMovingAverage(length: period);
var oValues = oResult.OutputValues["Wwma"];
// Assert
// Skip warmup period for comparison
int skip = period * 30;
int itemsToVerify = _testData.Data.Count - skip;
ValidationHelper.VerifyData(qResult, oValues, (s) => s, skip: itemsToVerify, tolerance: ValidationHelper.OoplesTolerance);
}
}