Overall Statistics
Total Trades
1539
Average Win
0.71%
Average Loss
-1.13%
Compounding Annual Return
-14.626%
Drawdown
52.500%
Expectancy
-0.001
Net Profit
-21.827%
Sharpe Ratio
-0.117
Probabilistic Sharpe Ratio
6.104%
Loss Rate
39%
Win Rate
61%
Profit-Loss Ratio
0.63
Alpha
-0.027
Beta
-0.099
Annual Standard Deviation
0.403
Annual Variance
0.162
Information Ratio
-0.508
Tracking Error
0.486
Treynor Ratio
0.476
Total Fees
$0.00
class DynamicUncoupledPrism(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2019, 1, 1)  # Set Start Date
        self.SetCash(1500)  # Set Strategy Cash
        self.symbol = "EURUSD"
        
        # Add forex and set brokerage model
        self.AddForex(self.symbol, Resolution.Minute, Market.Oanda, True, 50)
        self.SetBrokerageModel(BrokerageName.OandaBrokerage) 
        
        # Setup indicators
        self.rsi = RelativeStrengthIndex(6, MovingAverageType.Simple)
        
        # Setup bar consolidator
        thirtyMinuteConsolidator = QuoteBarConsolidator(timedelta(minutes=30))
        self.SubscriptionManager.AddConsolidator(self.symbol, thirtyMinuteConsolidator)
        self.RegisterIndicator(self.symbol, self.rsi, thirtyMinuteConsolidator)
        
        # Setup window
        self.rsiWindow = RollingWindow[float](5)


    def OnData(self, data):
        self.rsiWindow.Add(self.rsi.Current.Value)
        
        # Wait for rsi
        if not self.rsi.IsReady:
            return
        
        # Define the signals
        should_buy = self.rsi.Current.Value < 30 and self.rsiWindow[1] > 30
        should_short = self.rsi.Current.Value > 70 and self.rsiWindow[1] < 70
        
        is_long = self.Portfolio[self.symbol].IsShort == False
        is_short = self.Portfolio[self.symbol].IsShort
        is_invested = self.Portfolio[self.symbol].Invested
        
        if is_invested == False:
            if should_buy:
                self.MarketOrder(self.symbol, 10000)
            if should_short:
                self.MarketOrder(self.symbol, -10000)
        else:
            if should_buy and is_short:
                self.MarketOrder(self.symbol, 20000)
            if should_short and is_long:
                self.MarketOrder(self.symbol, -20000)
            
        # self.Debug("IS_INVESTED: " + str(is_invested))
        # self.Debug("IS_LONG: " + str(is_long))
        # self.Debug("IS_SHORT: " + str(is_short))
        # self.Debug("SHOULD LONG: " + str(should_buy))
        # self.Debug("SHOULD EXIT LONG: " + str(should_exit_buy))
        # self.Debug("SHOULD SHORT: " + str(should_sell))
        # self.Debug("SHOULD EXIT SHORT: " + str(should_exit_sell))
        # self.Debug(data.Bars[self.symbol].EndTime)
        # self.Debug("OPEN: " + str(data.Bars[self.symbol].Open))
        # self.Debug("HIGH: " + str(data.Bars[self.symbol].High))
        # self.Debug("LOW: " + str(data.Bars[self.symbol].Low))
        # self.Debug("CLOSE: " + str(data.Bars[self.symbol].Close))