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.868 Tracking Error 0.112 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
#https://www.youtube.com/watch?v=_BHi5Y2Aow4 from collections import deque class SmoothBrownPanda(QCAlgorithm): def Initialize(self): self.SetTimeZone("America/Toronto") self.SetStartDate(2021, 9, 1) self.SetEndDate(2021, 12, 13) self.SetCash(100000) self.spy = self.AddEquity("MSFT", Resolution.Daily) self.spy.SetDataNormalizationMode(DataNormalizationMode.Raw) self.efi_raw = EFI() self.RegisterIndicator(self.spy.Symbol, self.efi_raw, Resolution.Daily) self.efi = IndicatorExtensions.EMA(self.efi_raw, 12) self.atr_ema = deque(maxlen=2) self.efi.Updated += self.EfiUpdated self.sig = IndicatorExtensions.EMA(self.efi_raw, 21) def EfiUpdated(self, sender, updated): if len(self.atr_ema) == 0: self.atr_ema.appendleft(abs(updated.Value)) else: self.atr_ema.appendleft(abs(updated.Value - self.atr_ema[0])) def OnData(self, data): if not self.efi.IsReady or not self.sig.IsReady: return atr_out = sum(self.atr_ema) / len(self.atr_ema) atr_high1 = self.sig.Current.Value + atr_out * 1 atr_low1 = self.sig.Current.Value - atr_out * 1 atr_high2= self.sig.Current.Value + atr_out * 2 atr_low2 = self.sig.Current.Value - atr_out * 2 atr_high3 = self.sig.Current.Value + atr_out * 3 atr_low3 = self.sig.Current.Value - atr_out * 3 self.Plot("EFI", "EFI", self.efi.Current.Value) self.Plot("EFI", "Signal", self.efi.Current.Value) self.Plot("EFI", "ATR", self.efi.Current.Value) self.Plot("EFI", "ATR High 1", atr_high1) self.Plot("EFI", "ATR Low 1", atr_high1) self.Plot("EFI", "ATR High 2", atr_high2) self.Plot("EFI", "ATR Low 2", atr_low2) self.Plot("EFI", "ATR High 3", atr_high3) self.Plot("EFI", "ATR Low 3", atr_low3) class EFI(PythonIndicator): def __init__(self): self.Time = datetime.min self.Value = 0 self.deque = deque(maxlen=2) def Update(self, input): self.Time = input.EndTime count = len(self.deque) if count >= 1: self.Value = (input.Close - self.deque[0]) * input.Volume self.deque.appendleft(input.Close) return (count == self.deque.maxlen)