/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using NUnit.Framework; using QuantConnect.Indicators; using System; namespace QuantConnect.Tests.Indicators { /// /// Result tested vs. Python available at: http://tinyurl.com/o7redso /// [TestFixture] public class LeastSquaresMovingAverageTests : CommonIndicatorTests { protected override IndicatorBase CreateIndicator() { return new LeastSquaresMovingAverage(20); } protected override string TestFileName => string.Empty; protected override string TestColumnName => string.Empty; #region Array input // Real AAPL minute data rounded to 2 decimals. public static decimal[] Prices = { 125.99m, 125.91m, 125.75m, 125.62m, 125.54m, 125.45m, 125.47m, 125.4m , 125.43m, 125.45m, 125.42m, 125.36m, 125.23m, 125.32m, 125.26m, 125.31m, 125.41m, 125.5m , 125.51m, 125.41m, 125.54m, 125.51m, 125.61m, 125.43m, 125.42m, 125.42m, 125.46m, 125.43m, 125.4m , 125.35m, 125.3m , 125.28m, 125.21m, 125.37m, 125.32m, 125.34m, 125.37m, 125.26m, 125.28m, 125.16m }; #endregion Array input #region Array expected public static decimal[] Expected = { 125.99m , 125.91m , 125.75m , 125.62m , 125.54m , 125.45m , 125.47m , 125.4m , 125.43m , 125.45m , 125.42m , 125.36m , 125.23m , 125.32m , 125.26m , 125.31m , 125.41m , 125.5m , 125.51m , 125.2679m , 125.328m , 125.381m , 125.4423m, 125.4591m, 125.4689m, 125.4713m, 125.4836m, 125.4834m, 125.4803m, 125.4703m, 125.4494m, 125.4206m, 125.3669m, 125.3521m, 125.3214m, 125.2986m, 125.2909m, 125.2723m, 125.2619m, 125.2224m, }; #endregion Array input protected override void RunTestIndicator(IndicatorBase indicator) { var time = DateTime.Now; for (var i = 0; i < Prices.Length; i++) { indicator.Update(time.AddMinutes(i), Prices[i]); Assert.AreEqual(Expected[i], Math.Round(indicator.Current.Value, 4)); } } [Test] public override void ResetsProperly() { var indicator = CreateIndicator(); var time = DateTime.Now; for (var i = 0; i < 20; i++) { indicator.Update(time.AddMinutes(i), Prices[i]); Assert.AreEqual(Expected[i], Math.Round(indicator.Current.Value, 4)); } Assert.IsTrue(indicator.IsReady, "LeastSquaresMovingAverage Ready"); indicator.Reset(); TestHelper.AssertIndicatorIsInDefaultState(indicator); } [Test] public override void WarmsUpProperly() { var indicator = CreateIndicator(); var period = (indicator as IIndicatorWarmUpPeriodProvider)?.WarmUpPeriod; if (!period.HasValue) return; var time = DateTime.Now; for (var i = 1; i < period.Value; i++) { indicator.Update(time.AddMinutes(i - 1), Prices[i - 1]); Assert.AreEqual(Expected[i - 1], Math.Round(indicator.Current.Value, 4)); Assert.IsFalse(indicator.IsReady); } indicator.Update(time.AddMinutes(period.Value - 1), Prices[period.Value - 1]); Assert.IsTrue(indicator.IsReady); } } }