| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return -24.579% Drawdown 5.600% Expectancy 0 Net Profit -0.360% Sharpe Ratio -0.872 Probabilistic Sharpe Ratio 41.818% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.462 Beta 1.71 Annual Standard Deviation 0.217 Annual Variance 0.047 Information Ratio 2.058 Tracking Error 0.093 Treynor Ratio -0.111 Total Fees $1.00 Estimated Strategy Capacity $3400000.00 Lowest Capacity Asset AAPL Y3LLKB7Q6QKM|AAPL R735QTJ8XC9X |
from AlgorithmImports import *
# endregion
class EnergeticYellowGreenFalcon(QCAlgorithm):
def Initialize(self):
# INITIALIZE
self.SetStartDate(2022, 11, 12) # Set Start Date
self.SetEndDate(2022, 11, 16)
self.SetCash(10000) # Set Strategy Cash
self.symbol = self.AddEquity('AAPL', Resolution.Minute)
self.symbol.SetDataNormalizationMode(DataNormalizationMode.SplitAdjusted)
option = self.AddOption("AAPL")
self.option_symbol = option.Symbol
self.SetSecurityInitializer(self.SecurityInitializer)
# # SCHEDULED EVENTS
self.Schedule.On(self.DateRules.EveryDay(self.symbol.Symbol), self.TimeRules.AfterMarketOpen(self.symbol.Symbol, 1), self.DayStart)
self.Schedule.On(self.DateRules.EveryDay(self.symbol.Symbol), self.TimeRules.BeforeMarketClose(self.symbol.Symbol, 2), self.ParabolicCheck)
self.Schedule.On(self.DateRules.EveryDay(self.symbol.Symbol), self.TimeRules.BeforeMarketClose(self.symbol.Symbol, 1), self.LiquidateCheck)
self.Schedule.On(self.DateRules.EveryDay(self.symbol.Symbol), self.TimeRules.BeforeMarketClose(self.symbol.Symbol), self.DayEnd)
# TOGGLES
self.trading = False
self.gap_up = False
self.gap_down = False
self.long = False
self.short = False
self.liquidate_toggle = False
self.invest_daily = False
self.daily_trigger = False
self.invest_daily_s = False
self.daily_trigger_s = False
self.second_trade = False
self.trail_stop = False
self.trail_stop_s = False
self.initial_day_stop_sell = False
self.initial_day_stop_sell_s = False
self.initial_stop_sell = False
self.initial_stop_sell_s = False
self.target_sell = False
self.target_sell_s = False
self.parabolic_sell = False
self.parabolic_sell_s = False
self.gap_up_sell = False
self.gap_down_sell = False
self.break_even = False
self.chop = False
# VARIABLES
self.symbol_price = 0
self.entry_price = 0
self.trade_count = 0
self.sell_count = 0
self.open_price = 0
self.day_counter = 0
self.day_counter_s = 0
self.initial_day_stop_price = 0
self.initial_day_stop_price_s = 0
self.initial_stop_price = 0
self.initial_stop_price_s = 0
self.initial_target_price = 0
self.initial_target_price_s = 0
self.trigger_day_timer = 0
self.trigger_day_timer_s = 0
self.trigger_day_high = 0
self.trigger_day_low = 0
self.previous_day_high = 0
self.previous_day_low = 0
self.trigger_day_open = 0
self.trigger_day_close = 0
self.trigger_free_high = 0
self.trigger_free_low = 0
self.trigger_free_open = 0
self.trigger_free_close = 0
self.trigger_day_high = 0
self.trigger_day_low = 0
self.trigger_day_open = 0
self.trigger_day_close = 0
self.current_day_high = 0
self.current_day_low = 999999
self.trigger_array_high = 0
self.trigger_array_low = 0
self.previous_array_high = 0
self.previous_array_low = 0
self.day_three_high = 0
self.day_four_high = 0
self.day_five_high = 0
self.day_six_high = 0
self.day_three_low = 0
self.day_four_low = 0
self.day_five_low = 0
self.day_six_low = 0
self.vix_price = 0
self.order = True
self.SetWarmUp(timedelta(days = 25))
# self.ema = self.EMA(self.symbol.Symbol, 20, Resolution.Daily)
# self.vix = self.AddData(CBOE, 'VIX', Resolution.Daily).Symbol
# self.vix_ema = self.EMA(self.vix, 20, Resolution.Daily)
# CONSOLIDATED DATA
# Daily Bars
dailyConsolidator = TradeBarConsolidator(timedelta(days=1))
self.SubscriptionManager.AddConsolidator(self.symbol.Symbol, dailyConsolidator)
dailyConsolidator.DataConsolidated += self.OnDayBar
self.dayBarWindow = RollingWindow[TradeBar](20)
# TEST CONSOLIDATED
free_consolidator = TradeBarConsolidator(timedelta(minutes=10))
self.SubscriptionManager.AddConsolidator(self.symbol.Symbol, free_consolidator)
free_consolidator.DataConsolidated += self.OnFreeBar
self.freeBarWindow = RollingWindow[TradeBar](1)
# 5-Minute Bars
five_min_consolidator = TradeBarConsolidator(timedelta(minutes=5))
self.SubscriptionManager.AddConsolidator(self.symbol.Symbol, five_min_consolidator)
five_min_consolidator.DataConsolidated += self.OnFiveMinBar
self.fiveMinBarWindow = RollingWindow[TradeBar](2)
def SecurityInitializer(self, security):
security.SetMarketPrice(self.GetLastKnownPrice(security))
security.SetDataNormalizationMode(DataNormalizationMode.Raw)
def OnData(self, data):
if self.IsWarmingUp:
return
if not self.Portfolio.Invested and self.order:
contract_symbols = self.OptionChainProvider.GetOptionContractList(self.option_symbol, self.Time)
expiry = min([symbol.ID.Date for symbol in contract_symbols], default="EMPTY")
filtered_symbols = [symbol for symbol in contract_symbols if symbol.ID.Date == expiry and self.option_symbol.ID.OptionRight == OptionRight.Call]
self.contract_symbol = sorted(filtered_symbols, key=lambda symbol: symbol.ID.StrikePrice)[0]
value = self.AddOptionContract(self.contract_symbol)
shares_to_buy = int(self.Portfolio.Cash / (100*value.AskPrice))
self.MarketOrder(self.contract_symbol, shares_to_buy)
self.order = False
# CONSOLILDATED FUNCTIONS
def OnFiveMinBar(self, sender, bar):
self.fiveMinBarWindow.Add(bar)
if not self.fiveMinBarWindow.IsReady:
return
trigger_five_min = self.fiveMinBarWindow[0]
previous_five_min = self.fiveMinBarWindow[1]
self.trigger_five_min_high = trigger_five_min.High
self.trigger_five_min_low = trigger_five_min.Low
self.trigger_five_min_open = trigger_five_min.Open
self.trigger_five_min_close = trigger_five_min.Close
self.previous_five_min_high = previous_five_min.High
self.previous_five_min_low = previous_five_min.Low
# Inside Bar
if (self.trigger_five_min_high < self.previous_five_min_high) and (self.trigger_five_min_low > self.previous_five_min_low):
self.trigger_five_min_timer = self.Time.minute
self.invest_five_min = True
self.five_min_trigger = True
self.trigger_five_min_timer_s = self.Time.minute
self.invest_five_min_s = True
self.five_min_trigger_s = True
# 2Down
if (self.trigger_five_min_high < self.previous_five_min_high) and (self.trigger_five_min_low < self.previous_five_min_low):
self.trigger_five_min_timer = self.Time.minute
self.invest_five_min = True
self.five_min_trigger = True
# 2Up
if (self.trigger_five_min_high > self.previous_five_min_high) and (self.trigger_five_min_low > self.previous_five_min_low):
self.trigger_five_min_timer_s = self.Time.minute
self.invest_five_min_s = True
self.five_min_trigger_s = True
def OnFreeBar(self, sender, bar):
self.freeBarWindow.Add(bar)
if not self.freeBarWindow.IsReady:
return
trigger_free = self.freeBarWindow[0]
self.trigger_free_open = trigger_free.Open
self.trigger_free_close = trigger_free.Close
self.trigger_free_high = trigger_free.High
self.trigger_free_low = trigger_free.Low
def OnDayBar(self, sender, bar):
self.dayBarWindow.Add(bar)
if not self.dayBarWindow.IsReady:
return
# VARIABLES - HIGHS - LOWS
trigger_day = self.dayBarWindow[0]
previous_day = self.dayBarWindow[1]
day_three = self.dayBarWindow[2]
day_four = self.dayBarWindow[3]
day_five = self.dayBarWindow[4]
day_six = self.dayBarWindow[5]
day_seven = self.dayBarWindow[6]
day_eight = self.dayBarWindow[7]
day_nine = self.dayBarWindow[8]
day_ten = self.dayBarWindow[9]
day_eleven = self.dayBarWindow[10]
day_twelve = self.dayBarWindow[11]
day_thirteen = self.dayBarWindow[12]
day_fourteen = self.dayBarWindow[13]
day_fifteen = self.dayBarWindow[14]
day_sixteen = self.dayBarWindow[15]
day_seventeen = self.dayBarWindow[16]
day_eighteen = self.dayBarWindow[17]
day_nineteen = self.dayBarWindow[18]
day_twenty = self.dayBarWindow[19]
self.trigger_day_high = trigger_day.High
self.previous_day_high = previous_day.High
self.day_three_high = day_three.High
self.day_four_high = day_four.High
self.day_five_high = day_five.High
self.day_six_high = day_six.High
self.day_seven_high = day_seven.High
self.day_eight_high = day_eight.High
self.day_nine_high = day_nine.High
self.day_ten_high = day_ten.High
self.day_eleven_high = day_eleven.High
self.day_twelve_high = day_twelve.High
self.day_thirteen_high = day_thirteen.High
self.day_fourteen_high = day_fourteen.High
self.day_fifteen_high = day_fifteen.High
self.day_sixteen_high = day_sixteen.High
self.day_seventeen_high = day_seventeen.High
self.day_eighteen_high = day_eighteen.High
self.day_nineteen_high = day_nineteen.High
self.day_twenty_high = day_twenty.High
self.trigger_day_low = trigger_day.Low
self.previous_day_low = previous_day.Low
self.day_three_low = day_three.Low
self.day_four_low = day_four.Low
self.day_five_low = day_five.Low
self.day_six_low = day_six.Low
self.day_seven_low = day_seven.Low
self.day_eight_low = day_eight.Low
self.day_nine_low = day_nine.Low
self.day_ten_low = day_ten.Low
self.day_eleven_low = day_eleven.Low
self.day_twelve_low = day_twelve.Low
self.day_thirteen_low = day_thirteen.Low
self.day_fourteen_low = day_fourteen.Low
self.day_fifteen_low = day_fifteen.Low
self.day_sixteen_low = day_sixteen.Low
self.day_seventeen_low = day_seventeen.Low
self.day_eighteen_low = day_eighteen.Low
self.day_nineteen_low = day_nineteen.Low
self.day_twenty_low = day_twenty.Low
# DAILY TRIGGERING DAILY LOGIC
# Inside Bar
if (self.trigger_day_high < self.previous_day_high) and (self.trigger_day_low > self.previous_day_low):
self.trigger_day_timer = self.Time.day
self.invest_daily = True
self.daily_trigger = True
self.trigger_day_timer_s = self.Time.day
self.invest_daily_s = True
self.daily_trigger_s = True
# 2Down
if (self.trigger_day_high < self.previous_day_high) and (self.trigger_day_low < self.previous_day_low):
self.trigger_day_timer = self.Time.day
self.invest_daily = True
self.daily_trigger = True
# 2Up
if (self.trigger_day_high > self.previous_day_high) and (self.trigger_day_low > self.previous_day_low):
self.trigger_day_timer_s = self.Time.day
self.invest_daily_s = True
self.daily_trigger_s = True
# DEFINING CHOP LOGIC
self.trigger_array_highs = []
self.trigger_array_lows = []
self.previous_array_highs = []
self.previous_array_lows = []
self.trigger_array_highs.append(self.trigger_day_high)
self.trigger_array_highs.append(self.previous_day_high)
# self.trigger_array_highs.append(self.day_three_high)
# self.trigger_array_highs.append(self.day_four_high)
# self.trigger_array_highs.append(self.day_five_high)
# self.trigger_array_highs.append(self.day_six_high)
# self.trigger_array_highs.append(self.day_seven_high)
# self.trigger_array_highs.append(self.day_eight_high)
# self.trigger_array_highs.append(self.day_nine_high)
# self.trigger_array_highs.append(self.day_ten_high)
# self.trigger_array_highs.append(self.day_eleven_high)
# self.trigger_array_highs.append(self.day_twelve_high)
# self.trigger_array_highs.append(self.day_thirteen_high)
# self.trigger_array_highs.append(self.day_fourteen_high)
# self.trigger_array_highs.append(self.day_fifteen_high)
# self.trigger_array_highs.append(self.day_sixteen_high)
# self.trigger_array_highs.append(self.day_seventeen_high)
# self.trigger_array_highs.append(self.day_eighteen_high)
# self.trigger_array_highs.append(self.day_nineteen_high)
# self.trigger_array_highs.append(self.day_twenty_high)
self.trigger_array_lows.append(self.trigger_day_low)
self.trigger_array_lows.append(self.previous_day_low)
# self.trigger_array_lows.append(self.day_three_low)
# self.trigger_array_lows.append(self.day_four_low)
# self.trigger_array_lows.append(self.day_five_low)
# self.trigger_array_lows.append(self.day_six_low)
# self.trigger_array_lows.append(self.day_seven_low)
# self.trigger_array_lows.append(self.day_eight_low)
# self.trigger_array_lows.append(self.day_nine_low)
# self.trigger_array_lows.append(self.day_ten_low)
# self.trigger_array_lows.append(self.day_eleven_low)
# self.trigger_array_lows.append(self.day_twelve_low)
# self.trigger_array_lows.append(self.day_thirteen_low)
# self.trigger_array_lows.append(self.day_fourteen_low)
# self.trigger_array_lows.append(self.day_fifteen_low)
# self.trigger_array_lows.append(self.day_sixteen_low)
# self.trigger_array_lows.append(self.day_seventeen_low)
# self.trigger_array_lows.append(self.day_eighteen_low)
# self.trigger_array_lows.append(self.day_nineteen_low)
# self.trigger_array_lows.append(self.day_twenty_low)
# self.previous_array_highs.append(self.trigger_day_high)
# self.previous_array_highs.append(self.previous_day_high)
self.previous_array_highs.append(self.day_three_high)
self.previous_array_highs.append(self.day_four_high)
self.previous_array_highs.append(self.day_five_high)
self.previous_array_highs.append(self.day_six_high)
self.previous_array_highs.append(self.day_seven_high)
self.previous_array_highs.append(self.day_eight_high)
self.previous_array_highs.append(self.day_nine_high)
self.previous_array_highs.append(self.day_ten_high)
# self.previous_array_highs.append(self.day_eleven_high)
# self.previous_array_highs.append(self.day_twelve_high)
# self.previous_array_highs.append(self.day_thirteen_high)
# self.previous_array_highs.append(self.day_fourteen_high)
# self.previous_array_highs.append(self.day_fifteen_high)
# self.previous_array_highs.append(self.day_sixteen_high)
# self.previous_array_highs.append(self.day_seventeen_high)
# self.previous_array_highs.append(self.day_eighteen_high)
# self.previous_array_highs.append(self.day_nineteen_high)
# self.previous_array_highs.append(self.day_twenty_high)
# self.previous_array_lows.append(self.trigger_day_low)
# self.previous_array_lows.append(self.previous_day_low)
self.previous_array_lows.append(self.day_three_low)
self.previous_array_lows.append(self.day_four_low)
self.previous_array_lows.append(self.day_five_low)
self.previous_array_lows.append(self.day_six_low)
self.previous_array_lows.append(self.day_seven_low)
self.previous_array_lows.append(self.day_eight_low)
self.previous_array_lows.append(self.day_nine_low)
self.previous_array_lows.append(self.day_ten_low)
# self.previous_array_lows.append(self.day_eleven_low)
# self.previous_array_lows.append(self.day_twelve_low)
# self.previous_array_lows.append(self.day_thirteen_low)
# self.previous_array_lows.append(self.day_fourteen_low)
# self.previous_array_lows.append(self.day_fifteen_low)
# self.previous_array_lows.append(self.day_sixteen_low)
# self.previous_array_lows.append(self.day_seventeen_low)
# self.previous_array_lows.append(self.day_eighteen_low)
# self.previous_array_lows.append(self.day_nineteen_low)
# self.previous_array_lows.append(self.day_twenty_low)
def max(i):
max_value = i[0]
for number in i:
if number > max_value:
max_value = number
return max_value
def min(i):
min_value = i[0]
for number in i:
if number < min_value:
min_value = number
return min_value
self.trigger_array_high = max(self.trigger_array_highs)
self.trigger_array_low = min(self.trigger_array_lows)
self.previous_array_high = max(self.previous_array_highs)
self.previous_array_low = min(self.previous_array_lows)
# Inside Bar
if (self.trigger_array_high < self.previous_array_high) and (self.trigger_array_low > self.previous_array_low):
self.trading = True
else:
self.trading = False
# SCHEDULED EVENTS
def DayStart(self):
self.invest_five_min = False
self.five_min_trigger = False
self.invest_five_min_s = False
self.five_min_trigger_s = False
def ParabolicCheck(self):
self.parabolic_sell = True
self.parabolic_sell_s = True
def LiquidateCheck(self):
if self.long:
self.day_counter += 1
else:
self.day_counter = 0
if self.short:
self.day_counter_s += 1
else:
self.day_counter_s = 0
def DayEnd(self):
self.gap_up_sell = False
self.gap_down_sell = False
self.invest_daily = False
self.daily_trigger = False
self.invest_daily_s = False
self.daily_trigger_s = False
self.parabolic_sell = False
self.parabolic_sell_s = False
self.chop = False
self.trading = True
self.current_day_high = 0
self.current_day_low = 999999
# self.long = False
# self.short = False
# self.trail_stop = False
# self.trail_stop_s = False
# self.initial_day_stop_sell = False
# self.initial_day_stop_sell_s = False
# self.initial_stop_sell = False
# self.initial_stop_sell_s = False
# self.target_sell = False
# self.target_sell_s = False
# self.parabolic_sell = False
# self.parabolic_sell_s = False
# self.break_even = False
# self.second_trade = False
# self.trade_count = 0