Overall Statistics
namespace QuantConnect.Rotation
{
    public class GlobalRotation : QCAlgorithm
    {
		private int N = 3;
		private int period = 6*21;
        // these are the growth symbols we'll rotate through
        List<string> GrowthSymbols = new List<string>
        {
            			"EWJ",  //# iShares MSCI Japan Index ETF
                        "EZU",  //# iShares MSCI Eurozone ETF
                        "EFNL", //# iShares MSCI Finland Capped Investable Market Index ETF
                        "EWW",  //# iShares MSCI Mexico Inv. Mt. Idx
                        "ERUS", //# iShares MSCI Russia ETF
                        "IVV",  //# iShares S&P 500 Index
                        "ICOL", //# Consumer Discretionary Select Sector SPDR Fund
                        "AAXJ", //# iShares MSCI All Country Asia ex Japan Index ETF
                        "AUD",  //# Australia Bond Index Fund
                        "EWQ",  //# iShares MSCI France Index ETF
                        "BUND", //# Pimco Germany Bond Index Fund
                        "EWH",  //# iShares MSCI Hong Kong Index ETF
                        "EPI",  //# WisdomTree India Earnings ETF
                        "EIDO", // # iShares MSCI Indonesia Investable Market Index ETF
                        "EWI",  //# iShares MSCI Italy Index ETF
                        "GAF",  //# SPDR S&P Emerging Middle East & Africa ETF
                        "ENZL", //# iShares MSCI New Zealand Investable Market Index Fund
                        "NORW",  //# Global X FTSE Norway 30 ETF
                        "EWY",  //# iShares MSCI South Korea Index ETF
                        "EWP",  //# iShares MSCI Spain Index ETF
                        "EWD",  //# iShares MSCI Sweden Index ETF
                        "EWL",  //# iShares MSCI Switzerland Index ETF
                        "GXC",  //# SPDR S&P China ETF
                        "EWC",  //# iShares MSCI Canada Index ETF
                        "EWZ",  ///# iShares MSCI Brazil Index ETF
                        "ARGT", //# Global X FTSE Argentina 20 ETF
                        "AND",  //# Global X FTSE Andean 40 ETF
                        "AIA",  //# iShares S&P Asia 50 Index ETF
                        "EWO",  //# iShares MSCI Austria Investable Mkt Index ETF
                        "EWK",  //# iShares MSCI Belgium Investable Market Index ETF
                        "BRAQ", //# Global X Brazil Consumer ETF
                        "ECH",  //# iShares MSCI Chile Investable Market Index ETF
                        "CHIB", //# Global X China Technology ETF
                        "EGPT", //# Market Vectors Egypt Index ETF
                        "ADRU", //# BLDRS Europe 100 ADR Index ETF
                        "EDV", //#20+yr treasure bond
                        "SHY", //#1-3y treasure bonds
                        "GLD", //#gold
                        "DBC", //#commodities
        };

        // these are the safety symbols we go to when things are looking bad for growth
        List<string> SafetySymbols = new List<string>
        {
  
        };

        // we'll hold some computed data in these guys
        List<SymbolData> SymbolData = new List<SymbolData>();

        public override void Initialize()
        {
            
            SetStartDate(2017, 12, 25);
            SetEndDate(2018, 1, 15);
			SetCash(100000);
			SetWarmUp(period);
			
            foreach (var symbol in GrowthSymbols)
            {
                // ideally we would use daily data
                AddSecurity(SecurityType.Equity, symbol, Resolution.Daily);
                var threeMonthPerformance = MOM(symbol, period, Resolution.Daily);

                SymbolData.Add(new SymbolData
                {
                    Symbol = symbol,
                    ThreeMonthPerformance = threeMonthPerformance
                });
            }
            
            
            
            //# shcedule the function to fire at the month start 
        	Schedule.On(DateRules.MonthStart("IVV"), TimeRules.AfterMarketOpen("IVV"), Rebalance);
        }

        public void OnData(TradeBars data)
        {
          
        }
        
        public void Rebalance() 
        {
        		if (IsWarmingUp) return;
        		// pick which one is best from growth and safety symbols
        			Debug(Time.ToString());
                    
                    
					
                    var orderedObjScores = SymbolData.OrderByDescending(x => x.ObjectiveScore).ToList();
                    foreach (var t in orderedObjScores) {
						Debug(t.Symbol + "    " + t.ObjectiveScore);
					}
					/*
					
                    foreach (var orderedObjScore in orderedObjScores)
                    {
                        Log(">>SCORE>>" + orderedObjScore.Symbol + ">>" + orderedObjScore.ObjectiveScore);
                    }
                    var top = orderedObjScores.Take(N);
                   
			
					//liquidate
					foreach (var kvp in Portfolio)
					{
						var security_hold = kvp.Value;
						//liquidate the security which is no longer in the top momentum list
						if (security_hold.Invested)
						{
							bool inlist = false;
							foreach (var t in top) {
								if (security_hold.Symbol.Value == t.Symbol)
									inlist = true;
							}
							if (inlist)
								Liquidate(security_hold.Symbol);
						}
					}
					
					// we'll hold some computed data in these guys
        			List<SymbolData> added_symbols = new List<SymbolData>();
					foreach (var symbol in top) {
						if (!Portfolio[symbol.Symbol].Invested)
							added_symbols.Add(symbol);
					}
					
					foreach (var symbol in added_symbols) 
					{
						SetHoldings(symbol.Symbol,1/added_symbols.Count);
					}
					*/
        }
    }

    class SymbolData
    {
        public string Symbol;

        public Momentum ThreeMonthPerformance { get; set; }

        public decimal ObjectiveScore
        {
            get
            {
                return ThreeMonthPerformance;
            }
        }
    }
}