| Overall Statistics |
|
Total Trades 6 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 $6.00 Estimated Strategy Capacity $2200000.00 Lowest Capacity Asset UPST XKEDQOEEEPUT |
# Ten Minutes EMA Portfolio
from AlgorithmImports import *
STOCKS = ["TSLA", "MSFT", "ADSK", "UPST" ]; EMA_5 = 5; EMA_13 = 13; BAR = 10;
class TenMinutesEmaPortfolio(QCAlgorithm):
def Initialize(self):
self.SetCash(25000)
self.SetStartDate(2022, 6, 17)
self.SetEndDate(2022, 6, 17)
res = Resolution.Minute
self.ema_5 = {}; self.ema_13 = {}
self.stocks = [self.AddEquity(ticker, res).Symbol for ticker in STOCKS]
for sec in self.stocks:
Consolidator = TradeBarConsolidator(timedelta(minutes = BAR))
Consolidator.DataConsolidated += self.BarHandler
self.SubscriptionManager.AddConsolidator(sec, Consolidator)
self.ema_5[sec] = ExponentialMovingAverage(EMA_5)
self.ema_13[sec] = ExponentialMovingAverage(EMA_13)
self.RegisterIndicator(sec, self.ema_5[sec], Consolidator)
self.RegisterIndicator(sec, self.ema_13[sec], Consolidator)
self.consolidated = False
self.SetWarmUp(5*BAR*EMA_13, res)
def BarHandler(self, sender, consolidated):
if not (self.Time.hour >= 10 and self.Time.hour < 16 ): return
if self.IsWarmingUp: return
self.consolidated = True
for sec in self.stocks:
if not (self.ema_5[sec].IsReady and self.ema_13[sec].IsReady): continue
ema_5 = self.ema_5[sec].Current.Value
ema_13 = self.ema_13[sec].Current.Value
self.Plot(sec, "ema_5", ema_5)
self.Plot(sec, "ema_13", ema_13)
if not self.Portfolio[sec].Invested:
if ema_5 >= ema_13*1.001:
self.SetHoldings(sec, 1/len(self.stocks), False, "EMA 5 above EMA 13")
elif self.Portfolio[sec].Invested:
if ema_5 < ema_13*0.999:
self.Liquidate(sec, "EMA 5 under EMA 13")
else: continue