public override void OnData(Slice slice) { if (_dailyReturns.Samples == 0) { SetHoldings(spy, _spyAllocation); SetHoldings(tlt, _tltAllocation); } else if (_dailyReturns.IsReady) { var highestSharpe = 0m; for (decimal spyAllocation = 0.0m, tltAllocation = 1.0m; spyAllocation <= 1.0m; spyAllocation += 0.1m, tltAllocation -= 0.1m) { var sharpe = VolatilityScaledSharpeRatio(spyAllocation, tltAllocation); if (sharpe > highestSharpe) { _spyAllocation = spyAllocation; _tltAllocation = tltAllocation; } } _sd.Reset(); _dailyReturns.Reset(); _previousTradeBar = null; return; } if (_previousTradeBar != null) { UpdateDailyReturn(); } _previousTradeBar = new Tuple <TradeBar, TradeBar>(slice[spy], slice[tlt]); }
/// <summary> /// Resets this indicator and all sub-indicators (StandardDeviation, LowerBand, MiddleBand, UpperBand) /// </summary> public override void Reset() { StandardDeviation.Reset(); MiddleBand.Reset(); UpperBand.Reset(); LowerBand.Reset(); base.Reset(); }
/// <summary> /// Resets this indicator and all sub-indicators (StandardDeviation, LowerBand, MiddleBand, UpperBand, BandWidth, %B) /// </summary> public override void Reset() { StandardDeviation.Reset(); MiddleBand.Reset(); UpperBand.Reset(); LowerBand.Reset(); BandWidth.Reset(); PercentB.Reset(); base.Reset(); }
public void ResetsProperlyStandardDeviation() { var std = new StandardDeviation(3); std.Update(DateTime.Today, 1m); std.Update(DateTime.Today.AddSeconds(1), 5m); std.Update(DateTime.Today.AddSeconds(2), 1m); Assert.IsTrue(std.IsReady); std.Reset(); TestHelper.AssertIndicatorIsInDefaultState(std); }
public override void Initialize() { SetStartDate(2015, 1, 1); SetEndDate(DateTime.Now); SetCash(10000); AddSecurity(SecurityType.Equity, spy, _dataResolution); AddSecurity(SecurityType.Equity, tlt, _dataResolution); _sd = new StandardDeviation(LookbackPeriod - 1); _dailyReturns = new RollingWindow <Tuple <decimal, decimal> >(LookbackPeriod - 1); var spyHistory = History(spy, TimeSpan.FromDays(LookbackPeriod), _dataResolution); var tltHistory = History(tlt, TimeSpan.FromDays(LookbackPeriod), _dataResolution); var history = spyHistory.Zip(tltHistory, (spyBar, tltBar) => new Tuple <TradeBar, TradeBar>(spyBar, tltBar)); var highestSharpe = 0m; for (decimal spyAllocation = 0.0m, tltAllocation = 1.0m; spyAllocation <= 1.0m; spyAllocation += 0.1m, tltAllocation -= 0.1m) { var previousBar = history.First(); foreach (var tradeBar in history.Skip(1)) { var spyReturn = spyAllocation * (tradeBar.Item1.Close - previousBar.Item1.Close) / previousBar.Item1.Close; var tltReturn = tltAllocation * (tradeBar.Item2.Close - previousBar.Item2.Close) / previousBar.Item2.Close; _dailyReturns.Add(new Tuple <decimal, decimal>(spyReturn, tltReturn)); _sd.Update(tradeBar.Item1.EndTime, spyReturn + tltReturn); previousBar = tradeBar; } var mean = _dailyReturns.Select(dailyReturn => dailyReturn.Item1 + dailyReturn.Item2).Average(); var sharpe = mean / Convert.ToDecimal(Math.Pow(Convert.ToDouble(_sd), _volatilityFactor)); if (sharpe > highestSharpe) { highestSharpe = sharpe; _spyAllocation = spyAllocation; _tltAllocation = tltAllocation; } _sd.Reset(); _dailyReturns.Reset(); } }
public void UpdateWeights() { var highestSharpe = 0m; for (decimal spyAllocation = 0.0m, tltAllocation = 1.0m; spyAllocation <= 1.0m; spyAllocation += 0.1m, tltAllocation -= 0.1m) { var sharpe = VolatilityScaledSharpeRatio(spyAllocation, tltAllocation); if (sharpe > highestSharpe) { _spyAllocation = spyAllocation; _tltAllocation = tltAllocation; highestSharpe = sharpe; } } _sd.Reset(); _dailyReturns.Reset(); }