Overall Statistics
Total Trades
145
Average Win
8.60%
Average Loss
-3.89%
Compounding Annual Return
300.415%
Drawdown
49.200%
Expectancy
0.440
Net Profit
181.900%
Sharpe Ratio
3.281
Probabilistic Sharpe Ratio
68.336%
Loss Rate
55%
Win Rate
45%
Profit-Loss Ratio
2.21
Alpha
3.255
Beta
-0.3
Annual Standard Deviation
1.002
Annual Variance
1.005
Information Ratio
3.282
Tracking Error
1.036
Treynor Ratio
-10.975
Total Fees
$324.29
Estimated Strategy Capacity
$1100000.00
Lowest Capacity Asset
TYH U8JOSZGR4OKL
#region imports
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Globalization;
    using System.Drawing;
    using QuantConnect;
    using QuantConnect.Algorithm.Framework;
    using QuantConnect.Algorithm.Framework.Selection;
    using QuantConnect.Algorithm.Framework.Alphas;
    using QuantConnect.Algorithm.Framework.Portfolio;
    using QuantConnect.Algorithm.Framework.Execution;
    using QuantConnect.Algorithm.Framework.Risk;
    using QuantConnect.Parameters;
    using QuantConnect.Benchmarks;
    using QuantConnect.Brokerages;
    using QuantConnect.Util;
    using QuantConnect.Interfaces;
    using QuantConnect.Algorithm;
    using QuantConnect.Indicators;
    using QuantConnect.Data;
    using QuantConnect.Data.Consolidators;
    using QuantConnect.Data.Custom;
    using QuantConnect.DataSource;
    using QuantConnect.Data.Fundamental;
    using QuantConnect.Data.Market;
    using QuantConnect.Data.UniverseSelection;
    using QuantConnect.Notifications;
    using QuantConnect.Orders;
    using QuantConnect.Orders.Fees;
    using QuantConnect.Orders.Fills;
    using QuantConnect.Orders.Slippage;
    using QuantConnect.Scheduling;
    using QuantConnect.Securities;
    using QuantConnect.Securities.Equity;
    using QuantConnect.Securities.Future;
    using QuantConnect.Securities.Option;
    using QuantConnect.Securities.Forex;
    using QuantConnect.Securities.Crypto;
    using QuantConnect.Securities.Interfaces;
    using QuantConnect.Storage;
    using QuantConnect.Data.Custom.AlphaStreams;
    using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm;
    using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm;
#endregion

namespace QuantConnect
{
    using ComposerQC;
    using ComposerQC.DateRules;

    public class BetaBallerV1Strategy : CalendarStrategy
    {
        public override IEnumerable<int> Periods => new[] { 7 };

        public override IEnumerable<string> Tickers => new string[] 
        {
            "BIL", "IEF", "SOXL", "SOXS"
        };

        public BetaBallerV1Strategy(ComposerQCAlgorithm algorithm) : base(algorithm)
        {
            this.EvaluationDateRule = new DailyDateRule(algorithm);
            this.SetBacktestStartDate(2022, 1, 1);
        }

        public override List<PortfolioTarget> Evaluate()
        {
            if (SymbolData["BIL"].RSI(7) > SymbolData["IEF"].RSI(7))
            {
                return EqualWeight(new[] { "SOXS" });
            }
            else
            {
                return EqualWeight(new[] { "SOXL" });
            }
        }
    }
}
#region imports
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Globalization;
    using System.Drawing;
    using QuantConnect;
    using QuantConnect.Algorithm.Framework;
    using QuantConnect.Algorithm.Framework.Selection;
    using QuantConnect.Algorithm.Framework.Alphas;
    using QuantConnect.Algorithm.Framework.Portfolio;
    using QuantConnect.Algorithm.Framework.Execution;
    using QuantConnect.Algorithm.Framework.Risk;
    using QuantConnect.Parameters;
    using QuantConnect.Benchmarks;
    using QuantConnect.Brokerages;
    using QuantConnect.Util;
    using QuantConnect.Interfaces;
    using QuantConnect.Algorithm;
    using QuantConnect.Indicators;
    using QuantConnect.Data;
    using QuantConnect.Data.Consolidators;
    using QuantConnect.Data.Custom;
    using QuantConnect.DataSource;
    using QuantConnect.Data.Fundamental;
    using QuantConnect.Data.Market;
    using QuantConnect.Data.UniverseSelection;
    using QuantConnect.Notifications;
    using QuantConnect.Orders;
    using QuantConnect.Orders.Fees;
    using QuantConnect.Orders.Fills;
    using QuantConnect.Orders.Slippage;
    using QuantConnect.Scheduling;
    using QuantConnect.Securities;
    using QuantConnect.Securities.Equity;
    using QuantConnect.Securities.Future;
    using QuantConnect.Securities.Option;
    using QuantConnect.Securities.Forex;
    using QuantConnect.Securities.Crypto;
    using QuantConnect.Securities.Interfaces;
    using QuantConnect.Storage;
    using QuantConnect.Data.Custom.AlphaStreams;
    using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm;
    using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm;
