Overall Statistics
class MovingAverageCrossAlgorithm(QCAlgorithm):

        def Initialize(self):
            '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''
        
            self.SetStartDate(2014, 1, 1)    #Set Start Date
            self.SetEndDate(2014, 1, 7)      #Set End Date
            self.SetCash(100000)             #Set Strategy Cash
            # Find more symbols here: http://quantconnect.com/data
            # initialize our forex data 
            ForexSymbols =["EURUSD", "USDJPY", "EURGBP", "EURCHF", "USDCAD", "USDCHF", "AUDUSD","NZDUSD"]
            
            self.indicators_by_symbols = {}
            # initialize our forex data 
            for symbol in ForexSymbols:
                sym = self.AddForex(symbol).Symbol
                self.indicators_by_symbols[sym] = {}
                # create a 15 day exponential moving average
                self.indicators_by_symbols[sym]['fast'] = self.EMA(sym, 3, Resolution.Minute)
                self.indicators_by_symbols[sym]['slow'] = self.EMA(sym, 7, Resolution.Minute)
                self.indicators_by_symbols[sym]['rsi'] = self.RSI(sym, 7, MovingAverageType.Simple, Resolution.Minute)
                self.indicators_by_symbols[sym]['atr'] = self.ATR(sym, 5, MovingAverageType.Simple, Resolution.Minute)
                self.indicators_by_symbols[sym]['atr2'] = self.ATR(sym, 12, MovingAverageType.Simple, Resolution.Minute)
            
            self.SetWarmUp(12, Resolution.Minute)
            self.previous = None

        def OnData(self, data):
            '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.'''
            # a couple things to notice in this method:
            #  1. We never need to 'update' our indicators with the data, the engine takes care of this for us
            #  2. We can use indicators directly in math expressions
            #  3. We can easily plot many indicators at the same time
    
            # wait for our slowest TA indicator to fully initialize
            for symbol in self.indicators_by_symbols:
                if not self.indicators_by_symbols[symbol]['atr2'].IsReady:
                    return
            
            
            # only once per day
            if self.previous is not None and self.previous.date() == self.Time.date():
                return
            self.previous = self.Time
            
    
            # define a small tolerance on our checks to avoid bouncing
            tolerance = 0.00015
    
            for symbol, value in self.indicators_by_symbols.items():
                holdings = self.Portfolio[symbol].Quantity
                price = self.Securities[symbol].Price
                # we only want to go long if we're currently short or flat
                if holdings <= 0:
                    fast = value['fast'].Current.Value
                    slow = value['slow'].Current.Value
                    rsi = value['rsi'].Current.Value
                    atr = value['atr'].Current.Value
                    atr2 = value['atr2'].Current.Value
                    
                    # if the fast is greater than the slow, we'll go long
                    if fast > slow *(1 + tolerance) and rsi > 60 and atr > atr2:
                        self.Log("BUY  >> {0}".format(price))
                        self.SetHoldings(symbol, 0.25)
                        
                    if fast < slow *(1 - tolerance) and rsi < 40 and atr > atr2:
                        self.Log("SELL  >> {0}".format(price))
                        self.SetHoldings((symbol), 0.25)
                        
                # we only want to liquidate if we're currently long
                # if the fast is less than the slow we'll liquidate our long
                if holdings > 0 and fast < slow:
                    self.Log("SELL >> {0}".format(price))
                    self.Liquidate(symbol)
                
                if holdings < 0 and fast > slow:
                    self.Log("BUY >> {0}".format(price))
                    self.Liquidate(symbol)