Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -0.273 Tracking Error 0.352 Treynor Ratio 0 Total Fees $0.00 |
import pandas as pd import numpy as np from Selection.UncorrelatedUniverseSelectionModel import UncorrelatedUniverseSelectionModel class CalibratedVentralRadiator(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 1, 1) self.SetEndDate(2020,9,21) self.SetCash(100000) self.fiveminBar = None self.symbol_list = list() self.UniverseSettings.Resolution = Resolution.Minute self.AddUniverseSelection(UncorrelatedUniverseSelectionModel(numberOfSymbols = 20)) self.SetWarmUp(30) # Schedule functions self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(9,00), self.ViewUniverse) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(9,15), self.registerIndicators) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(13,30), self.ClosePositions) def registerIndicators(self): self.symbolData = dict() for symbol in self.symbol_list: if not self.symbol_list: return #symbol = coarse.Value if symbol not in self.symbolData: consolidator = self.Consolidate(symbol, timedelta(minutes=5), self.OnDataConsolidated) self.symbolData[symbol] = SymbolData() self.RegisterIndicator(symbol, self.symbolData[symbol].macd, consolidator) self.RegisterIndicator(symbol, self.symbolData[symbol].mfi, consolidator) self.Log(self.symbol_list) def ViewUniverse(self): self.symbol_list = list() for universe in self.UniverseManager.Values: if universe is UserDefinedUniverse: continue symbols = universe.Members.Keys for symbol in symbols: self.symbol_list.append(symbol) #A function which saves the fiveminBar as bar def OnDataConsolidated(self, bar): if bar.Time.hour == 10: self.fiveminBar = bar #A function which saves the fiveminBar as bar def OnSecuritiesChanged(self, changes): self.changes = changes if self.changes is None: return if (self.IsWarmingUp): return if self.fiveminBar == None : return if not self.symbol_list: return qnty = 1/len(self.symbol_list) #history_select = self.Securities.Keys self.history = self.History(self.symbol_list, 5, Resolution.Daily) for coarse in self.changes.AddedSecurities: #self.selected.append(symbol.Symbol.Value) symbol = coarse.Symbol if symbol not in self.symbolData: return if not self.symbolData[symbol].is_ready(): return macd = self.symbolData[symbol].macd moneyfi = self.symbolData[symbol].mfi fast = macd.Fast.Current.Value slow = macd.Slow.Current.Value mfi = moneyfi.Current.Value self.Log(str(fast) + ' :' + str(slow)) if not self.history.empty: symbol_df = self.history.loc[symbol] holdings = self.Portfolio[symbol].Quantity if not self.Portfolio[symbol].Invested: #Buy at range high break out and confirm with the indicators if symbol_df.close[-1] > self.fiveminBar.High: if fast > slow and mfi < 30: max_stop = self.fiveminBar.High - (self.fiveminBar.High-self.fiveminBar.Low)/2 takeprofit = self.fiveminBar.High + (self.fiveminBar.High-self.fiveminBar.Low) self.SetHoldings(symbol, qnty) self.Log('LONG POSITION: {}'.format(symbol)) self.stopMarketTicket = self.StopMarketOrder(symbol, holdings, max_stop) self.takeProfitTicket = self.LimitOrder(symbol, holdings, takeprofit) #Sell at range low break out and confirm with the indicators if symbol_df.close[-1] < self.fiveminBar.Low: if slow > fast and mfi > 70: min_stop = self.fiveminBar.High + (self.fiveminBar.High-self.fiveminBar.Low)/2 takeprofit = self.fiveminBar.High - (self.fiveminBar.High-self.fiveminBar.Low) self.SetHoldings(symbol, -qnty) self.Log('SHOT POSITION: {}'.format(symbol)) self.stopMarketTicket = self.StopMarketOrder(symbol, -holdings, min_stop) self.takeProfitTicket = self.LimitOrder(symbol, -holdings, takeprofit) for security in self.changes.RemovedSecurities: self.Liquidate(security.Symbol) #close all open positions by end of day def ClosePositions(self): self.fiveminBar = None self.Liquidate() # Order event function def OnOrderEvent(self, orderEvent): if not (orderEvent.Status == 'Filled'): return if self.stopMarketTicket == None and self.takeProfitTicket == None: return if self.stopMarketTicket.OrderId == orderEvent.OrderId: self.takeProfitTicket.Cancel if self.takeProfitTicket.OrderId == orderEvent.OrderId: self.stopMarketTicket.Cancel class SymbolData(object): def __init__(self): #strategy parameters self.fastPeriod = 12 self.slowPeriod = 26 self.signalPeriod = 9 self.mfiPeriod = 14 #indicators self.macd = MovingAverageConvergenceDivergence(self.fastPeriod, self.slowPeriod, self.signalPeriod) self.mfi = MoneyFlowIndex(self.mfiPeriod) def is_ready(self): return self.macd.IsReady and self.mfi.IsReady