Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-1.508
Tracking Error
0.198
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
from datetime import date
import numpy as np
import datetime
import pandas

class SimpleBreakoutExample(QCAlgorithm):

    def Initialize(self):
        self.SetCash(100000)
        self.SetStartDate(2021,10,1)
        self.SetEndDate(date.today())
        ticker = "MSFT"
        self.ticker = str(ticker)
        equity = self.AddEquity(ticker, Resolution.Minute)
        self.symbol = self.AddEquity(ticker, Resolution.Minute).Symbol
        equity.SetDataNormalizationMode(DataNormalizationMode.Raw)
        self.equity = equity.Symbol
        self.SetBenchmark(self.equity)
        option = self.AddOption(ticker, Resolution.Minute)
        option.SetFilter(-1,1,timedelta(5),timedelta(11))
        self.Schedule.On(self.DateRules.EveryDay(self.symbol), \
                        self.TimeRules.AfterMarketOpen(self.symbol, 20), \
                        Action(self.EveryMarketOpen))


    # def OnData(self, data):
    #     option_invested = [x.Key for x in self.Portfolio if x.Value.Invested and x.Value.Type==SecurityType.Option]


    def EveryMarketOpen(self):
        ticker = str(self.ticker)
        start = datetime.datetime(2021, 2, 1)
        option_invested = [x.Key for x in self.Portfolio if x.Value.Invested and x.Value.Type==SecurityType.Option]
        end = date.today()
        qb = QuantBook()
        spy = qb.AddEquity(ticker)
        self.history = qb.History(spy.Symbol, start, end, Resolution.Daily)
        self.history['Close'] = self.history['close']
        self.history['20_SMA'] = self.history['Close'].rolling(window=5, min_periods=1).mean()
        self.history['50_SMA'] = self.history['Close'].rolling(window=12, min_periods=1).mean()
        self.history['Signal'] = 0.0
        self.history['Signal'] = np.where(self.history['20_SMA'] > self.history['50_SMA'], 1.0, 0.0)
        self.history['Position'] = self.history['Signal'].diff()
        self.Log(f"Time: {self.Time} - Position: {self.history['Position']}")
        self.history['Buy Signal'] = self.history['Position'] == 1
        self.Signal = float(self.history.tail(1)['Position'])
        self.Log(f"Time: {self.Time} - Signal: {self.Signal}")
        if option_invested:
            if self.Time + timedelta(2) > option_invested[0].ID.Date:
                self.Liquidate(option_invested[0], "Too close to expiration")
            return
        
        if self.Signal == 1.0:
            for i in data.OptionChains:
                chains = i.Value
                self.BuyCall(chains)
                
    def BuyCall(self,chains):
        expiry = sorted(chains,key = lambda x: x.Expiry, reverse=True)[0].Expiry
        calls = [i for i in chains if i.Expiry == expiry and i.Right == OptionRight.Call]
        call_contracts = sorted(calls,key = lambda x: abs(x.Strike - x.UnderlyingLastPrice))
        if len(call_contracts) == 0: 
            return
        self.call = call_contracts[0]
        
        quantity = self.Portfolio.TotalPortfolioValue / self.call.AskPrice
        quantity = int( 0.05 * quantity / 100 )
        self.Buy(self.call.Symbol, quantity)


    def OnOrderEvent(self, orderEvent):
        order = self.Transactions.GetOrderById(orderEvent.OrderId)
        if order.Type == OrderType.OptionExercise:
            self.Liquidate()