/* * 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.Collections.Generic; using QuantConnect.Orders; namespace QuantConnect.Securities { /// /// Represents the model responsible for picking which orders should be executed during a margin call /// public interface IMarginCallModel { /// /// Scan the portfolio and the updated data for a potential margin call situation which may get the holdings below zero! /// If there is a margin call, liquidate the portfolio immediately before the portfolio gets sub zero. /// /// Set to true if a warning should be issued to the algorithm /// True for a margin call on the holdings. List GetMarginCallOrders(out bool issueMarginCallWarning); /// /// Executes synchronous orders to bring the account within margin requirements. /// /// These are the margin call orders that were generated /// by individual security margin models. /// The list of orders that were actually executed List ExecuteMarginCall(IEnumerable generatedMarginCallOrders); } /// /// Provides access to a null implementation for /// public static class MarginCallModel { /// /// Gets an instance of that will always /// return an empty list of executed orders. /// public static readonly IMarginCallModel Null = new NullMarginCallModel(); private sealed class NullMarginCallModel : IMarginCallModel { public List GetMarginCallOrders(out bool issueMarginCallWarning) { issueMarginCallWarning = false; return new List(); } public List ExecuteMarginCall(IEnumerable generatedMarginCallOrders) { return new List(); } } } }