Created with Highcharts 12.1.2EquityJan 1Jan 15Jan 29Feb 12Feb 26Mar 11Mar 25Apr 8Apr 22May 6May 20Jun 31,800k2,000k2,200k-10-5001-1010500M1,000M025M50M202530
Overall Statistics
Total Orders
27
Average Win
0.78%
Average Loss
-0.97%
Compounding Annual Return
1.790%
Drawdown
6.200%
Expectancy
0.246
Start Equity
2000000
End Equity
2014891.58
Net Profit
0.745%
Sharpe Ratio
-0.502
Sortino Ratio
-0.715
Probabilistic Sharpe Ratio
26.633%
Loss Rate
31%
Win Rate
69%
Profit-Loss Ratio
0.80
Alpha
-0.022
Beta
-0.094
Annual Standard Deviation
0.079
Annual Variance
0.006
Information Ratio
-1.753
Tracking Error
0.128
Treynor Ratio
0.418
Total Fees
$342.91
Estimated Strategy Capacity
$390000000.00
Lowest Capacity Asset
MSFT R735QTJ8XC9X
Portfolio Turnover
8.84%
from AlgorithmImports import *

class SMA20Momentum(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2023, 12, 20)
        self.SetEndDate(2024, 5, 20)
        self.SetWarmUp(30)
        self.SetCash(2000_000)  

        self.ticker = "MSFT"
        self.sym = self.AddEquity(self.ticker, Resolution.Daily)
        self.sma = self.SMA(self.ticker, 20, Resolution.Daily)

    def OnData(self, data):
        if self.IsWarmingUp:
            return
            
        ind = self.sma.Current.Value

        if not self.Portfolio[self.ticker].Invested:
            
            if self.sym.Price > ind:

                self.SetHoldings(self.sym.Symbol, -0.5)

            elif self.sym.Price <ind:

                self.SetHoldings(self.sym.Symbol, 0.5)

        elif self.Portfolio[self.ticker].IsShort and self.sym.Price< ind or \
            self.Portfolio[self.ticker].IsLong and self.sym.Price> ind:

            self.SetHoldings(self.sym.Symbol, 0.0)