| Overall Statistics |
|
Total Trades 2320 Average Win 0.54% Average Loss -0.36% Compounding Annual Return 39.081% Drawdown 27.200% Expectancy 0.099 Net Profit 96.194% Sharpe Ratio 1.393 Probabilistic Sharpe Ratio 65.365% Loss Rate 56% Win Rate 44% Profit-Loss Ratio 1.48 Alpha 0.266 Beta 0.105 Annual Standard Deviation 0.202 Annual Variance 0.041 Information Ratio 0.538 Tracking Error 0.241 Treynor Ratio 2.687 Total Fees $14041.53 Estimated Strategy Capacity $48000000.00 Lowest Capacity Asset QQQ RIWIV7K5Z9LX |
#region imports
from AlgorithmImports import *
#endregion
# Trading QC Super Trend Indicator
# --------------------------------------------
STOCK = "QQQ"; BAR = 1; SL = -0.0145; TP = 0.01; ATR = 1; MULT = 0.1; #wil m 0.2 and kama 0.16 spy 3 0.1.. A1M0.1 A2M0.2 A1M0.16
# --------------------------------------------
class SuperTrendIndicator(QCAlgorithm):
def Initialize(self):
self.SetStartDate(DateTime(2020, 5, 17, 9, 30, 0))
self.SetEndDate(DateTime(2022, 6, 1, 16, 0, 0))
self.SetCash(200000)
res = Resolution.Hour
#ATR = int(self.GetParameter("ATR_A"))
#MULT = float(self.GetParameter("MULT_A"))
self.stock = self.AddEquity(STOCK, res).Symbol
consolidator = TradeBarConsolidator(timedelta(hours = BAR))
self.Consolidate(self.stock, timedelta(hours = BAR), self.BarHandler)
self.st = SuperTrend(ATR, MULT, MovingAverageType.Kama)
self.RegisterIndicator(self.stock, self.st, consolidator)
self.heikin_ashi = self.HeikinAshi(STOCK, Resolution.Hour)
self.RegisterIndicator(STOCK, self.heikin_ashi, consolidator)
#self.mari= IndicatorExtensions.Of(self.st, self.heikin_ashi) # extension, uhhmmm
self.SetWarmUp(5*BAR*ATR, res)
#Close every friday
#self.Schedule.On(self.DateRules.Every(DayOfWeek.Friday), self.TimeRules.At(16, 0), self.FridayClosed)
#Liquidate at 10k loss
#self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.Every(timedelta(minutes=10)), self.LiquidateUnrealizedLosses)
#Close Every Friday
#def FridayClosed(self):
#self.Liquidate(self.stock)
#self.Log(f"Friday at 4pm: Fired at: {self.Time}")
#liquidate at 10k loss
#def LiquidateUnrealizedLosses(self):
# Liquidate any unrealized loss of over 10000 dollars or can use percentage of available funds,
#if self.Portfolio.TotalUnrealizedProfit < -10000:
#self.Log(f"Liquidated due to unrealized losses at: {self.Time}")
#self.Liquidate()
def BarHandler(self, consolidated):
if self.IsWarmingUp: return
if not self.st.IsReady: return
if not self.heikin_ashi: return
self.Plot(STOCK, "Price", self.Securities[self.stock].Price)
self.Plot(STOCK, "Super Trend", self.st.Current.Value)
#stop trading at 3:30 every Friday
#stop_time = self.Time.replace(day=5, hour=15, minute=30, second=0)
#if self.Time >= stop_time:
#return
pnl = self.Securities[self.stock].Holdings.UnrealizedProfitPercent
if self.heikin_ashi.Current.Value > self.st.Current.Value: # Bullish
self.SetHoldings(self.stock, 1, True, "Buy Signal")
elif self.heikin_ashi.Current.Value < self.st.Current.Value: # Bearish
self.SetHoldings(self.stock, -1, True, "Sell Signal")
#self.Liquidate(self.stock, "Sell Signal")
if self.Portfolio[self.stock].Invested:
if pnl < SL:
self.Liquidate(self.stock, "Stop Loss")
#elif pnl > TP:
#self.Liquidate(self.stock, "Take Profit")
""" Examples
Multiple Indicators
https://www.quantconnect.com/forum/discussion/12143/help-with-strategy-execution/p1
FRAMA indicator FractalAdaptiveMovingAverage
https://www.quantconnect.com/forum/discussion/7873/indicator-extension-help/p1
Rolling Window Example
https://github.com/QuantConnect/Lean/blob/master/Algorithm.Python/RollingWindowAlgorithm.py
Kalman Filter
https://www.quantconnect.com/forum/discussion/12768/share-kalman-filter-crossovers-for-crypto-and-smart-rollingwindows/p1
https://www.quantconnect.com/forum/discussion/11788/another-digital-filter-laguerre-filter/p1
"""