Overall Statistics |
Total Trades 61 Average Win 1.50% Average Loss -1.21% Compounding Annual Return 3.261% Drawdown 13.800% Expectancy 0.301 Net Profit 8.356% Sharpe Ratio 0.463 Probabilistic Sharpe Ratio 14.547% Loss Rate 42% Win Rate 58% Profit-Loss Ratio 1.24 Alpha 0.025 Beta 0.043 Annual Standard Deviation 0.051 Annual Variance 0.003 Information Ratio 0.552 Tracking Error 0.076 Treynor Ratio 0.547 Total Fees $0.00 Estimated Strategy Capacity $380000.00 Lowest Capacity Asset USDJPY 8G |
# region imports from AlgorithmImports import * # endregion class CustomIndexStrategy(QCAlgorithm): def Initialize(self): self.Pair_1 = "USDJPY" self.holdingDays = 1 self.SetStartDate (2020, 1, 1) self.SetEndDate(2022,7,1) self.SetCash(10000) self.SetBrokerageModel(BrokerageName.OandaBrokerage) self.EURSEK = self.AddForex(self.Pair_1, Resolution.Daily, Market.Oanda) self.symbols = [self.Pair_1] self.prevPrices = { symbol : RollingWindow[QuoteBar](7) for symbol in self.symbols } self.ticketPair1 = None self.ticketPair2 = None self.maximumholdingdays = 4 self.pas = False self.volume = 2 self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday, DayOfWeek.Friday), self.TimeRules.At(12, 0), self.MondayTrade) def OnData(self,data): self.quantity_1 = self.CalculateOrderQuantity(self.Pair_1 , self.volume) for symbol in self.symbols: if data.ContainsKey(symbol): self.prevPrices[symbol].Add( data[symbol] ) if not all([ window.IsReady for window in self.prevPrices.values() ]): return self.pas = True Pair1_window = self.prevPrices[self.Pair_1] self.Pair1_6D = Pair1_window[6].Close self.Pair1_5D = Pair1_window[5].Close self.Pair1_4D = Pair1_window[4].Close self.Pair1_3D = Pair1_window[3].Close self.Pair1_2D = Pair1_window[2].Close self.Pair1_1D = Pair1_window[1].Close self.Pair1_0D = Pair1_window[0].Close if self.ticketPair2 is not None and self.Securities[self.Pair_1].Exchange.ExchangeOpen is True and self.UtcTime >= self.ticketPair2.Time + timedelta(days = self.maximumholdingdays): self.Liquidate() self.ticketPair2 = None if self.ticketPair1 is not None and self.Securities[self.Pair_1].Exchange.ExchangeOpen is True and self.UtcTime >= self.ticketPair1.Time + timedelta(days = self.maximumholdingdays): self.Liquidate() self.ticketPair1 = None def MondayTrade(self): if self.pas is False: return if self.ticketPair2 is None and self.Securities[self.Pair_1].Exchange.ExchangeOpen is True and self.Pair1_0D < self.Pair1_1D < self.Pair1_2D < self.Pair1_3D < self.Pair1_4D : self.ticketPair2 = self.MarketOrder(self.Pair_1, self.quantity_1 ) self.priceLong= self.ticketPair2.AverageFillPrice self.Log(self.priceLong) if self.ticketPair1 is None and self.Securities[self.Pair_1].Exchange.ExchangeOpen is True and self.Pair1_0D > self.Pair1_1D > self.Pair1_2D > self.Pair1_3D > self.Pair1_4D : self.ticketPair1 = self.MarketOrder(self.Pair_1, -self.quantity_1) self.priceShort = self.ticketPair1.AverageFillPrice self.Log(self.priceShort)