/* * 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.Util; using QuantConnect.Packets; using QuantConnect.Commands; using QuantConnect.Interfaces; using QuantConnect.Data.UniverseSelection; using QuantConnect.Lean.Engine.DataFeeds.Transport; namespace QuantConnect.Lean.Engine.Server { /// /// NOP implementation of the ILeanManager interface /// public class LocalLeanManager : ILeanManager { /// /// The current algorithm /// protected IAlgorithm Algorithm { get; set; } private AlgorithmNodePacket _job; private ICommandHandler _commandHandler; /// /// The system handlers /// protected LeanEngineSystemHandlers SystemHandlers { get; set; } /// /// The algorithm handlers /// protected LeanEngineAlgorithmHandlers AlgorithmHandlers { get; set; } /// /// Empty implementation of the ILeanManager interface /// /// Exposes lean engine system handlers running LEAN /// Exposes the lean algorithm handlers running lean /// The job packet representing either a live or backtest Lean instance /// The Algorithm manager public virtual void Initialize(LeanEngineSystemHandlers systemHandlers, LeanEngineAlgorithmHandlers algorithmHandlers, AlgorithmNodePacket job, AlgorithmManager algorithmManager) { AlgorithmHandlers = algorithmHandlers; SystemHandlers = systemHandlers; _job = job; } /// /// Sets the IAlgorithm instance in the ILeanManager /// /// The IAlgorithm instance being run public virtual void SetAlgorithm(IAlgorithm algorithm) { Algorithm = algorithm; algorithm.SetApi(SystemHandlers.Api); RemoteFileSubscriptionStreamReader.SetDownloadProvider((Api.Api)SystemHandlers.Api); } /// /// Execute the commands using the IAlgorithm instance /// public virtual void Update() { if(_commandHandler != null) { foreach (var commandResultPacket in _commandHandler.ProcessCommands()) { AlgorithmHandlers.Results.Messages.Enqueue(commandResultPacket); } } } /// /// This method is called after algorithm initialization /// public virtual void OnAlgorithmStart() { if (Algorithm.LiveMode) { SetCommandHandler(); } } /// /// This method is called before algorithm termination /// public virtual void OnAlgorithmEnd() { // NOP } /// /// Callback fired each time that we add/remove securities from the data feed /// public virtual void OnSecuritiesChanged(SecurityChanges changes) { // NOP } /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// public virtual void Dispose() { _commandHandler.DisposeSafely(); } /// /// Set the command handler to use, protected for testing purposes /// protected virtual void SetCommandHandler() { _commandHandler = new FileCommandHandler(); _commandHandler.Initialize(_job, Algorithm); } } }