Overall Statistics |
Total Trades 10 Average Win 4.72% Average Loss -1.38% Compounding Annual Return 14.719% Drawdown 11.500% Expectancy 1.211 Net Profit 14.662% Sharpe Ratio 0.692 Probabilistic Sharpe Ratio 33.730% Loss Rate 50% Win Rate 50% Profit-Loss Ratio 3.42 Alpha 0.094 Beta -0.184 Annual Standard Deviation 0.166 Annual Variance 0.028 Information Ratio 0.787 Tracking Error 0.288 Treynor Ratio -0.622 Total Fees $10.00 Estimated Strategy Capacity $170000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X Portfolio Turnover 4.48% |
from AlgorithmImports import * class EmaCrossoverAlgo(QCAlgorithm): def Initialize(self): self.SetStartDate(2022, 1, 1) # start date 01.01.2022 self.SetEndDate(2022, 12, 31) # end date 31.12.2022 self.SetCash(10_000) # trading capital 10.000 $ self.stopLoss = -300 # stop loss at 3% of trading capital self.Ticker = "SPY" # SPDR S&P 500 ETF Trust self.Symbol = self.AddEquity(self.Ticker, Resolution.Hour).Symbol self.EMA_Fast = self.EMA(self.Symbol,50,Resolution.Hour) # EMA Indicator (fast) self.EMA_Slow = self.EMA(self.Symbol,100,Resolution.Hour) # EMA Indicator (slow) self.Tolerance = 0.0015 # cross-over tolerance 0,15 % # get buy&hold param self.BuyAndHoldParam = False self.BuyAndHoldParam = self.GetParameter("Buy_and_Hold", "False") == "True" def OnData(self, data): # return if indicators aren't ready if not self.EMA_Slow.IsReady or not self.EMA_Fast: return if self.BuyAndHoldParam: # buy and hold mode if not self.Portfolio.Invested: # one-time buy if not invested self.SetHoldings(self.Symbol, 1) return else: # make trades holdings = self.Portfolio[self.Symbol].Quantity if holdings <= 0: # go long (buy) if fast EMA-Indicator crosses above slow one if self.EMA_Fast.Current.Value > self.EMA_Slow.Current.Value * ( 1 + self.Tolerance): self.Debug(f"BUY >> {self.Securities[self.Symbol].Price}") self.SetHoldings(self.Symbol, 1) else: # go short (sell) if fast EMA-Indicator crosses below slow one if self.EMA_Fast < self.EMA_Slow: self.Debug(f"SELL >> {self.Securities[self.Symbol].Price}") self.SetHoldings(self.Symbol, -1) # Risk management: # liquidate open position if unrealized profit is greater then Stop-Loss value if self.Portfolio[self.Symbol].UnrealizedProfit <= self.stopLoss: self.Debug(f"Stop loss at {self.Securities[self.Symbol].Price}") self.Liquidate()