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