diff --git a/Indicators/Beta.cs b/Indicators/Beta.cs index 39484b628a8e..a40baaf2b096 100644 --- a/Indicators/Beta.cs +++ b/Indicators/Beta.cs @@ -99,7 +99,7 @@ public class Beta : BarIndicator, IIndicatorWarmUpPeriodProvider /// /// Gets a flag indicating when the indicator is ready and fully initialized /// - public override bool IsReady => (_targetReturns.Samples >= WarmUpPeriod - 1) && (_referenceReturns.Samples >= WarmUpPeriod - 1); + public override bool IsReady => _targetReturns.IsReady && _referenceReturns.IsReady; /// /// Creates a new Beta indicator with the specified name, target, reference, @@ -128,11 +128,9 @@ public Beta(string name, Symbol targetSymbol, Symbol referenceSymbol, int period _targetReturns = new RollingWindow(period); _referenceReturns = new RollingWindow(period); _beta = 0; - - _targetTimeZone = MarketHoursDatabase.FromDataFolder() - .GetExchangeHours(_targetSymbol.ID.Market, _targetSymbol, _targetSymbol.ID.SecurityType).TimeZone; - _referenceTimeZone = MarketHoursDatabase.FromDataFolder() - .GetExchangeHours(_referenceSymbol.ID.Market, _referenceSymbol, _referenceSymbol.ID.SecurityType).TimeZone; + var dataFolder = MarketHoursDatabase.FromDataFolder(); + _targetTimeZone = dataFolder.GetExchangeHours(_targetSymbol.ID.Market, _targetSymbol, _targetSymbol.ID.SecurityType).TimeZone; + _referenceTimeZone = dataFolder.GetExchangeHours(_referenceSymbol.ID.Market, _referenceSymbol, _referenceSymbol.ID.SecurityType).TimeZone; _isTimezoneDifferent = _targetTimeZone != _referenceTimeZone; } @@ -175,11 +173,6 @@ public Beta(string name, int period, Symbol targetSymbol, Symbol referenceSymbol /// The beta value of the target used in relation with the reference protected override decimal ComputeNextValue(IBaseDataBar input) { - if (input.Symbol != _targetSymbol && input.Symbol != _referenceSymbol) - { - throw new ArgumentException($"The given symbol {input.Symbol} was not {_targetSymbol} or {_referenceSymbol} symbol"); - } - if (_previousInput == null) { _previousInput = input; @@ -202,12 +195,7 @@ protected override decimal ComputeNextValue(IBaseDataBar input) { AddDataPoint(input); AddDataPoint(_previousInput); - - // Compute beta when both have at least "period" data points - if (IsReady) - { - ComputeBeta(); - } + ComputeBeta(); } _previousInput = input; return _beta; @@ -258,6 +246,10 @@ private void AddDataPoint(IBaseDataBar input) _referenceReturns.Add(GetNewReturn(_referenceDataPoints)); } } + else + { + throw new ArgumentException($"The given symbol {input.Symbol} was not {_targetSymbol} or {_referenceSymbol} symbol"); + } } /// @@ -291,9 +283,9 @@ private void ComputeBeta() /// public override void Reset() { + _previousInput = null; _targetDataPoints.Reset(); _referenceDataPoints.Reset(); - _targetReturns.Reset(); _referenceReturns.Reset(); _beta = 0; diff --git a/Tests/Indicators/BetaIndicatorTests.cs b/Tests/Indicators/BetaIndicatorTests.cs index e7a5c81b58b4..80d1cf804241 100644 --- a/Tests/Indicators/BetaIndicatorTests.cs +++ b/Tests/Indicators/BetaIndicatorTests.cs @@ -177,11 +177,13 @@ public void EqualBetaValue() for (int i = 0; i < 3; i++) { - indicator.Update(new TradeBar() { Symbol = Symbols.AAPL, Low = 1, High = 2, Volume = 100, Close = i + 1, Time = _reference.AddDays(1 + i) }); - indicator.Update(new TradeBar() { Symbol = Symbols.SPX, Low = 1, High = 2, Volume = 100, Close = i + 1, Time = _reference.AddDays(1 + i) }); + var startTime = _reference.AddDays(1 + i); + var endTime = startTime.AddDays(1); + indicator.Update(new TradeBar() { Symbol = Symbols.AAPL, Low = 1, High = 2, Volume = 100, Close = i + 1, Time = startTime, EndTime = endTime }); + indicator.Update(new TradeBar() { Symbol = Symbols.SPX, Low = 1, High = 2, Volume = 100, Close = i + 1, Time = startTime, EndTime = endTime }); } - Assert.AreEqual(0, (double)indicator.Current.Value, 0.0001); + Assert.AreEqual(1, (double)indicator.Current.Value, 0.0001); } [Test]