#endregion

namespace QuantConnect
{
    using ComposerQC;
    using ComposerQC.DateRules;

    public class CommanderBndStrategy : CalendarStrategy
    {
        public override IEnumerable<int> Periods => new[] { 10, 20, 60 };

        public override IEnumerable<string> Tickers => new string[] 
        {
            "BND", "BIL", "TECL", "TQQQ", "UPRO", "TMF", "TLT", "UUP", "QID", "TBF", "UGL", "BTAL", "XLP"
        };

        public CommanderBndStrategy(ComposerQCAlgorithm algorithm) : base(algorithm)
        {
            this.EvaluationDateRule = new QuarterlyDateRule(algorithm);
            this.SetBacktestStartDate(2011, 9, 14);
        }

        public override List<PortfolioTarget> Evaluate()
        {
            if (SymbolData["BND"].CumulativeReturn(60) > SymbolData["BIL"].CumulativeReturn(60))
            {
                // Risk ON - select lowest 3 RSI
                var equities = 
                    Filter(new[] { "TECL", "TQQQ", "UPRO", "TMF" },
                           FilterBy.RSI, 10,
                           Select.Bottom, 3);

                return EqualWeight(equities);
            }
            else
            {
                if (SymbolData["TLT"].CumulativeReturn(20) < SymbolData["BIL"].CumulativeReturn(20))
                {
                    // Risk OFF, Rising Rates - UUP at 50%, select lowest RSI
                    var equities =
                        Filter(new[] { "QID", "TBF" },
                               FilterBy.RSI, 20,
                               Select.Bottom, 1);
                    
                    equities.Add("UUP");

                    return EqualWeight(equities);
                }
                else
                {
                    // Risk OFF, Falling Rates
                    var equities = new[] { "UGL", "TMF", "BTAL", "XLP" };
                    return EqualWeight(equities);
                }
            }
        }
    }
}
#region imports
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Globalization;
    using System.Drawing;
    using QuantConnect;
    using QuantConnect.Algorithm.Framework;
    using QuantConnect.Algorithm.Framework.Selection;
    using QuantConnect.Algorithm.Framework.Alphas;
    using QuantConnect.Algorithm.Framework.Portfolio;
    using QuantConnect.Algorithm.Framework.Execution;
    using QuantConnect.Algorithm.Framework.Risk;
    using QuantConnect.Parameters;
    using QuantConnect.Benchmarks;
    using QuantConnect.Brokerages;
    using QuantConnect.Util;
    using QuantConnect.Interfaces;
    using QuantConnect.Algorithm;
    using QuantConnect.Indicators;
    using QuantConnect.Data;
    using QuantConnect.Data.Consolidators;
    using QuantConnect.Data.Custom;
    using QuantConnect.DataSource;
    using QuantConnect.Data.Fundamental;
    using QuantConnect.Data.Market;
    using QuantConnect.Data.UniverseSelection;
    using QuantConnect.Notifications;
    using QuantConnect.Orders;
    using QuantConnect.Orders.Fees;
    using QuantConnect.Orders.Fills;
    using QuantConnect.Orders.Slippage;
    using QuantConnect.Scheduling;
    using QuantConnect.Securities;
    using QuantConnect.Securities.Equity;
    using QuantConnect.Securities.Future;
    using QuantConnect.Securities.Option;
    using QuantConnect.Securities.Forex;
    using QuantConnect.Securities.Crypto;   
    using QuantConnect.Securities.Interfaces;
    using QuantConnect.Storage;
    using QuantConnect.Data.Custom.AlphaStreams;
    using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm;
    using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm;
