Overall Statistics
Total Trades
3282
Average Win
1.68%
Average Loss
-1.36%
Compounding Annual Return
18.293%
Drawdown
71.100%
Expectancy
0.074
Net Profit
261.146%
Sharpe Ratio
0.564
Loss Rate
52%
Win Rate
48%
Profit-Loss Ratio
1.23
Alpha
0.184
Beta
0.18
Annual Standard Deviation
0.358
Annual Variance
0.128
Information Ratio
0.281
Tracking Error
0.374
Treynor Ratio
1.124
Total Fees
$241639.14
//Copyright Warren Harding 2016, granted to the public domain.
//Use entirely at your own risk.
//Custom algorithm development: warrencharding@yahoo.com.
//
// Modified by John Roc to trade multiple pairs equally weighted in portfolio
//  Changes:
//  	1. Upto 10 ETF pairs in order
//		2. Independent Standard Deviation parameters for each pairs
//		3. DataNormalizationMode set to raw to get unadjusted prices
//
//Do not remove this copyright notice.
namespace QuantConnect 
{   
    public class LevETFs : QCAlgorithm
    {
    	//StandardDeviation std1, std2, std3, std4, std5;
    	
    	int indicatorPeriod=360;
    	double portfolio_weight=1.0;
    	Resolution resolution=Resolution.Minute;
    	string[] etf = { "TQQQ", "UPRO" };
    	string[] invetf = { "SQQQ", "SPXU" };
    	
    	//string[] etf = {"TQQQ"};
    	//string[] invetf = {"SQQQ"};
    	
    	
    	//decimal myStdDevConst = 1.75m;
    	decimal[] myStdDevConst = new decimal[] {1.2m,1.75m};
    	
    	// Note that the size of the array is limited to handle 10 pairs
    	StandardDeviation[] std = new StandardDeviation[10];
    	
        public override void Initialize() 
        {

        	IEnumerable<TradeBar>[] history = new IEnumerable<TradeBar>[10];
      
        	// distribute weight queally among ETF pairs
        	portfolio_weight = 1.0/(etf.Length);
        	
        	// backtest parameters
            //SetStartDate(2009, 10, 05);         
            SetStartDate(2010, 3, 5);
            //SetEndDate(2017, 03, 31);
            
            // cash allocation
            SetCash(1000000);
            
            for (int i=0 ; i< etf.Length; i++) {
            
	            AddEquity(etf[i], resolution,Market.USA,true,1m,false);
	            AddEquity(invetf[i], resolution,Market.USA,true,1m,false);
	           	
	           	// need to use raw normalized mode to avoid look ahead bias and prices before inverse splits
	           	Securities[etf[i]].SetDataNormalizationMode(DataNormalizationMode.Raw);
	            Securities[invetf[i]].SetDataNormalizationMode(DataNormalizationMode.Raw);
	            
	            std[i] = STD(etf[i], indicatorPeriod, resolution);
        		history[i] = History(etf[i], indicatorPeriod, resolution);
	            foreach (var tradeBar in history[i])
	            {
	            	std[i].Update(tradeBar.EndTime, tradeBar.Close);
	            }
	            
            }
            
           
        }


        public override void OnData(Slice data) 
        {
        	
        	for(int x=0; x < etf.Length; x++ ){
	        	if (std[x] < myStdDevConst[x])
	        	{
	    			//SetHoldings(invetf[x], 0);
	    			if(Securities[invetf[x]].Invested)
	    				SetHoldings(invetf[x], 0);
	    				//Liquidate(invetf[x]);
	    			if(Securities[etf[x]].Invested == false)
	    				SetHoldings(etf[x], portfolio_weight);
	    			Error(Time.ToString() + "|" + myStdDevConst[x].ToString() + "|" + std[x].ToString() + "|" + etf[x] + "|" + portfolio_weight.ToString());
	        	}
	        	else
	        	{
	    			//SetHoldings(etf[x], 0);
	    			if(Securities[etf[x]].Invested)
	    				SetHoldings(etf[x], 0);
	    				//Liquidate(etf[x]);
	    			if(Securities[invetf[x]].Invested == false)
	    				SetHoldings(invetf[x], portfolio_weight);
	    			Error(Time.ToString() + "|" + myStdDevConst[x].ToString() + "|" + std[x].ToString() + "|" + invetf[x] + "|" + portfolio_weight.ToString());
	        	}

        	}
 	
        }
    }
}