using System; using System.Threading; using Newtonsoft.Json; using QuantConnect.Orders; using QuantConnect.Packets; using NetMQ; using NetMQ.Sockets; namespace QuantConnect.Views { public class DesktopClient { private volatile bool _stopServer = false; /// /// This 0MQ Pull socket accepts certain messages from a 0MQ Push socket /// /// The port on which to listen /// The handler which will display the repsonses public void Run(string port, IDesktopMessageHandler handler) { //Allow proper decoding of orders. JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new OrderJsonConverter() } }; using (var pullSocket = new PullSocket(">tcp://localhost:" + port)) { while (!_stopServer) { var message = pullSocket.ReceiveMultipartMessage(); // There should only be 1 part messages if (message.FrameCount != 1) continue; var payload = message[0].ConvertToString(); var packet = JsonConvert.DeserializeObject(payload); switch (packet.Type) { case PacketType.BacktestNode: var backtestJobModel = JsonConvert.DeserializeObject(payload); handler.Initialize(backtestJobModel); break; case PacketType.LiveNode: var liveJobModel = JsonConvert.DeserializeObject(payload); handler.Initialize(liveJobModel); break; case PacketType.Debug: var debugEventModel = JsonConvert.DeserializeObject(payload); handler.DisplayDebugPacket(debugEventModel); break; case PacketType.HandledError: var handleErrorEventModel = JsonConvert.DeserializeObject(payload); handler.DisplayHandledErrorPacket(handleErrorEventModel); break; case PacketType.BacktestResult: var backtestResultEventModel = JsonConvert.DeserializeObject(payload); handler.DisplayBacktestResultsPacket(backtestResultEventModel); break; case PacketType.RuntimeError: var runtimeErrorEventModel = JsonConvert.DeserializeObject(payload); handler.DisplayRuntimeErrorPacket(runtimeErrorEventModel); break; case PacketType.Log: var logEventModel = JsonConvert.DeserializeObject(payload); handler.DisplayLogPacket(logEventModel); break; } } } } /// /// Stop the running of the loop /// public void StopServer() { _stopServer = true; } } }