Overall Statistics
Total Trades
4
Average Win
0%
Average Loss
-14.73%
Compounding Annual Return
-27.362%
Drawdown
29.400%
Expectancy
-1
Net Profit
-27.426%
Sharpe Ratio
-1.606
Probabilistic Sharpe Ratio
0.000%
Loss Rate
100%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.216
Beta
0.14
Annual Standard Deviation
0.12
Annual Variance
0.014
Information Ratio
-1.362
Tracking Error
0.265
Treynor Ratio
-1.375
Total Fees
$23.65
Estimated Strategy Capacity
$28000000.00
Lowest Capacity Asset
BP R735QTJ8XC9X
# region imports
from AlgorithmImports import *
# endregion

class BuyAndHold(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(10000)
    self.SetStartDate(2010,1,1)
    self.SetEndDate(2015,1,1)
    self.AddEquity("AAPL", Resolution.Daily)

  def OnData(self,data):
    
    if not self.Portfolio.Invested and self.invest:
      self.SetHoldings("AAPL",1)
# region imports
from AlgorithmImports import *
from datetime import datetime
# endregion

class LimitOrder(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(100000)
    self.SetStartDate(2008,1,1)
    self.SetEndDate(2015,1,1)
    self.stock = self.AddEquity("IBM", Resolution.Daily).Symbol
    self.invest = True

  def OnData(self,data):
    
    if (self.Portfolio.Invested == False) and (self.invest == True):
      #Buy 10 shares of IBM -- MAX price $50 -- (current market price is $40)
      self.LimitOrder(symbol=self.stock, quantity=10, limitPrice=50)

      # Sell 10shares --MINIMUM price $100
      self.LimitOrder(symbol=self.stock, quantity=-10, limitPrice=100)
      self.invest = False
# region imports
from AlgorithmImports import *
from datetime import datetime
# endregion

class MarketOnCloseOrder(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(100000)
    self.SetStartDate(2020,1,1)
    #self.SetEndDate(2022,1,1)
    self.spy = self.AddEquity("SPY", Resolution.Daily)
    self.invest = True
    

  def OnData(self,data):
    
    #BUYING
    if (self.Portfolio.Invested == False) and (self.invest == True):
      self.MarketOnCloseOrder(symbol=self.spy.Symbol, 
                              quantity=10,
                              tag="Buy on Market Close")
      self.invest = False
# region imports
from AlgorithmImports import *
from datetime import datetime
# endregion

class MarketOnOpenOrder(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(100000)
    self.SetStartDate(2020,1,1)
    #self.SetEndDate(2022,1,1)
    self.spy = self.AddEquity("SPY", Resolution.Daily)
    self.invest = True
    

  def OnData(self,data):
    
    #BUYING
    if (self.Portfolio.Invested == False) and (self.invest == True):
      self.MarketOnOpenOrder(symbol=self.spy.Symbol, quantity=10)
      self.invest = False
# region imports
from AlgorithmImports import *
from datetime import datetime
# endregion

class MarketOrder(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(100000)
    self.SetStartDate(2010,1,1)
    self.SetEndDate(2015,1,1)
    self.spy = self.AddEquity("SPY", Resolution.Daily)
    self.invest = True
    
  def OnData(self,data):
    
    #BUYING
    if (self.Portfolio.Invested == False) and (self.invest == True):
      # First day Close Price
      self.MarketOrder(symbol= self.spy.Symbol,  quantity = 1000)
      self.invest = False

    #SELLING
    if (self.Time == datetime(day=1, month=1, year=2014)):
      self.MarketOrder(symbol= self.spy.Symbol, quantity = -1000)
# region imports
from AlgorithmImports import *
from datetime import datetime
# endregion

class StopLimitOrder(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(100000)
    self.SetStartDate(2020,1,1)
    #self.SetEndDate(2022,1,1)
    self.spy = self.AddEquity("SPY", Resolution.Daily)
    self.invest = True
    
    self.sell_ticket = None

  def OnData(self,data):
    
    #BUYING
    if (self.Portfolio.Invested == False) and (self.invest == True):
      #First day closeing price
      close = self.Securities['SPY'].Close
      #1% drop --> Stop Triggered
      stop_price = close * 0.99
      # Limit 1% abve close price
      limit_price = close * 1.01

      stop_limit_ticker = self.StopLimitOrder(symbol= self.spy.Symbol, 
                                              quantity=10, 
                                              stopPrice=stop_price, 
                                              limitPrice=limit_price)
      self.invest = False
# region imports
from AlgorithmImports import *
from datetime import datetime
# endregion

class StopMarketOrder(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(100000)
    self.SetStartDate(2019,1,1)
    #self.SetEndDate(2022,1,1)
    self.stock = self.AddEquity("BA", Resolution.Daily)
    self.invest = True
    
    self.sell_ticket = None

  def OnData(self,data):
    
    #BUYING
    if (self.Portfolio.Invested == False) and (self.invest == True):
      # First day Close Price
      self.MarketOrder(symbol = self.stock.Symbol,
                       quantity = 10)
      self.invest = False

    #SELLING
    if (self.sell_ticket == None):
      self.sell_ticket = self.StopMarketOrder(symbol = self.stock.Symbol,
                                              quantity = -10,
                                              #Stop price tigger = 60% of initial Open Price
                                              stopPrice = self.Securities['BA'].Open * 0.6,
                                              tag = 'sell BA at -60%')
# region imports
from AlgorithmImports import *
# endregion

class OrderSystem(QCAlgorithm):
    def LimitOrder(self, stock: str, quantity: int, LimitPrice: float):
        """
        Send a limit order to the transaction handler.
        returns: The order ticket instance.
        """
        if (self.Portfolio.Invested == False) and (self.invest == True):
            self.LimitOrder(symbol=stock.Symbol, 
                            quantity=quantity, 
                            limitPrice=LimitPrice)
            self.invest = False
    
    def MarketOrder(self, stock: str, quantity: int):
        """
        Send a Market order to the transaction handler.
        returns: The order ticket instance.
        """
        if (self.Portfolio.Invested == False) and (self.invest == True):
        # First day Close Price
            self.MarketOrder(symbol= stock.Symbol,  
                             quantity = quantity)
            self.invest = False

    def StopMarketOrder(self, stock: str, quantity: int, stopPrice: float):
        """
        Send a Stop Market order to the transaction handler.
        returns: The order ticket instance.
        """
        if (self.Portfolio.Invested == False) and (self.invest == True):
            # First day Close Price
            self.StopMarketOrder(symbol = stock.Symbol,
                                 quantity = -10,
                                 stopPrice = stopPrice)
            self.invest = False

    def StopLimitOrder(self, stock: str, quantity: int, limitPrice: float, stopPrice: float):
        """
        Send a Stop Limit Order order to the transaction handler.
        returns: The order ticket instance.
        """
        if (self.Portfolio.Invested == False) and (self.invest == True):
        #First day closeing price
            close = self.Securities['SPY'].Close
            #1% drop --> Stop Triggered
            stop_price = close * 0.99
            # Limit 1% abve close price
            limit_price = close * 1.01

            stop_limit_ticket = self.StopLimitOrder(symbol= stock.Symbol, 
                                                    quantity=quantity, 
                                                    stopPrice=stopPrice, 
                                                    limitPrice=limitPrice)
            self.invest = False
    
    def CalculateSharesQuantity(self, stock: str, PortfolioExposure: float):
        """
        Takes the Portfolio percentage and the stock price.
        returns: The quantity of shares to execute order.
        """
        #determine Quantity of shares can i buy with my cash
        shares_to_buy = int(self.Portfolio.Cash / data[self.appl.Symbol].Open)
        #determine Quantity of shares i already hold
        held_shares = self.Portfolio[self.appl.Symbol].Quantity
# region imports
from AlgorithmImports import *
# endregion

class CalculateSharesQuantity(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(year=2015,month=1,day=1)
        self.SetEndDate(year=2020,month=1,day=1)
        self.SetCash(startingCash=100000)
        self.appl= self.AddEquity(ticker = "AAPL", resolution = Resolution.Daily)

        self.invest_toggle = True
        self.sell_toggle = True


    def OnData(self, data):
        #if for some reason, the data is corrupted just dont execute code and return
        if (data[self.appl.Symbol] == False):
            return

        #BUYING
        #if not invested then invest
        if (self.Portfolio.Invested == False) and (self.invest_toggle == True):
            #calculate the quantity of shares to buy- how much whole shares can i buy with my cash?
            shares_to_buy = int(self.Portfolio.Cash / data[self.appl.Symbol].Open)
            self.MarketOrder(symbol=self.appl.Symbol, quantity= shares_to_buy)
            self.invest_toggle = False
            return
    
        profit = self.Portfolio[self.appl.Symbol].UnrealizedProfitPercent
        
        #SELLING
        #if 10 profit is reached sell half of the shares
        if (profit >= 0.1) and (self.sell_toggle == True):
            #define the number of shares you hol in you portfolio
            held_shares = self.Portfolio[self.appl.Symbol].Quantity
            # send a sell order for half of the shares. quantity must be int
            self.MarketOrder(symbol=self.appl.Symbol, quantity=-(held_shares//2))

            self.sell_toggle = False


    def OnOrderEvent(self, orderEvent):
        #if the order event is not filled then do nothing and return
        if (orderEvent.FillQuantity == 0):
            return

        fetched = self.Transactions.GetOrderById(orderEvent.OrderId)

        self.Log(f"{str(fetched.Type)}  was filled ")
        self.Log(f"Symbol Was {str(orderEvent.Symbol)} ")
        self.Log(f"Quantity filled was {str(orderEvent.FillQuantity)} ")
# region imports
from AlgorithmImports import *
# endregion

class SellOnProfit(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(10000)
    self.SetStartDate(2018,1,1)
    self.SetEndDate(2021,1,1)
    self.AddEquity("AAL", Resolution.Daily)
    self.invest = True
    # 50% loss --> -0.5
    self.limit_profit_percent = -0.5

  def OnData(self,data):
    
    if (self.Portfolio.Invested == False) and (self.invest == True):
      self.SetHoldings("AAL",1)

    profit_percent = self.Portfolio['AAL'].UnrealizedProfitPercent

    if (self.Portfolio.Invested == True) and (profit_percent < self.limit_profit_percent):
      self.Liquidate("AAL")
      self.invest = False
 
# region imports
from AlgorithmImports import *
# endregion

class SellAtPrice(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(10000)
    self.SetStartDate(2010,1,1)
    self.SetEndDate(2020,1,1)
    self.apple = self.AddEquity("AAPL", Resolution.Daily)

    self.limit_price = 50
    self.invest = True   

  def OnData(self,data):
    
    if not self.Portfolio.Invested and self.invest:
      self.SetHoldings("AAPL",1)

    closing_price = self.Portfolio["AAPL"].Price

    if closing_price > self.limit_price and self.Portfolio.Invested:
      self.Liquidate("AAPL")
      self.invest = False
# region imports
from AlgorithmImports import *
# endregion

class SellAfterTime(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(10000)
    self.SetStartDate(2015,1,1)
    self.SetEndDate(2021,1,1)
    self.AddEquity("SPY", Resolution.Daily)
    self.invest = True   

  def OnData(self,data):
    
    if not self.Portfolio.Invested and self.invest:
      self.SetHoldings("SPY",1)
      self.invested_time = self.Time #DATETIME object

    time_diff = (self.Time - self.invested_time).days

    if time_diff > 1000 and self.Portfolio.Invested:
      self.Liquidate("SPY")
      self.invest = False
 
# region imports
from AlgorithmImports import *
# endregion

class SellOnProfit(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(10000)
    self.SetStartDate(2010,1,1)
    self.SetEndDate(2015,1,1)
    self.AddEquity("AAPL", Resolution.Daily)
    self.invest = True
    # 100% Proofit --> 1
    self.limit_profit_percent =1

  def OnData(self,data):
    
    if (self.Portfolio.Invested == False) and (self.invest == True):
      self.SetHoldings("AAPL",1)

    profit_percent = self.Portfolio['AAPL'].UnrealizedProfitPercent

    if (self.Portfolio.Invested == True) and (profit_percent > self.limit_profit_percent):
      self.Liquidate("AAPL")
      self.invest = False
 
# region imports
from AlgorithmImports import *
from datetime import datetime
# endregion

class SharesQuantityCalc(QCAlgorithm):
  
  def Initialize(self):

    self.SetCash(100000)
    self.SetStartDate(2015,1,1)
    self.SetEndDate(2020,1,1)
    self.appl = self.AddEquity("AAPL", Resolution.Daily)
    self.invest = True
    self.sell = True
    

  def OnData(self,data):

    if (data[self.appl.Symbol] == False):
      return

    #BUYING
    if (self.Portfolio.Invested == False) and (self.invest == True):
      # how much whole shares can i buy with my cash?
      shares_to_buy = int(self.Portfolio.Cash / data[self.appl.Symbol].Open)

      self.MarketOrder(symbol= self.appl.Symbol, 
                       quantity= shares_to_buy)

      self.invest = False
      return
    
    profit = self.Portfolio[self.appl.Symbol].UnrealizedProfitPercent
    
    #SELLING
    if (profit >= 0.1) and (self.sell == True):
      #
      held_shares = self.Portfolio[self.appl.Symbol].Quantity
      half_of_held_shares = held_shares//2
      # if 10% profit is reached sell half of our shares
      self.MarketOrder(Symbol= self.appl.Symbol, 
                       quantity= -(held_shares//2) )

      self.sell = False

  def OnOrderEvent(self, orderEvent):
    
    #if the order is not filled do nothing
    if (orderEvent.FillQuantity == 0):
      return

    fetched = self.Transactions.GetOrderById(orderId=orderEvent.OrderId)

    self.Log(f"{str(fetched.Type)} was filled")
    self.Log(f"Symbol was {str(orderEvent.Symbol)}")
    self.Log(f"Quantity was {str(orderEvent.FillQuantity)}")
# region imports
from AlgorithmImports import *
# endregion

class InteractiveOrderTicketObjects(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(year=2020,month=1,day=1)
        self.SetEndDate(year=2021,month=1,day=1)
        self.SetCash(startingCash=100000)
        self.xom= self.AddEquity(ticker = "XOM", resolution = Resolution.Daily)
        self.bp= self.AddEquity(ticker = "BP", resolution = Resolution.Daily)
        self.invest_toggle = True
        self.sell_xom_toggle = True
        self.sell_bp_toggle = True

    def OnData(self, data):
        #if for some reason, the data is corrupted just dont execute code and return
        if (data[self.xom.Symbol] == False) and (data[self.bp.Symbol] == Flase): 
            return

        #BUYING
        #if not invested then invest
        if (self.Portfolio.Invested == False) and (self.invest_toggle == True):
            #buy shares of XOM with 50% of portfolio
            self.SetHoldings(symbol=self.xom.Symbol,percentage=0.5)
            #store open price for XOM
            self.openPrice_xom =self.Securities[self.xom.Symbol].Open
            #buy shares of BP with 50% of portfolio 
            self.SetHoldings(symbol=self.bp.Symbol,percentage=0.5)
            #store open price for BP
            self.openPrice_bp =self.Securities[self.bp.Symbol].Open
            # turn investing toggle off
            self.invest_toggle = False
            
        if (self.Portfolio.Invested == True) and (self.sell_xom_toggle == True):
            #getting shares i hold
            held_shares_xom = self.Portfolio[self.xom.Symbol].Quantity
            #Selling if 20% Loss is reached
            self.StopMarketOrder(symbol=self.xom.Symbol, 
                                 quantity=-(held_shares_xom), 
                                 stopPrice=self.openPrice_xom * 0.8,
                                 tag = "Selling all shares of XOM")
            #switching XOM selling toggle                     
            self.sell_xom_toggle = False

        if (self.Portfolio.Invested == True) and (self.sell_bp_toggle == True):
            #Getting shares i hold
            held_shares_bp = self.Portfolio[self.bp.Symbol].Quantity
            #Selling if 20% Loss is reached
            self.StopMarketOrder(symbol=self.bp.Symbol, 
                                 quantity=-(held_shares_bp), 
                                 stopPrice=self.openPrice_bp * 0.8,
                                 tag = "Selling all shares of BP")
            #switchin BP selling toggle                     
            self.sell_bp_toggle = False



    def OnOrderEvent(self, orderEvent):
        #if the order event is not filled then do nothing and return
        if (orderEvent.FillQuantity == 0):
            return

        fetched = self.Transactions.GetOrderById(orderEvent.OrderId)

        self.Log(f"Order ID {str(fetched.Type)} for Ticker {str(orderEvent.Symbol)} is executed with Quantity {str(orderEvent.FillQuantity)}")