| 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 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
from QuantConnect import *
from QuantConnect.Parameters import *
from QuantConnect.Benchmarks import *
from QuantConnect.Brokerages import *
from QuantConnect.Util import *
from QuantConnect.Interfaces import *
from QuantConnect.Algorithm import *
from QuantConnect.Algorithm.Framework import *
from QuantConnect.Algorithm.Framework.Selection import *
from QuantConnect.Algorithm.Framework.Alphas import *
from QuantConnect.Algorithm.Framework.Portfolio import *
from QuantConnect.Algorithm.Framework.Execution import *
from QuantConnect.Algorithm.Framework.Risk import *
from QuantConnect.Indicators import *
from QuantConnect.Data import *
from QuantConnect.Data.Consolidators import *
from QuantConnect.Data.Custom import *
from QuantConnect.Data.Fundamental import *
from QuantConnect.Data.Market import *
from QuantConnect.Data.UniverseSelection import *
from QuantConnect.Notifications import *
from QuantConnect.Orders import *
from QuantConnect.Orders.Fees import *
from QuantConnect.Orders.Fills import *
from QuantConnect.Orders.Slippage import *
from QuantConnect.Scheduling import *
from QuantConnect.Securities import *
from QuantConnect.Securities.Equity import *
from QuantConnect.Securities.Forex import *
from QuantConnect.Securities.Interfaces import *
from datetime import date, datetime, timedelta
from QuantConnect.Python import *
from QuantConnect.Storage import *
QCAlgorithmFramework = QCAlgorithm
QCAlgorithmFrameworkBridge = QCAlgorithm
import math
import numpy as np
import pandas as pd
import scipy as sp
import string
class FiveDayUp(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 5 , 19) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Cash)
self.UniverseSettings.Resolution = Resolution.Hour
self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction)
self.uptrend = []
self.rebalance_interval = timedelta(days = 1)
self.lasttime = None
self.curr_universe = []
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.Every(timedelta(seconds=1)), self.UpdateCurrLong)
self.length_up = 3
self.dict = {}
def UpdateCurrLong(self):
interval = 3600*(self.Time.hour-17) + 60*(self.Time.minute - 5) + self.Time.second
if interval < 0:
self.uptrend = []
if interval >= 0 and interval < 26*27:
#self.Debug(f'INTERVAL #: {interval}')
#for sym in self.curr_universe:
for sym in self.dict.keys():
cont = False
if sym.Value[0] == string.ascii_uppercase[math.floor(interval/27)]:
if interval % 27 == 26:
if len(sym.Value) == 1:
cont = True
elif len(sym.Value) > 1:
if sym.Value[1] == string.ascii_uppercase[interval % 27]:
cont = True
if cont == True:
hist_obj = hist_window(self,sym)
if hist_obj.is_week_up() == False:
continue
if hist_obj.is_day_up() == False:
continue
#self.Log(f'INTERVAL: {interval}, current UPTREND: {self.uptrend}')
self.uptrend.append(sym.Value)
if interval == 26*27-1:
self.Log(f'UPTREND: {self.uptrend}')
interval = None
def CoarseSelectionFunction(self,coarse):
return [x.Symbol for x in coarse]
def FineSelectionFunction(self,fine):
#self.curr_universe = [f.Symbol for f in fine]
self.curr_universe = [f.Symbol for f in fine if f.Symbol.Value == "EZPW"]
for sym in self.curr_universe:
self.dict[sym]=hist_window(self,sym)
return self.curr_universe
class hist_window():
def __init__(self,algorithm,symbol):
self.algorithm = algorithm
self.length_up = algorithm.length_up
self.Symbol = symbol
self.WeekWindow = RollingWindow[TradeBar](self.length_up)
self.WeekConsolidator = TradeBarConsolidator(timedelta(weeks=1))
self.WeekConsolidator.DataConsolidated += self.OnWeekConsolidated
def is_day_up(self):
#self.hourbars = [TradeBar(bar.Index[1], self.Symbol, bar.open, bar.high, bar.low, bar.close, bar.volume) for bar in self.algorithm.History(self.Symbol, timedelta(days = 3) , Resolution.Hour).itertuples()]
self.hourbars = [bar for bar in self.algorithm.History(self.Symbol, self.length_up*8 , Resolution.Hour).itertuples()]
self.algorithm.Debug(f'{[(str(bar.Index[1]),bar.high,bar.low,bar.close) for bar in self.hourbars]}')
consol_day = []
day = None
high = None
low = None
close = None
for i in range(len(self.hourbars)):
bar = self.hourbars[i]
if day == None:
high = bar.high
low = bar.low
close = bar.close
day = bar.Index[1].day
elif bar.Index[1].day != day:
consol_day.append((high,low,close))
#consol_day.append((high,low))
high = bar.high
low = bar.low
close = bar.close
day = bar.Index[1].day
else:
high = max(high,bar.high)
low = min(low,bar.low)
close = bar.close
if i == len(self.hourbars)-1:
consol_day.append((high,low,close))
#consol_day.append((high,low))
#self.algorithm.Debug(f'CONSOL_DAY: {consol_day}')
for i in range(1,len(consol_day)):
for j in range(len(consol_day[-i])):
if consol_day[-i][j]<= consol_day[-i-1][j]:
return False
return True
def is_week_up(self):
self.bars = [TradeBar(bar.Index[1], self.Symbol, bar.open, bar.high, bar.low, bar.close, bar.volume) for bar in self.algorithm.History(self.Symbol, self.length_up*7 , Resolution.Daily).itertuples()]
if len(self.bars)<self.length_up*7:
return False
for bar in self.bars:
#daily_tradebar = TradeBar(bar.Index[1], self.Symbol, bar.open, bar.high, bar.low, bar.close, bar.volume)
self.WeekConsolidator.Update(bar)
for i in range(self.length_up-1):
if self.WeekWindow[i].High<=self.WeekWindow[i+1].High:
return False
if self.WeekWindow[i].Low<=self.WeekWindow[i+1].Low:
return False
if self.WeekWindow[i].Close<=self.WeekWindow[i+1].Close:
return False
return True
def OnWeekConsolidated(self, sender, bar):
#self.algorithm.Debug('WeekWindow')
self.WeekWindow.Add(bar)