| 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.349 Tracking Error 0.096 Treynor Ratio 0 Total Fees $0.00 |
clr.AddReference('QuantConnect.Research')
from QuantConnect.Research import QuantBook
import statistics
class TachyonMultidimensionalChamber(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 12, 5) # Set Start Date
self.SetEndDate(2020, 12, 18) # Set End Date
self.SetCash(400000) # Set Strategy Cash
self.AddUniverse(self.CoarseSelectionFunction)
self.SetSecurityInitializer(self.SecurityInitializer)
self.UniverseSettings.ExtendedMarketHours = True
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin)
self.UniverseSettings.Leverage = 4
#self.UniverseSettings.Resolution = Resolution.Hour #can comment/change this out
self.SetWarmUp(5)
#for s in self.Securities:
# self.Debug(self.Securities[s])
###variables to keep track of
self.sd = {} #all symbol data
self.pastNoPre = {}
self.pastWithPre = {}
self.keepPast = 500 #how many past periods (1 minute) to keep
self.hod = {}
self.lod = {}
self.open = {}
self.buffer = 0 #only enter trades after N buffer after open
self.ema5_past = {}
#self.pmhigh = {}
#self.pmlow = {}
#self.day = self.Debug(self.Time.weekday())
def SecurityInitializer(self, security):
security.SetLeverage(4)
def CoarseSelectionFunction(self, universe):
selected = []
for coarse in universe:
if coarse.Volume > 70000000 and coarse.Value > 10 and coarse.HasFundamentalData:
symbol = coarse.Symbol
selected.append(symbol)
return selected #list of objects of type Symbol
def OnSecuritiesChanged(self, changed):
for security in changed.AddedSecurities:
symbol = security.Symbol
if symbol not in self.sd:
self.sd[symbol] = SymbolData(self, symbol)
for security in changed.RemovedSecurities:
symbol = security.Symbol
self.sd.pop(symbol, None)
################
# my functions #
################
###sizing
def positionSize(self, stop, currPrice, dollarSize):
nShares = int(dollarSize / abs(stop - currPrice))
return nShares
###get stop
#most recent of oh_past is index 0, furthest is [-1]
def getStop(self, oh_past, vwap, atr):
#init and parse
firstToCross = -1000
low_postCross = 2000000000.0
#get first candle that crossed
for i in range(0, 5):
high, low = oh_past[i].split()
high = float(high)
if high > vwap:
firstToCross = i
#low of all candles post-cross
for i in range(0, i):
high, low = oh_past[i].split()
low = float(low)
if low < low_postCross:
low_postCross = low
return low_postCross + (.5*atr)
###reset VWAP
def OnEndOfDay(self):
for s in self.sd:
self.sd[s].vwap.Reset()
###consolidate bars
def consolidate(oneminutes, period, self):
consolidated = []
curr = 0
currOpen = 0
currHigh = 0
currLow = 2000000000
currClose = 0
currVol = 0
self.Debug("oneminutes")
self.Debug(oneminutes)
self.Debug("period")
self.Debug(period)
self.Debug("self")
self.Debug(self)
for i in range(0, len(oneminutes)):
curr += 1
o, h, l, c, v = oneminutes.split() #ignition bar
o = float(o)
h = float(h)
l = float(l)
c = float(c)
v = float(v)
#init
if curr == 1:
currOpen = o
#update
currVol += v
if h > currHigh:
currHigh = h
if low < currLow:
currLow = l
#have filled period up
if curr == period:
currClose = c
toappend = str(currOpen) + " " + str(currHigh) + " " + str(currLow) + " " + str(currClose) + " " + str(currVol)
consolidated.append(toappend)
#reset
currOpen = 0
currHigh = 0
currLow = 2000000000
currClose = 0
currVol = 0
curr = 0
return consolidated
###########
# on data #
###########
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
tradeBars = data.Bars #OHLC of past time interval
for s in self.sd:
curr_ohlcv = str(tradeBars[s].Open) + " " + str(tradeBars[s].High) + " " + str(tradeBars[s].Low) + " " + str(tradeBars[s].Close) + " " + str(tradeBars[s].Volume)
#calc and add range of past 500 candles, with premarket
if data.ContainsKey(s):
currRange = tradeBars[s].High - tradeBars[s].Low
if s not in self.pastWithPre:
self.pastWithPre[s] = []
self.pastWithPre[s].append(curr_ohlcv)
else:
if len(self.pastWithPre[s]) >= 500:
self.pastWithPre[s].pop()
self.pastWithPre[s].insert(0, curr_ohlcv)
#warming up
if self.IsWarmingUp:
return
#market is open now
if data.ContainsKey(s) and self.IsMarketOpen(s):
#save past 500
if s not in self.pastNoPre:
self.pastNoPre[s] = []
self.pastNoPre[s].append(curr_ohlcv)
else:
if len(self.pastNoPre[s]) >= 500:
self.pastNoPre[s].pop()
self.pastNoPre[s].insert(0, curr_ohlcv)
################
# trade setups #
################
### consolidation above VWAP, short-term trend up, has not traveled much of a daily ATR, in upper part of daily range --> ORB up
vwap = self.sd[s].vwap.Current.Value
ema5 = self.sd[s].ema5.Current.Value
ema9 = self.sd[s].ema9.Current.Value
atr5 = self.sd[s].atr5.Current.Value
#day_atr = self.atrDaily[d].Current.Value
price = float(tradeBars[s].Close)
#position size in dollars
size = 50.0
if s in self.pastWithPre and len(self.pastWithPre[s]) == self.keepPast: #ready
if self.Time.hour >= 15 and self.Time.minute >= 55:
self.Debug(s)
# #consolidate
# consolidated = self.consolidate(self.pastWithPre[s], self)
class SymbolData:
def __init__(self, algorithm, symbol):
#algorithm.VWAP(symbol, 10000, Resolution.Minute)
self.vwap = algorithm.VWAP(symbol, 2000, Resolution.Minute) #60*24 = 1440 minutes in a day
self.ema5 = algorithm.EMA(symbol, 5, Resolution.Minute)
self.ema9 = algorithm.EMA(symbol, 9, Resolution.Minute)
self.atr5 = algorithm.ATR(symbol, 5, Resolution.Minute)
hist = algorithm.History(symbol, 10, Resolution.Minute).loc[symbol]
for idx, bar in hist.iterrows():
tradeBar = TradeBar(idx, symbol, bar.open, bar.high, bar.low, bar.close, bar.volume, timedelta(minutes=1))
self.ema5.Update(idx, bar.close)
self.ema9.Update(idx, bar.close)
self.atr5.Update(tradeBar)
self.vwap.Update(tradeBar)