diff --git a/Indicators/McClellanOscillator.cs b/Indicators/McClellanOscillator.cs index 51b139b99f81..bc3fe4814929 100644 --- a/Indicators/McClellanOscillator.cs +++ b/Indicators/McClellanOscillator.cs @@ -50,7 +50,9 @@ public class McClellanOscillator : TradeBarIndicator, IIndicatorWarmUpPeriodProv /// /// Required period, in data points, for the indicator to be ready and fully initialized. /// - public int WarmUpPeriod => EMASlow.WarmUpPeriod + ADDifference.WarmUpPeriod; + /// The two periods share a bar: EMASlow is fed by ADDifference and only + /// once it is ready, so ADDifference's last warm-up bar is EMASlow's first input. + public int WarmUpPeriod => EMASlow.WarmUpPeriod + ADDifference.WarmUpPeriod - 1; /// /// Initializes a new instance of the class diff --git a/Tests/Indicators/McClellanOscillatorTests.cs b/Tests/Indicators/McClellanOscillatorTests.cs index 90d7811a3f62..de26030b37b9 100644 --- a/Tests/Indicators/McClellanOscillatorTests.cs +++ b/Tests/Indicators/McClellanOscillatorTests.cs @@ -58,11 +58,12 @@ public override void WarmsUpProperly() indicator.Update(new TradeBar() { Symbol = Symbols.AAPL, Close = i, Volume = 1, Time = reference.AddMinutes(i) }); indicator.Update(new TradeBar() { Symbol = Symbols.MSFT, Close = i, Volume = 1, Time = reference.AddMinutes(i) }); indicator.Update(new TradeBar() { Symbol = Symbols.GOOG, Close = i, Volume = 1, Time = reference.AddMinutes(i) }); + + Assert.AreEqual(i == indicator.WarmUpPeriod, indicator.IsReady); } Assert.AreEqual(0m, indicator.Current.Value); Assert.AreEqual(indicator.WarmUpPeriod * 3, indicator.Samples); - Assert.IsTrue(indicator.IsReady); } [Test] diff --git a/Tests/Indicators/McClellanSummationIndexTests.cs b/Tests/Indicators/McClellanSummationIndexTests.cs index 919babcdd987..95848d36f100 100644 --- a/Tests/Indicators/McClellanSummationIndexTests.cs +++ b/Tests/Indicators/McClellanSummationIndexTests.cs @@ -57,11 +57,12 @@ public override void WarmsUpProperly() indicator.Update(new TradeBar() { Symbol = Symbols.AAPL, Close = i, Volume = 1, Time = reference.AddMinutes(i) }); indicator.Update(new TradeBar() { Symbol = Symbols.MSFT, Close = i, Volume = 1, Time = reference.AddMinutes(i) }); indicator.Update(new TradeBar() { Symbol = Symbols.GOOG, Close = i, Volume = 1, Time = reference.AddMinutes(i) }); + + Assert.AreEqual(i == indicator.WarmUpPeriod, indicator.IsReady); } Assert.AreEqual(60m, indicator.Current.Value); Assert.AreEqual(indicator.WarmUpPeriod * 3, indicator.Samples); - Assert.IsTrue(indicator.IsReady); } [Test]