Overall Statistics
class QuantumTransdimensionalReplicator(QCAlgorithm):
    stopMarketTicket = None 
    highestEURUSDPrice = 0
    
    def Initialize(self):
        self.SetStartDate(2018,7, 30)  # Set Start Date
        self.SetEndDate(2020,12, 31) #Set End Date
        self.SetCash(5000)  # Set Strategy Cash
        # self.private Identity _prevClose;
    

        self.AddForex("EURUSD", Resolution.Minute,Market.FXCM)
        self.Consolidate("EURUSD",timedelta(minutes=15), self.fifeteenminutebar)
        self.Rsi_in = self.RSI("EURUSD", 14, MovingAverageType.Simple)
        self.Window = RollingWindow[QuoteBar](2)
       
       
        self.SetWarmUp(timedelta(20))
        



    def OnData(self, data):

        
        #Add security
        self.Window.Add(data["EURUSD"])
    
        self.Plot("Levels", "Asset Price", self.Securities["EURUSD"].Price)
        
        if not (self.Rsi_in.IsReady and self.Window.IsReady):
            return
        currBar = self.Window[0]
        pastBar = self.Window[1]
        self.Log("Price: {0} -> {1} ... {2} -> {3}".format(pastBar.Time, pastBar.Close, currBar.Time, currBar.Close))

            
        if self.Rsi_in.Current.Value < 20 and self.Portfolio["EURUSD"].Invested <= 0 and currBar.Value > pastBar.Value:
            self.Debug("RSI is less then 20")
            self.MarketOrder("EURUSD", 5000)
            self.stopMarketTicket = self.StopMarketOrder("EURUSD", -5000, 0.9 * self.Securities["EURUSD"].Close)
            
        else:
            self.Plot("Levels", "Stop Price",  self.Securities["EURUSD"].Price * 0.9)
            
            if self.Securities["EURUSD"].Close > self.highestEURUSDPrice: 
                self.highestEURUSDPrice = self.Securities["EURUSD"].Close
                
                updateFields = UpdateOrderFields()
                updateFields.StopPrice = self.highestEURUSDPrice * 0.9
                self.stopMarketTicket.Update(updateFields)
            
                
                
            
    def OnOrderEvent(self, orderEvent):
        if orderEvent.Status != OrderStatus.Filled:
            return
        if self.stopMarketTicket is not None and self.stopMarketTicket.OrderId == orderEvent.OrderId: 
            self.stopMarketOrderFillTime = self.Time


        
    def fifeteenminutebar(self, bar):
        pass
from QuantConnect import *
from Selection.ManualUniverseSelectionModel import ManualUniverseSelectionModel

class G10CurrencySelectionModel(ManualUniverseSelectionModel):
    def __init__(self):
        super().__init__([Symbol.Create(x, SecurityType.Forex, Market.Oanda) for x in [ "EURUSD", "GBPUSD", "USDJPY", "AUDUSD", "NZDUSD","USDCAD", "USDCHF", "USDNOK", "USDSEK"]])