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)