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.904 Tracking Error 0.066 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 |
class SacrificeScotFree(QCAlgorithm): def Initialize(self): # Set params for data and brokerage # ----------------------------------- self.symbol = "EURUSD" #self.symbol = ["EURUSD", "USDJPY", "EURGBP", "EURCHF", "USDCAD", "USDCHF", "AUDUSD","NZDUSD"] self.SetBrokerageModel(BrokerageName.OandaBrokerage) #for i in range(len(self.symbol)): self.AddForex(self.symbol) #, Resolution.Hour, self.ADXtresh = 20 # threshold line for ADX self.SetStartDate(2018, 5, 1) # Set Start Date self.SetEndDate(2018, 9, 30) self.SetCash(100000) # Set Strategy Cash self.Securities[self.symbol].SetDataNormalizationMode(DataNormalizationMode.Raw) self.symbolDataBySymbol = {} ######### ADD WINDOWS ################## self.window_hr = RollingWindow[QuoteBar](20) # History hour bars #For other security types, use QuoteBar self.windowmin = RollingWindow[QuoteBar](20) # History 5 min bars self.window_4hr = RollingWindow[QuoteBar](20) # History 4 hour bars #self.Consolidate(self.symbol,timedelta(hours=1),lambda x:self.HourBarHandler.Add(x)) #self.Consolidate(self.symbol,timedelta(minutes=5),lambda x:self.HourBarHandler.Add(x)) #self.Consolidate(self.symbol,timedelta(hours=4),lambda x:self.window_4hr.Add(x)) self._macdWin2 = RollingWindow[IndicatorDataPoint](20) self._macdWin = RollingWindow[IndicatorDataPoint](20) self.BB_4Hr_Win = RollingWindow[IndicatorDataPoint](20) self.BB_Min_Win = RollingWindow[IndicatorDataPoint](20) self.historyADXindicator = RollingWindow[IndicatorDataPoint](20) def OnSecuritiesChanged(self, algorithm, changes): for security in changes.AddedSecurities: symbol = security.Symbol if symbol not in self.symbolDataBySymbol: self.symbolDataBySymbol[symbol] = SymbolData(algorithm, symbol) ##add periodsself.barHistoryWindow for security in changes.RemovedSecurities: symbol = security.Symbol if symbol not in self.symbolDataBySymbol: symbolData = self.symbolDataBySymbol.pop(symbol, None) if symbolData != None: algorithm.SubscriptionManager.RemoveConsolidator(symbol, symbolData.fiveMinutesConsolidate) algorithm.SubscriptionManager.RemoveConsolidator(symbol, symbolData.HourConsolidate) algorithm.SubscriptionManager.RemoveConsolidator(symbol, symbolData.FourHoursConsolidate) def InitIndicators(self, algorithm): self.algorithm = algorithm ## ------REGISTER HANDLER-----FIVE MINS CONSOLIDATOR -------## self.fiveMinutesConsolidator = QuoteBarConsolidator(timedelta(minutes=5)) self.fiveMinutesConsolidator.DataConsolidated += self.fiveMinutesBarHandler #create function for this algorithm.SubscriptionManager.AddConsolidator(self.symbol, self.fiveMinutesConsolidator) ## ------REGISTER HANDLER-----ONE HOUR CONSOLIDATOR -------## self.HourConsolidator = QuoteBarConsolidator(timedelta(minutes=60)) #BarPeriod = TimeSpan.FromMinutes(10) self.HourConsolidator.DataConsolidated += self.HourBarHandler #create function for this algorithm.SubscriptionManager.AddConsolidator(self.symbol, self.HourConsolidator) ## ------REGISTER HANDLER-----FOUR HOURS CONSOLIDATOR -------## self.FourHoursConsolidator = QuoteBarConsolidator(timedelta(hours=4)) self.FourHoursConsolidator.DataConsolidated += self.FourHoursBarHandler #create function for this algorithm.SubscriptionManager.AddConsolidator(self.symbol, self.FourHoursConsolidator) self.BB_HR = self.BB(self.symbol, 20, 2, MovingAverageType.Exponential, Resolution.Hour), self.BB_4HR = self.BB(self.symbol, 20, 2, MovingAverageType.Exponential, Resolution.Hour), self.BB_min = self.BB(self.symbol, 20, 2, MovingAverageType.Exponential, Resolution.Minute), self.MACD_min = self.MACD(self.symbol, 12, 20, 4, MovingAverageType.Exponential,Resolution.Minute), self.MACD_hour = self.MACD(self.symbol, 12, 20, 4, MovingAverageType.Exponential,Resolution.Hour), self.ADX_hr = self.ADX(self.symbol,14, Resolution.Hour), self.RSI_hr = self.RSI(self.symbol,self.RSI_Period,Resolution.Hour) ## ------REGISTER INDICATORS TO HANDLER -------## ## Register macd 5 Min algorithm.RegisterIndicator(self.symbol, self.MACD_min, self.fiveMinutesConsolidator) self.MACD_min.Updated +=self.Macd_Min_Updated ## Register BB 5 Min algorithm.RegisterIndicator(self.symbol, self.BB_min ,self.fiveMinutesConsolidator) self.BB_min.Updated +=self.BB_Min_Updated #create function for this ## Register macd 1 hr algorithm.RegisterIndicator(self.symbol, self.MACD_hour, self.fiveMinutesConsolidator) self.MACD_hour.Updated +=self.MACD_hour_Updated #create function for this ## Register BB 4hr algorithm.RegisterIndicator(self.symbol, self.BB_4HR, self.fiveMinutesConsolidator) self.BB_4HR.Updated +=self.BB_4Hr_Updated #create function for this def ScheduleRoutines(self): self.Schedule.On(self.DateRules.EveryDay(self.symbol),\ self.TimeRules.At(9, 0), Action(self._sessionOn)) self.Schedule.On(self.DateRules.EveryDay(self.symbol),\ self.TimeRules.At(23, 0), Action(self._sessionOff)) def Indicators_Ready(self): return ( self.window_hr.IsReady and \ self.windowmin.IsReady and \ self.window_4hr.IsReady and \ self.BB_Min_Win.IsReady and \ self.BB_4Hr_Win.IsReady and \ self._macdWin.IsReady and \ self._macdWin2.IsReady and \ self.historyADXindicator.IsReady) def BuyDetected(self): bbUpperBand_5Min = self.BB_min.UpperBand.Current.Value bbLowerBand_5Min = self.BB_min.LowerBand.Current.Value bbUpperBand_Hour = self.BB_HR.UpperBand.Current.Value bbLowerBand_Hour = self.BB_HR.LowerBand.Current.Value bbUpperBand_4H = self.BB_4HR.UpperBand.Current.Value bbLowerBand_4H = self.BB_4HR.LowerBand.Current.Value MACD_5min = self.MACD_min.LowerBand.Current.Value MACD_hour = self.MACD_hour.LowerBand.Current.Value self.diplus = self.ADX_hr.PositiveDirectionalIndex.Current.Value self.diminus = self.ADX_hr.NegativeDirectionalIndex.Current.Value self.adx = self.ADX_hr.Current.Value # ---------------------------------------------------- if self.fxClose_4hr >= bbUpperBand_4H or fxClose_hr >= bbUpperBand_Hour: if self.diplus > self.ADXtresh and self.fxClose00 >= bbLowerBand_5Min: return True else: return False def SellDetected(self): bbUpperBand_5Min = self.BB_min.UpperBand.Current.Value bbLowerBand_5Min = self.BB_min.LowerBand.Current.Value bbUpperBand_Hour = self.BB_HR.UpperBand.Current.Value bbLowerBand_Hour = self.BB_HR.LowerBand.Current.Value bbUpperBand_4H = self.BB_4HR.UpperBand.Current.Value bbLowerBand_4H = self.BB_4HR.LowerBand.Current.Value MACD_5min = self.MACD_min.LowerBand.Current.Value MACD_hour = self.MACD_hour.LowerBand.Current.Value self.diplus = self.ADX_hr.PositiveDirectionalIndex.Current.Value self.diminus = self.ADX_hr.NegativeDirectionalIndex.Current.Value self.adx = self.ADX_hr.Current.Value if self.fxClose_4hr <= bbLowerBand_4H or fxClose_hr <= bbLowerBand_Hour: if self.diminus > self.ADXtresh and self.fxClose00 <= bbUpperBand_5Min: return True else: return False # ============================================================================ # Logic to open new positions. Called whenever we want to open a new position. # ============================================================================ def OpenNewBuyPositions(self): self.SetHoldings(self.symbol, 0.25) # 1 means 100% #self.SetInitialStops() def OpenNewSellPositions(self): self.SetHoldings(self.symbol, -0.25) #self.SetInitialStopsSells() def OnData(self, data): self.Indicators_Ready() if not data.Bars.ContainsKey(self.symbol) or data[self.symbol] is None: self.Debug('ccccccccccccccccc') return ''''if data.ContainsKey(self.symbol) and data[self.symbol] is not None: self.Debug('dddddddddddddddddddddddd') #self.closeWindows[symbol].Add(data[symbol].Close) self.window_hr[self.symbol].Add(data[self.symbol].Close) self.windowmin[self.symbol].Add(data[self.symbol].Close) self.window_4hr[self.symbol].Add(data[self.symbol].Close) self.Debug('eeeeeeeeeeeeeeeeeeeeeeeee') self.fxClose_hr=self.window_hr[0].Close # price in four hour self.fxClose00=self.windowmin[0].Close #Price in 5min self.fxClose_4hr=self.window_4hr[0].Close # price in four hour''' if not self.Portfolio.Invested and self._session(): if self.BuyEntrySignalDetected(): self.OpenNewBuyPositions() elif self.SellEntrySignalDetected(): self.OpenNewSellPositions() def _sessionOn(self): self._session = True def _sessionOff(self): self._session = False