/* * 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 Newtonsoft.Json; using QuantConnect.Orders; namespace QuantConnect.Data.Market { /// /// Delisting event of a security /// public class Delisting : BaseData { /// /// Gets the type of delisting, warning or delisted /// A is sent /// [JsonProperty] public DelistingType Type { get; private set; } /// /// Gets the that was submitted to liquidate this position /// public OrderTicket Ticket { get; private set; } /// /// Initializes a new instance of the class /// public Delisting() { DataType = MarketDataType.Auxiliary; Type = DelistingType.Delisted; } /// /// Initializes a new instance of the class /// /// The delisted symbol /// The date the symbol was delisted /// The final price before delisting /// The type of delisting event public Delisting(Symbol symbol, DateTime date, decimal price, DelistingType type) : this() { Symbol = symbol; Time = date; Value = price; Type = type; } /// /// Sets the used to liquidate this position /// /// The ticket that represents the order to liquidate this position public void SetOrderTicket(OrderTicket ticket) { Ticket = ticket; } /// /// 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) { throw new NotImplementedException("This method is not supposed to be called on the Delisting 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) { 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 Delisting(Symbol, Time, Price, Type); } /// /// Formats a string with the symbol and value. /// /// string - a string formatted as SPY: 167.753 public override string ToString() { var type = Type == DelistingType.Warning ? "Delisting Warning" : "Delisted"; return $"{type}: {Symbol} {EndTime}"; } } }