Overall Statistics
Total Trades
140
Average Win
10.82%
Average Loss
-6.01%
Compounding Annual Return
86.818%
Drawdown
65.700%
Expectancy
0.144
Net Profit
77.464%
Sharpe Ratio
1.01
Loss Rate
59%
Win Rate
41%
Profit-Loss Ratio
1.80
Alpha
1.093
Beta
-0.651
Annual Standard Deviation
1.032
Annual Variance
1.066
Information Ratio
0.921
Tracking Error
1.049
Treynor Ratio
-1.603
Total Fees
$1023.86
namespace QuantConnect 
{   
    /*
    *   The underlying QCAlgorithm class is full of helper methods which enable you to use QuantConnect.
    *   We have explained some of these here, but the full algorithm can be found at:
    *   https://github.com/QuantConnect/QCAlgorithm/blob/master/QuantConnect.Algorithm/QCAlgorithm.cs
    */
    public class RollingWindowAlgorithm : QCAlgorithm
    {
    	public const string Symbol = "UWTI";
    	
    	public ExponentialMovingAverage Fast;
    	public ExponentialMovingAverage Slow;
    	public MovingAverageConvergenceDivergence DailyMacd;
    	public Momentum DailyMomentum;
    	public RelativeStrengthIndex DailyRSI;
        //Initialize the data and resolution you require for your strategy:
        public override void Initialize() 
        {
			// Code Automatically Generated  
			//AddSecurity(SecurityType.Equity, "NVDA", Resolution.Second);
			
			// Code Automatically Generated  
			//AddSecurity(SecurityType.Forex, "EURUSD", Resolution.Second);
			
			
			
			
            //Start and End Date range for the backtest:
            SetStartDate(2016, 1, 1);         
            SetEndDate(2016, 11, 30);
            // In Initialize // Warm up 30 days of data. 
            //SetWarmup(TimeSpan.FromDays(30));
            //Cash allocation
            SetCash(10000);
            
            //Add as many securities as you like. All the data will be passed into the event handler:
            AddSecurity(SecurityType.Equity, Symbol, Resolution.Minute);
            
            // define our 15 minute consolidator, this makes 15min bars from 1min bars
            var fifteenMinute = new TradeBarConsolidator(TimeSpan.FromMinutes(15));
            // register the consolidator to receive data for our 'Symbol'
            SubscriptionManager.AddConsolidator(Symbol, fifteenMinute);
            
            // attach our 15 minute event handler, the 'OnFifteenMinuteData' will be called
            // at 9:45, 10:00, 10:15, ect... until 4:00pm
            fifteenMinute.DataConsolidated += OnFifteenMinuteData;
            
            // define our 15 minute fast EMA
            Fast = new ExponentialMovingAverage(5);
            // define our 15 minute slow EMA
            Slow = new ExponentialMovingAverage(20);
            
            // we can also define some daily indicators
            DailyMomentum = MOM(Symbol, 10);
            DailyMacd = MACD(Symbol, 12, 26, 9, MovingAverageType.Wilders, Resolution.Daily);
            DailyRSI = RSI(Symbol, 14,  MovingAverageType.Simple, Resolution.Minute);
            
        }
        
        const decimal tolerance = 0.01m;
        
        public void OnFifteenMinuteData(object sender, TradeBar bar)
        {
        	// update our indicators
        	Fast.Update(Time, bar.Close);
        	Slow.Update(Time, bar.Close);
        	
        	var quantity = Portfolio[Symbol].Quantity;
        	
        	// short or flat and longer term up
        //if (quantity <= 0 && DailyRSI > 25 && DailyMomentum > 0)
        if (quantity <= 0 && DailyRSI > 25)
        
        	{
        		// check for short term up
        		if (Fast > Slow*(1+tolerance))
        		{
        			// move everything into a long position
        			SetHoldings(Symbol, 1.0);
        		}
        	}
        	// long or flat and longer term down
        	//else if (quantity >= 0 && DailyRSI < 75 && DailyMomentum <  0)
        	else if (quantity >= 0 && DailyRSI < 80)
        	{
        		// check for short term down
        		if (Fast < Slow*(1-tolerance))
        		{
        			// move everything into a short position
        			SetHoldings(Symbol, -1.0);
        		}
        	}
        	// check for exit conditions
        	else if (quantity != 0)
        	{
        		// check for long exit
        		if (quantity > 0 && Fast < Slow*(1-tolerance))
        		{
        			Liquidate(Symbol);
        		}
        		// check for short exit
        		else if (quantity < 0 && Fast > Slow*(1+tolerance))
        		{
        			Liquidate(Symbol);
        		}
        	}
        }

        //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
        public void OnData(TradeBars data) 
        {
        }
    }
}