Overall Statistics |
Total Trades 8 Average Win 0.06% Average Loss -0.03% Compounding Annual Return 8.146% Drawdown 0.200% Expectancy 1.178 Net Profit 0.150% Sharpe Ratio 14.737 Probabilistic Sharpe Ratio 0% Loss Rate 25% Win Rate 75% Profit-Loss Ratio 1.90 Alpha 0.073 Beta 0.037 Annual Standard Deviation 0.004 Annual Variance 0 Information Ratio 3.989 Tracking Error 0.072 Treynor Ratio 1.776 Total Fees $0.00 |
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)