| 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.557 Tracking Error 0.202 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
# region imports
from AlgorithmImports import *
# endregion
class VolumeProfileAlgorithm(QCAlgorithm):
def Initialize(self) -> None:
self.SetStartDate(2022, 1, 1)
self.SetEndDate(2022, 12, 31)
self.SetCash(100000)
self.symbol = self.AddEquity("SPY", Resolution.Daily).Symbol
self.vp = self.VP(self.symbol, 10, 0.70, 0.05)
self.vah_window = RollingWindow[float](2)
self.val_window = RollingWindow[float](2)
self.WarmUpIndicator(self.symbol, self.vp)
self.Log("Time, Price, vah, val, d_vah, d_val, percentVal")
def OnData(self, data: Slice) -> None:
# find value area bounds and related values
if not self.vp.IsReady: return
vah = self.vp.ValueAreaHigh
val = self.vp.ValueAreaLow
self.vah_window.Add(vah)
self.val_window.Add(val)
if not self.vah_window.IsReady or not self.val_window.IsReady: return
d_vah = (self.vah_window[0] - self.vah_window[1]) / self.vah_window[1]
d_val = (self.val_window[0] - self.val_window[1]) / self.val_window[1]
# find asset price and related values
if not data.Bars.ContainsKey(self.symbol): return
price = data[self.symbol].Close
percentVal = (price-val) / (vah-val)
# update plots
self.Plot("Price Chart", "Asset Price", data[self.symbol].Close)
self.Plot("Price Chart", "POC", self.vp.POCPrice)
self.Plot("Price Chart", "Value area high", vah)
self.Plot("Price Chart", "Value area low", val)
self.Plot("Volume Chart", "Value area volume", self.vp.ValueAreaVolume)
# update logs
self.Log(f"{self.Time},{price},{vah},{val},{d_vah},{d_val},{percentVal}")