#endregion

namespace QuantConnect.Algorithm.CSharp
{
    using ComposerQC;
    using ComposerQC.Model;

    public class CreativeFluorescentPinkWhale : ComposerQCAlgorithm
    {
        public override IStrategy SetupStrategy() => new MinimumBBStrategy(this);
    }
}
#region imports
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Globalization;
    using System.Drawing;
    using QuantConnect;
    using QuantConnect.Algorithm.Framework;
    using QuantConnect.Algorithm.Framework.Selection;
    using QuantConnect.Algorithm.Framework.Alphas;
    using QuantConnect.Algorithm.Framework.Portfolio;
    using QuantConnect.Algorithm.Framework.Execution;
    using QuantConnect.Algorithm.Framework.Risk;
    using QuantConnect.Parameters;
    using QuantConnect.Benchmarks;
    using QuantConnect.Brokerages;
    using QuantConnect.Util;
    using QuantConnect.Interfaces;
    using QuantConnect.Algorithm;
    using QuantConnect.Indicators;
    using QuantConnect.Data;
    using QuantConnect.Data.Consolidators;
    using QuantConnect.Data.Custom;
    using QuantConnect.DataSource;
    using QuantConnect.Data.Fundamental;
    using QuantConnect.Data.Market;
    using QuantConnect.Data.UniverseSelection;
    using QuantConnect.Notifications;
    using QuantConnect.Orders;
    using QuantConnect.Orders.Fees;
    using QuantConnect.Orders.Fills;
    using QuantConnect.Orders.Slippage;
    using QuantConnect.Scheduling;
    using QuantConnect.Securities;
    using QuantConnect.Securities.Equity;
    using QuantConnect.Securities.Future;
    using QuantConnect.Securities.Option;
    using QuantConnect.Securities.Forex;
    using QuantConnect.Securities.Crypto;
    using QuantConnect.Securities.Interfaces;
    using QuantConnect.Storage;
    using QuantConnect.Data.Custom.AlphaStreams;
    using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm;
    using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm;
#endregion

namespace QuantConnect
{
    using ComposerQC;
    using ComposerQC.DateRules;

    public class MinimumBBStrategy : CalendarStrategy
    {
        public override IEnumerable<int> Periods => new[] { 5, 6, 7, 10, 13 };

        public override IEnumerable<string> Tickers => new string[] 
        {
            "BIL", "IEF", "SPY", "UVXY", "VIXY", "SOXL", "SHY", "HIBL", "SOXS", "SQQQ", "TECL"
        };

        public MinimumBBStrategy(ComposerQCAlgorithm algorithm) : base(algorithm)
        {
            this.EvaluationDateRule = new DailyDateRule(algorithm);
            this.SetBacktestStartDate(2022, 2, 11);
        }

        public override List<PortfolioTarget> Evaluate()
        {
            if (SymbolData["BIL"].RSI(5) < SymbolData["IEF"].RSI(7))
            {
                if (SymbolData["SPY"].RSI(6) > 75m)
                {
                    var ticker = Filter(new[] { "UVXY", "VIXY" },
                                        FilterBy.RSI, 13,
                                        Select.Bottom, 1);
                    
                    return EqualWeight(ticker);
                }
                else
                {
                    return EqualWeight(new[] { "SOXL" });
                }
            }
            else
            {
                // Extremely oversold S&P (low RSI). Double check with bond mkt before going long
                if (SymbolData["SHY"].RSI(10) < SymbolData["HIBL"].RSI(10))
                {
                    var ticker = Filter(new[] { "SOXS", "SQQQ" },
                                        FilterBy.RSI, 7,
                                        Select.Bottom, 1);
                    
                    return EqualWeight(ticker);
                }
                else
                {
                    var ticker = Filter(new[] { "SOXL", "TECL" },
                                        FilterBy.RSI, 7,
                                        Select.Bottom, 1);
                    
                    return EqualWeight(ticker);
                }
            }
        }
    }
}