| 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 -45.015 Tracking Error 0.025 Treynor Ratio 0 Total Fees $0.00 |
class TachyonParticleCoil(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 10, 23) # Set Start Date
self.SetEndDate(2019, 10, 25) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.AddEquity("SPY", Resolution.Minute)
self.volume_per_level = {}
def OnData(self, data):
if not data.ContainsKey("SPY"):
return
# Get price range of candle
low = round(data['SPY'].Low, 2)
high = round(data['SPY'].High, 2)
price_range = high - low
# Get volume per penny level throughout candle
vol_per_level = price_range / data['SPY'].Volume
# Update dictionary that saves volume at each level
for i in range(int(price_range * 100)):
key = f"{i/100 + low}"
if key not in self.volume_per_level.keys():
self.volume_per_level[key] = vol_per_level
else:
self.volume_per_level[key] += vol_per_level
def OnEndOfDay(self):
# Set target volume - 70% of daily volume
target_vol = sum(self.volume_per_level.values()) * 0.7
# Get the price level that had the largest volume
max_vol_price = max(self.volume_per_level, key=self.volume_per_level.get)
# Setup a window to capture the POC, centered at the most liquid level
curr_max_price = float(max_vol_price)
curr_min_price = float(max_vol_price)
curr_vol = self.volume_per_level[max_vol_price]
# Grow window bounds until we have 70% of the day's volume captured
while curr_vol < target_vol:
# Price one level up
price_up = str(round(curr_max_price + 0.01, 2))
price_up_vol = 0
# Price one level down
price_down = str(round(curr_min_price - 0.01, 2))
price_down_vol = 0
# Get associated volume at new potential levels
if price_up in self.volume_per_level.keys():
price_up_vol = self.volume_per_level[price_up]
if price_down in self.volume_per_level.keys():
price_down_vol = self.volume_per_level[price_down]
# Grow window in the direction of more volume
if price_up_vol > price_down_vol:
curr_max_price = round(float(price_up), 2)
curr_vol += self.volume_per_level[price_up]
else:
curr_min_price = round(float(price_down), 2)
curr_vol += self.volume_per_level[price_down]
self.Log(f"Max: {curr_max_price}")
self.Log(f"Min: {curr_min_price}")
self.volume_per_level.clear()