mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-07 21:47:43 +00:00
060649192f
- 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
97 lines
2.6 KiB
C#
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);
|
|
}
|
|
}
|