| Overall Statistics |
|
Total Orders 242 Average Win 3.46% Average Loss -2.66% Compounding Annual Return 78.846% Drawdown 25.400% Expectancy 0.255 Start Equity 1000 End Equity 2046.66 Net Profit 104.666% Sharpe Ratio 1.54 Sortino Ratio 2.003 Probabilistic Sharpe Ratio 67.461% Loss Rate 45% Win Rate 55% Profit-Loss Ratio 1.30 Alpha 0.139 Beta 3.026 Annual Standard Deviation 0.345 Annual Variance 0.119 Information Ratio 1.476 Tracking Error 0.272 Treynor Ratio 0.176 Total Fees $242.00 Estimated Strategy Capacity $7500000.00 Lowest Capacity Asset TQQQ UK280CGTCB51 Portfolio Turnover 52.72% |
# region imports
from AlgorithmImports import *
# endregion
class BreakOutStrategy(QCAlgorithm):
# Initialize Algorithm
def Initialize(self):
self.SetStartDate(2023, 5, 2)
self.SetEndDate(2024, 7, 24)
self.SetCash(1000)
self.Symbol = self.AddEquity("tQQQ", Resolution.Minute).Symbol
# Strategy Status
self.first_five_high = None
self.first_five_low = None
self.waiting_for_breakout = False
# Program de five first minute candles
self.Schedule.On(self.DateRules.EveryDay(self.Symbol),
self.TimeRules.AfterMarketOpen(self.Symbol, 5),
self.SetOpeningRange)
def SetOpeningRange(self):
# Reset the range every day
self.first_five_high = None
self.first_five_low = None
self.waiting_for_breakout = True
# Obtain the candles for the first five minutes once market opens
history = self.History(self.Symbol, 5, Resolution.Minute)
if not history.empty:
# Calculate the maxiumum and minimum level
self.first_five_high = history['high'].max()
self.first_five_low = history['low'].min()
self.Debug(f"First 5-minute range set: High={self.first_five_high}, Low={self.first_five_low}")
def OnData(self, data: Slice):
if not self.waiting_for_breakout or not data.Bars.ContainsKey(self.Symbol):
return
# Actutal price
current_price = data[self.Symbol].Close
# Entry signal
if current_price > self.first_five_high:
self.SetHoldings(self.Symbol, 1) # Entrar en posición larga
self.Debug(f"Breakout! Entering long at price {current_price}")
self.waiting_for_breakout = False
# Stop Loss signal
if self.Portfolio[self.Symbol].Invested:
stop_price = self.first_five_low
if current_price < stop_price:
self.Liquidate(self.Symbol)
self.Debug(f"Stop-loss triggered. Liquidating at {current_price}")
def OnOrderEvent(self, orderEvent):
if orderEvent.Status == OrderStatus.Filled:
self.Debug(f"Order filled for {orderEvent.Symbol} at price {orderEvent.FillPrice} at time {self.Time}")