Overall Statistics |
Total Trades 21 Average Win 4.95% Average Loss -13.79% Compounding Annual Return -15.026% Drawdown 44.900% Expectancy -0.185 Net Profit -28.691% Sharpe Ratio -0.241 Probabilistic Sharpe Ratio 1.475% Loss Rate 40% Win Rate 60% Profit-Loss Ratio 0.36 Alpha -0.066 Beta -0.146 Annual Standard Deviation 0.286 Annual Variance 0.082 Information Ratio -0.304 Tracking Error 0.292 Treynor Ratio 0.471 Total Fees $0.00 |
import pandas as pd from datetime import timedelta, datetime from System.Drawing import Color class InsideDayBreakout(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 1, 1) # Set Start Date self.SetCash(1000) # Set Strategy Cash self.AddForex("USDJPY", Resolution.Daily,Market.Oanda) self.SetBrokerageModel(BrokerageName.OandaBrokerage, AccountType.Margin) self.SetTimeZone(TimeZones.Utc) self.SetWarmUp(3) self.riskPercentage = 7 self.lastOrderEvent = None self.insideDay = False self.window = RollingWindow[QuoteBar](3) self.buyTicket = None self.sellTicket = None pricePlot = Chart('Chart Data') pricePlot.AddSeries(Series('Open',SeriesType.Candle,0)) pricePlot.AddSeries(Series('High',SeriesType.Candle,0)) pricePlot.AddSeries(Series('Low',SeriesType.Candle,0)) pricePlot.AddSeries(Series('Close',SeriesType.Candle,0)) self.AddChart(pricePlot) def OnData(self, data): if data.ContainsKey("USDJPY"): self.window.Add(data["USDJPY"]) self.Plot('Chart Data', 'Open',data.QuoteBars["USDJPY"].Open) self.Plot('Chart Data', 'High', data.QuoteBars["USDJPY"].High) self.Plot('Chart Data', 'Low', data.QuoteBars["USDJPY"].Low) self.Plot('Chart Data', 'Close', data.QuoteBars["USDJPY"].Close) if not self.window.IsReady: return self.todaysHigh = self.window[0].High self.todaysLow = self.window[0].Low self.yesterdaysHigh = self.window[1].High self.yesterdaysLow = self.window[1].Low if (self.todaysHigh < self.yesterdaysHigh and self.todaysLow > self.yesterdaysLow and self.Time.weekday() != 6): self.insideDay = True self.Log("Inside Day") if self.insideDay == True: self.buyPrice = round(self.todaysHigh,3) self.sellPrice = round(self.todaysLow,3) self.hlRange = round(self.todaysHigh - self.todaysLow,3) self.Quantity = (self.riskPercentage / 100 * self.Portfolio.Cash * self.window[0].Close) / self.hlRange #Placing buy orders if inside bar true and not Sunday if not self.Portfolio.Invested and self.insideDay == True: #place buyorders to open self.buyEntryTicket = self.StopMarketOrder("USDJPY", self.Quantity, self.buyPrice) self.sellEntryTicket = self.StopMarketOrder("USDJPY", -self.Quantity, self.sellPrice) #place first limit order self.firstBuyTarget = self.LimitOrder("USDJPY", -self.Quantity, self.buyPrice + self.hlRange) self.firstSellTarget = self.LimitOrder("USDJPY", self.Quantity, self.sellPrice - self.hlRange) #place second limit order #self.secondBuyTarget = self.LimitOrder("USDJPY", -self.remainingQuantity, self.buyPrice + 0.5 * self.hlRange) #self.secondSellTarget = self.LimitOrder("USDJPY", self.remainingQuantity, self.buyPrice - 0.5 * self.hlRange) #place stop order self.buyStopLoss = self.StopMarketOrder("USDJPY", -self.Quantity, self.sellPrice) self.sellStopLoss = self.StopMarketOrder("USDJPY", self.Quantity, self.buyPrice) #message oders placed self.Debug("Stop entry orders placed") #self.sellTicket = self.StopMarketOrder("USDJPY", - self.Quantity, self.sellPrice) def OnOrderEvent(self, orderEvent): if orderEvent.Status != OrderStatus.Filled: return #cancel sell limit oders if stop order hit if self.buyStopLoss.Status == OrderStatus.Filled: self.firstBuyTarget.Cancel #self.secondBuyTarget.Cancel self.Debug("long position stopped out, limit orders cancelled") #cancel sell stop orders if limit orders hit if self.firstBuyTarget.Status == OrderStatus.Filled: self.buyStopLoss.Cancel self.Debug("buy target reached, stop cancelled") #cancel buy limit oders if stop order hit if self.sellStopLoss.Status == OrderStatus.Filled: self.firstSellTarget.Cancel #self.secondBuyTarget.Cancel self.Debug("short position stopped out, limit orders cancelled") #cancel sell stop orders if limit orders hit if self.firstSellTarget.Status == OrderStatus.Filled: self.sellStopLoss.Cancel self.Debug("sell target reached, stop cancelled") #update quantity for second target and stop order #if self.firstBuyTarget.Status == OrderStatus.Filled: #updateSettings = UpdateOrderFields() #updateSettings.Quantity = self.Portfolio["USDJPY"].Quantity *-1 #self.buyStopLoss.Update(updateSettings) #self.secondBuyTarget.Update(updateSettings) #self.Debug("Order quantity updated") #if self.sellTicket.Status == OrderStatus.Filled: #self.profitTargetOne = self.sellPrice - 0.5 * self.hlRange #self.profitTargetTwo = self.sellPrice - self.hlRange #self.LimitOrder("USDJPY", 0.5 * self.Quantity, self.profitTargetOne) #self.LimitOrder("USDJPY", 0.5 * self.Quantity, self.profitTagetTwo) #self.StopMarketOrder("USDJPY", self.Quantity, self.buyPrice) #self.Debug("SX - Limit and stop order placed")