Overall Statistics
Total Trades
1610
Average Win
0.15%
Average Loss
-0.25%
Compounding Annual Return
-19.712%
Drawdown
31.800%
Expectancy
0.048
Net Profit
-6.630%
Sharpe Ratio
-0.039
Probabilistic Sharpe Ratio
24.409%
Loss Rate
35%
Win Rate
65%
Profit-Loss Ratio
0.60
Alpha
0.016
Beta
1.006
Annual Standard Deviation
0.509
Annual Variance
0.259
Information Ratio
0.033
Tracking Error
0.462
Treynor Ratio
-0.02
Total Fees
$0.00
Estimated Strategy Capacity
$240000.00
Lowest Capacity Asset
BTCUSD XJ
from QuantConnect.Indicators import *
from AlgorithmImports import *


class BollingerMomentum(QCAlgorithm):

    def Initialize(self):

        self.SetStartDate(2022, 9, 1) 
        self.SetCash("BTC",100) 
        self.ticker="BTCUSD"
        self.symbol=self.AddCrypto(self.ticker, Resolution.Minute).Symbol
        self.per_order_proportion=0.5
        period_BB = 50
        std=2
       
        
        n_MinuteConsolidator = TradeBarConsolidator(timedelta(minutes=5))
        n_MinuteConsolidator.DataConsolidated += self.N_MinuteBarHandler
        self.SubscriptionManager.AddConsolidator(self.ticker, n_MinuteConsolidator)


        self.Bolband = self.BB(self.ticker, period_BB, std, MovingAverageType.Simple)
        self.RegisterIndicator(self.ticker, self.Bolband, timedelta(minutes=5))
        self.SetRiskManagement(MaximumDrawdownPercentPerSecurity(0.1))
        self.SetWarmUp(period_BB)
        
    def N_MinuteBarHandler(self, sender, bar):
        
        self.Debug(str(self.Time) + " " + str(bar))
        if self.IsWarmingUp != False:
            return
        
        holdings = self.Portfolio[self.ticker].Quantity
        price = self.Securities[self.ticker].Close
        quantity = self.CalculateOrderQuantity(self.ticker,self.per_order_proportion)
        
        if holdings <= 0:
            if price <= self.Bolband.LowerBand.Current.Value:
                self.MarketOrder(self.ticker, quantity*1)
        if holdings > 0:
            if price >= self.Bolband.UpperBand.Current.Value:
                self.LiquidateAll()

        
    def OnData(self, data):
        pass
                        
    def LiquidateAll(self):
        self.Liquidate()
        self.Transactions.CancelOpenOrders(self.ticker)