/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ using QuantConnect.Data.Market; namespace QuantConnect.Indicators { /// /// Volume Weighted Average Price (VWAP) Indicator: /// It is calculated by adding up the dollars traded for every transaction (price multiplied /// by number of shares traded) and then dividing by the total shares traded for the day. /// public class VolumeWeightedAveragePriceIndicator : TradeBarIndicator, IIndicatorWarmUpPeriodProvider { /// /// In this VWAP calculation, typical price is defined by (O + H + L + C) / 4 /// private readonly int _period; /// /// Indentity indicator for price /// protected Identity Price { get; } /// /// Identity indicator for volume /// protected Identity Volume { get; } /// /// Volume Weighted Average Price /// protected CompositeIndicator VWAP { get; } /// /// Initializes a new instance of the VWAP class with the default name and period /// /// The period of the VWAP public VolumeWeightedAveragePriceIndicator(int period) : this($"VWAP({period})", period) { } /// /// Initializes a new instance of the VWAP class with a given name and period /// /// string - the name of the indicator /// The period of the VWAP public VolumeWeightedAveragePriceIndicator(string name, int period) : base(name) { _period = period; Price = new Identity("Price"); Volume = new Identity("Volume"); // This class will be using WeightedBy indicator extension VWAP = Price.WeightedBy(Volume, period); } /// /// Gets a flag indicating when this indicator is ready and fully initialized /// public override bool IsReady => VWAP.IsReady; /// /// Required period, in data points, for the indicator to be ready and fully initialized. /// public int WarmUpPeriod => _period; /// /// Resets this indicator to its initial state /// public override void Reset() { Price.Reset(); Volume.Reset(); VWAP.Reset(); base.Reset(); } /// /// Computes the next value of this indicator from the given state /// /// The input given to the indicator /// A new value for this indicator protected override decimal ComputeNextValue(TradeBar input) { Price.Update(input.EndTime, GetTimeWeightedAveragePrice(input)); Volume.Update(input.EndTime, input.Volume); return VWAP.Current.Value; } /// /// Gets an estimated average price to use for the interval covered by the input trade bar. /// /// The current trade bar input /// An estimated average price over the trade bar's interval protected virtual decimal GetTimeWeightedAveragePrice(TradeBar input) { return (input.Open + input.High + input.Low + input.Value) / 4; } } }