Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
# True Range
from datetime import timedelta
from collections import deque

# ---------------------------
STOCK = 'AAPL'; BAR_SIZE = 3; 
# ---------------------------

class LogicalBrownKoala(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2022, 5, 3)
        self.SetEndDate(2022, 5, 3)
        self.SetCash(100000)
        self.stock = self.AddEquity(STOCK, Resolution.Minute).Symbol 

        Consolidator = TradeBarConsolidator(timedelta(minutes = BAR_SIZE))
        Consolidator.DataConsolidated += self.MinutesHandler
        self.true_range_qc = TrueRange()
        self.true_range_custom = True_Range("TrueRange", 2)
        self.RegisterIndicator(self.stock, self.true_range_qc, Consolidator)
        self.RegisterIndicator(self.stock, self.true_range_custom, Consolidator)
        self.SetWarmUp(2*BAR_SIZE, Resolution.Minute )


    def MinutesHandler(self, sender, bar):
        if self.IsWarmingUp: return

        self.Plot(self.stock, "true_range_qc", self.true_range_qc.Current.Value)
        self.Plot(self.stock, "true_range_custom", self.true_range_custom.Current.Value)  
        
            
class True_Range(PythonIndicator):

    def __init__(self, name, period):
        self.Name = name
        self.Value = None
        self.period = period
        self.WarmUpPeriod = period
        self.Time = datetime.min
        self.queue_close = deque(maxlen=period)
        self.queueTime = deque(maxlen=period)
    
    def Update(self, input):
        self.queue_close.appendleft(input.Close)
        self.queueTime.appendleft(input.EndTime)
        self.Time = input.EndTime
        count = len(self.queue_close)

        if self.queue_close[0] > input.High: 
            TH = self.queue_close[0]
        else:
            TH = input.High
        if self.queue_close[0] < input.Low: 
            TL = self.queue_close[0]
        else: 
            TL = input.Low
        self.Value = TH - TL

        self.IsReady == self.queue_close.maxlen
        return self.IsReady