namespace QuantConnect.Algorithm.CSharp { public class MeanReversion : QCAlgorithm { private Symbol _spy; private RollingWindow<decimal> _Close; private SimpleMovingAverage _spyDailySmaTrend; private bool BullTrend; private bool BullSetup; private bool BullExit; private const int Lookback = 5; private const int TrendLen = 190; private Minimum SomeDaysLow; private Maximum SomeDaysHigh; private decimal EntryPrice = 0.0m; public override void Initialize() { SetStartDate(2016, 01, 01); //Set Start Date SetEndDate(2017, 10, 27); //Set End Date SetCash(100000); //Set Strategy Cash AddEquity("SPY", Resolution.Daily); _spy = Securities["SPY"].Symbol; _Close = new RollingWindow<decimal>(Lookback); _spyDailySmaTrend = SMA(_spy, TrendLen, Resolution.Daily); SomeDaysLow = MIN("SPY", Lookback, Resolution.Daily, Field.Close); SomeDaysHigh = MAX("SPY", Lookback, Resolution.Daily, Field.Close); } public void OnData(TradeBars data) { _Close.Add(data[_spy].Close); if (!_spyDailySmaTrend.IsReady) return; if (!_Close.IsReady) return; BullTrend = _Close[0] > _spyDailySmaTrend; BullSetup = data[_spy].Close < SomeDaysLow; BullExit = _Close[0] > SomeDaysHigh ; // crosses over Write_it(Time + " _Close[0]=" + _Close[0].ToString("0.00") + " " + _Close[1].ToString("0.00") + " " + _Close[2].ToString("0.00") + " " + _Close[3].ToString("0.00") + " " + _Close[4].ToString("0.00") + " xDayLow=" + SomeDaysLow + " " + BullTrend + " " + BullSetup); if (!Portfolio.Invested && BullSetup && BullTrend ) { var _ticket = MarketOrder("SPY", 1000); EntryPrice = _Close[0]; Write_it(Time + " Buy -> _Close[0], Close[1]" + _Close[0].ToString("0.00") + ", " + _Close[1].ToString("0.00") + " SevenDayLow=" + SomeDaysLow); } if (Portfolio.Invested && BullExit) { MarketOrder("SPY", -1000); Write_it(Time + " Sell -> Close " + _Close[0].ToString("0.00") + " Gain/Loss=" + (_Close[0]-EntryPrice) ); } } public void Write_it(String _string) { //Log(_string); Debug(_string); } } }

 

SomeDaysLow = MIN("SPY", Lookback, Resolution.Daily, Field.Close);

There are no trades generated by this code. The reason is that the current close value data[_spy].Close is already included in SomeDaysLow. Thus BullSetup becomes never true. 

In my opionon N("SPY", Lookback, Resolution.Daily, Field.Close); should not include the current bar, but start with the previous bar ( min (Close[1], Close[2], Close[3],  ...) and NOT min (Close[0], Close[1], Close[2],  ...)

Or I am wrong or is there any other way forward.

regards

Ulrich

Author