Overall Statistics
Total Trades
7
Average Win
0%
Average Loss
-0.17%
Compounding Annual Return
3.123%
Drawdown
6.600%
Expectancy
-1
Net Profit
13.583%
Sharpe Ratio
0.03
Sortino Ratio
0.037
Probabilistic Sharpe Ratio
23.026%
Loss Rate
100%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.01
Beta
0.131
Annual Standard Deviation
0.031
Annual Variance
0.001
Information Ratio
-0.513
Tracking Error
0.162
Treynor Ratio
0.007
Total Fees
$7.00
Estimated Strategy Capacity
$43000000.00
Lowest Capacity Asset
IWM RV0PWMLXVHPH
Portfolio Turnover
0.05%
# region imports
from AlgorithmImports import *
# endregion

STOCKS = ["SPY", "IWM", "QQQ"]

class MyAlgorithm(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2020, 1, 1)
        #self.SetEndDate(2016, 12, 3)
        self.SetCash(100000)
        self.high = {}
        self.low = {}
        self.symbol = {}
        self.resistance_touches = {}
        self.support_touches = {}
        self.ticket = {}
        self.ticket2 = {}
        self.open_order ={}
        
        self.stocks =  [self.AddEquity(ticker, Resolution.Minute).Symbol for ticker in STOCKS]
        for sec in self.stocks:
            self.high[sec] = self.MAX(sec, 240, Resolution.Minute)
            self.low[sec] = self.MIN(sec, 240, Resolution.Minute)
            self.resistance_touches[sec] = 0
            self.support_touches[sec] = 0
            self.ticket[sec] = None
            self.ticket2[sec] = None
            self.open_order[sec] = 0
        
        self.SetWarmUp(150)

        #self.symbol = self.AddEquity("SPY", Resolution.Minute).Symbol
        #self.high = self.MAX(self.symbol, 1, Resolution.Hour)
        #self.low = self.MIN(self.symbol, 1, Resolution.Hour)
        #self.resistance_touches = 0
        #self.support_touches = 0
        #self.ticket = None
        self.stop = None
        self.profit = None

    def OnData(self, data):
        if self.IsWarmingUp: return
        if self.Time.hour < 10: return

        for sec in self.stocks:
            if not self.high[sec].IsReady or not self.low[sec].IsReady: continue
            self.open_order[sec] = self.Transactions.GetOpenOrders(sec)
            if self.ticket[sec] and (self.UtcTime - self.ticket[sec].Time).days > 1:
                if self.ticket[sec].Status != OrderStatus.Filled:
                    self.ticket[sec].Cancel("Order cancelled after 1 day")
            
            if self.ticket2[sec] and (self.UtcTime - self.ticket[sec].Time).days > 1:
                if self.ticket2[sec].Status != OrderStatus.Filled:
                    self.ticket2[sec].Cancel("Order cancelled after 1 day")
            if not self.Portfolio[sec].Invested and len(self.open_order[sec]) > 0:
                continue 
            if self.Portfolio[sec].Invested: continue

            
            if self.Securities[sec].Close >= self.high[sec].Current.Value or self.Securities[sec].High >= self.high[sec].Current.Value:
                self.resistance_touches[sec] += 1
                #self.Debug(f"Resistance level touched {self.resistance_touches[sec]} times ---- {sec}")
                if self.resistance_touches[sec] >= 10:
                    quantity = self.CalculateOrderQuantity(sec, 0.1)
                    self.ticket[sec] = self.StopMarketOrder(sec, quantity, self.high[sec].Current.Value * 1.005, tag = f"{self.Securities[sec].Close}")
                    # Place limit order logic here
                    self.resistance_touches[sec] = 0  # Reset the counter
            if self.Securities[sec].Close <= self.low[sec].Current.Value or self.Securities[sec].Low <= self.low[sec].Current.Value:
                self.support_touches[sec] += 1
                #self.Debug(f"Support level touched {self.support_touches[sec]} times ---- {sec}")
                if self.support_touches[sec] >= 10:
                    quantity = self.CalculateOrderQuantity(sec, 0.1)
                    self.ticket2[sec] = self.StopMarketOrder(sec, -quantity, self.low[sec].Current.Value * 0.995, tag = f"{self.Securities[sec].Close}")
                    # Place limit order logic here
                    self.support_touches[sec] = 0  # Reset the counter

    def OnOrderEvent(self, orderEvent):
            order = self.Transactions.GetOrderById(orderEvent.OrderId)
                
            if order.Status == OrderStatus.Filled and order.Direction == OrderDirection.Buy:
                for sec in self.stocks:
                    if self.ticket[sec] is not None:
                        if orderEvent.OrderId == self.ticket[sec].OrderId:
                            quantity = self.Portfolio[order.Symbol].Quantity
                            fill_price = self.Portfolio[order.Symbol].AveragePrice
                            stop_price = fill_price * 0.99
                            profit_price = fill_price * 1.2
                            self.stop = self.StopMarketOrder(order.Symbol, -quantity, stop_price)
                            self.profit = self.LimitOrder(order.Symbol, -quantity, profit_price)
                            self.Debug(f" {self.Time} -- -- Bought {order.Symbol} for {self.Portfolio[order.Symbol].AveragePrice} // quantity -- {quantity}  // Limit Price {profit_price} // Stop Price {stop_price}")
                        continue
                    continue

            if order.Status == OrderStatus.Filled and order.Direction == OrderDirection.Sell:
                for sec in self.stocks:
                    if self.ticket2[sec] is not None:
                            if orderEvent.OrderId == self.ticket2[sec].OrderId:
                                quantity = self.Portfolio[order.Symbol].Quantity
                                fill_price = self.Portfolio[order.Symbol].AveragePrice
                                stop_price = fill_price * 1.005
                                profit_price = fill_price * 0.8
                                self.stop = self.StopMarketOrder(order.Symbol, -quantity, stop_price)
                                self.profit = self.LimitOrder(order.Symbol, -quantity, profit_price)
                                self.Debug(f" {self.Time} -- -- Sold {order.Symbol} for {self.Portfolio[order.Symbol].AveragePrice} // quantity -- {quantity}  // Limit Price {profit_price} // Stop Price {stop_price}")
                            continue
                    continue

            
            
            if order.Status == OrderStatus.Filled:
                if order.Type == OrderType.Limit or order.Type == OrderType.StopMarket:
                    for sec in self.stocks:
                        if self.ticket2[sec] is not None and self.ticket[sec] is not None:
                                if orderEvent.OrderId != self.ticket2[sec].OrderId or orderEvent.OrderId != self.ticket[sec].OrderId:
                                    self.Transactions.CancelOpenOrders(order.Symbol, "Hit Profit price")
                                    self.Debug(f" {self.Time} -- -- Closed {order.Symbol} for {self.Portfolio[order.Symbol].LastTradeProfit} Profit")
                                    continue
                                continue
                        continue
            #if order.Status == OrderStatus.Filled and order.Type == OrderType.Limit and order.Direction == OrderDirection.Sell:
                #self.Transactions.CancelOpenOrders(order.Symbol, "Hit Profit price")
                #self.Debug(f" {self.Time} -- -- Closed {order.Symbol} for {self.Portfolio[order.Symbol].LastTradeProfit} Profit")

            #if order.Status == OrderStatus.Filled and order.Type == OrderType.StopMarket and order.Direction == OrderDirection.Sell:
                #self.Transactions.CancelOpenOrders(order.Symbol, "Hit stop price")   
                #self.Debug(f" {self.Time} -- -- Closed {order.Symbol} for {self.Portfolio[order.Symbol].LastTradeProfit} Loss")

            #if order.Status == OrderStatus.Filled and order.Type == OrderType.Limit and order.Direction == OrderDirection.Buy:
                #self.Transactions.CancelOpenOrders(order.Symbol, "Hit Profit price")
                #self.Debug(f" {self.Time} -- -- Closed {order.Symbol} for {self.Portfolio[order.Symbol].LastTradeProfit} Profit")

            #if order.Status == OrderStatus.Filled and order.Type == OrderType.StopMarket and order.Direction == OrderDirection.Buy:
                #self.Transactions.CancelOpenOrders(order.Symbol, "Hit stop price")   
                #self.Debug(f" {self.Time} -- -- Closed {order.Symbol} for {self.Portfolio[order.Symbol].LastTradeProfit} Loss")