/* * 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 System; using ProtoBuf; using static QuantConnect.StringExtensions; namespace QuantConnect.Data.Market { /// /// Dividend event from a security /// [ProtoContract(SkipConstructor = true)] public class Dividend : BaseData { /// /// Gets the dividend payment /// [ProtoMember(10)] public decimal Distribution { get { return Value; } set { Value = value; } } /// /// Gets the price at which the dividend occurred. /// This is typically the previous day's closing price /// [ProtoMember(11)] public decimal ReferencePrice { get; set; } /// /// Initializes a new instance of the Dividend class /// public Dividend() { DataType = MarketDataType.Auxiliary; } /// /// Initializes a new instance of the Dividend class /// /// The symbol /// The date /// The dividend amount /// The previous day's closing price public Dividend(Symbol symbol, DateTime date, decimal distribution, decimal referencePrice) : this() { Symbol = symbol; Time = date; Distribution = distribution; ReferencePrice = referencePrice; } /// /// Initializes a new instance of the Dividend class /// /// The symbol /// The date /// The previous day's closing price /// The ratio of the price factors, pf_i/pf_i+1 /// The number of decimal places to round the dividend's distribution to, defaulting to 2 public static Dividend Create(Symbol symbol, DateTime date, decimal referencePrice, decimal priceFactorRatio, int decimalPlaces = 2) { var distribution = ComputeDistribution(referencePrice, priceFactorRatio, decimalPlaces); return new Dividend(symbol, date, distribution, referencePrice); } /// /// Computes the price factor ratio given the previous day's closing price and the p /// /// Previous day's closing price /// Price factor ratio pf_i/pf_i+1 /// The number of decimal places to round the result to, defaulting to 2 /// The distribution rounded to the specified number of decimal places, defaulting to 2 public static decimal ComputeDistribution(decimal close, decimal priceFactorRatio, int decimalPlaces) { return Math.Round(close - close * priceFactorRatio, decimalPlaces); } /// /// Reader converts each line of the data source into BaseData objects. Each data type creates its own factory method, and returns a new instance of the object /// each time it is called. /// /// Subscription data config setup object /// Line of the source document /// Date of the requested data /// true if we're in live mode, false for backtesting mode /// Instance of the T:BaseData object generated by this line of the CSV public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, bool isLiveMode) { // this is implemented in the SubscriptionDataReader.CheckForDividend throw new NotImplementedException("This method is not supposed to be called on the Dividend type."); } /// /// Return the URL string source of the file. This will be converted to a stream /// /// Configuration object /// Date of this source file /// true if we're in live mode, false for backtesting mode /// String URL of source file. public override SubscriptionDataSource GetSource(SubscriptionDataConfig config, DateTime date, bool isLiveMode) { // this data is derived from map files and factor files in backtesting return null; } /// /// Return a new instance clone of this object, used in fill forward /// /// /// This base implementation uses reflection to copy all public fields and properties /// /// A clone of the current object public override BaseData Clone() { return new Dividend { Time = Time, Value = Value, Symbol = Symbol, EndTime = EndTime, DataType = DataType, Distribution = Distribution, ReferencePrice = ReferencePrice }; } /// /// Formats a string with the symbol and value. /// /// string - a string formatted as SPY: 167.753 public override string ToString() { return Invariant($"Dividend: {Symbol}: {Distribution} | {ReferencePrice}"); } } }