Overall Statistics
Total Trades
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
-50.556%
Drawdown
38.400%
Expectancy
0
Net Profit
-5.442%
Sharpe Ratio
0.021
Probabilistic Sharpe Ratio
37.432%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
1.033
Annual Variance
1.068
Information Ratio
0.021
Tracking Error
1.033
Treynor Ratio
0
Total Fees
BUSD0.10
Estimated Strategy Capacity
BUSD79000.00
Lowest Capacity Asset
MATICBUSD 18N
# region imports
from AlgorithmImports import *
from datetime import datetime, timedelta
# endregion


class SquareYellowGreenAnguilline(QCAlgorithm):

    fast_lookback = 9
    slow_lookback = 25
    rsi_lookback = 14

    def Initialize(self):
        self.SetStartDate(2022, 2, 1)  # Set Start Date
        self.SetEndDate(2022, 3, 1)

        self.SetAccountCurrency('BUSD') #set account currency
        self.SetCash(100)  # Set Strategy Cash
        self.SetBenchmark('BTCBUSD')
    
        self.crypto_currency = self.AddCrypto('MATICBUSD', Resolution.Hour, market=Market.Binance)
        self.SetBrokerageModel(BrokerageName.Binance, AccountType.Margin)

        #create a 4hr consolidator event
        fourHourConsolidator = TradeBarConsolidator(timedelta(hours=4))

        #attach to event handler
        fourHourConsolidator.DataConsolidated += self.fourHourHandler

        # this call adds our 30-minute consolidator to
        # the manager to receive updates from the engine
        self.SubscriptionManager.AddConsolidator(self.crypto_currency.Symbol, fourHourConsolidator)


        #register indicators
        self.fast_indicator = self.EMA(self.crypto_currency.Symbol, self.fast_lookback, Resolution.Hour)
        self.slow_indicator = self.EMA(self.crypto_currency.Symbol, self.slow_lookback, Resolution.Hour)
        self.rsi = self.RSI(self.crypto_currency.Symbol, self.rsi_lookback, MovingAverageType.Wilders, Resolution.Hour)

        #warmup indicators
        self.SetWarmup(self.fast_lookback, Resolution.Hour)
    
    def fourHourHandler(self, sender, bar):
        pass

    def OnData(self, data: Slice):
        self.Log(f'{data.Time}')
        if self.IsWarmingUp:
            return

        if not self.fast_indicator.IsReady and not self.slow_indicator.IsReady and self.rsi.IsReady:
            return

        if (self.slow_indicator.Current.Value > self.fast_indicator.Current.Value) and self.rsi.Current.Value >=60:
            #check for signal
            if not self.Portfolio[self.crypto_currency.Symbol].IsLong:
                self.Liquidate()
                self.SetHoldings(self.crypto_currency.Symbol, 1, tag='Long Position')

        elif (self.slow_indicator.Current.Value < self.fast_indicator.Current.Value) and self.rsi.Current.Value <=40:
            if not self.Portfolio[self.crypto_currency.Symbol].IsShort:
                self.Liquidate()
                self.SetHoldings(self.crypto_currency.Symbol, -1, tag='Short Position')

        #charts
        self.Plot('Benchmark', 'Price', self.Securities[self.crypto_currency.Symbol].Price)
        self.Plot('Benchmark', 'FastEMA', self.fast_indicator.Current.Value)
        self.Plot('Benchmark', 'ShortEMA', self.slow_indicator.Current.Value)
        self.Plot('rsi', 'RSI', self.rsi.Current.Value)