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")