Example #1
0
        /// <summary>
        /// Heartbeart Timer
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _heartbeatTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            // Stop the Timer
            _heartbeatTimer.Stop();

            if (!_socket.Connected)
            {
                return;
            }

            // Send Heartbeat Msg
            var request = new Messages.Heartbeat();

            SendData(request);

            // Heartbeat Management
            _heartbeatSendCount++;

            if (_heartbeatsMissed > 0)
            {
                var errmsg = "WARNING - " + _heartbeatsMissed + " Heartbeats have been Missed";
                OnErrorEvent(new ErrorEventArgs(null, errmsg));
            }

            // Check for Heartbeat Errors
            _heartbeatsMissed += Math.Abs(_heartbeatSendCount - _heartbeatReceiveCount);
            if (_heartbeatsMissed > Protocol.HeartbeatLossMaximum)
            {
                var msg = $"Exceeded HEARTBEAT_LOSS_MAXIMUM {Protocol.HeartbeatLossMaximum}";
                OnErrorEvent(new ErrorEventArgs(null, msg));
                Disconnect();
            }

            // Restart the Timer
            _heartbeatTimer.Start();
        }
Example #2
0
        private void _receiveWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                while (_receiveQueue.Count > 0)
                {
                    // Dequeue
                    _receiveQueue.TryDequeue(out var packet);

                    if (packet == null)
                    {
                        return;
                    }

                    // Message Processing
                    var message     = Utils.GetString(packet);
                    var messageType = Utils.GetMessageType(packet);

                    OnMessageReceiveEvent(messageType.ToString());
                    OnRawMessageReceiveEvent(packet, messageType);

                    // ReSharper disable once SwitchStatementMissingSomeCases
                    switch (messageType)
                    {
                    case Protocol.MessageType.GeneralLogMessage:
                    {
                        var response = JsonConvert.DeserializeObject <Messages.GeneralLogMessage>(message);
                        OnInformationEvent(response.MessageText);
                        break;
                    }

                    case Protocol.MessageType.Heartbeat:
                    {
                        LatestHeartbeatReceived = JsonConvert.DeserializeObject <Messages.Heartbeat>(message);

                        if (LatestHeartbeatReceived.NumDroppedMessages > 0)
                        {
                            OnInformationEvent("DTC Server Reports " +
                                               LatestHeartbeatReceived.NumDroppedMessages +
                                               " Dropped Heartbeats");
                        }

                        _heartbeatReceiveCount++;
                        _heartbeatsMissed = 0;
                        break;
                    }

                    case Protocol.MessageType.LogonResponse:
                    {
                        if (!_loginComplete)
                        {
                            LogonResponse = JsonConvert.DeserializeObject <Messages.LogonResponse>(message);

                            // Flag Login as Complete
                            _loginComplete = true;
                            _heartbeatTimer.Start();
                        }
                        break;
                    }

                    case Protocol.MessageType.MarketDataSnapshot:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateBidAsk:
                    {
                        var response = JsonConvert.DeserializeObject <Messages.MarketDataUpdateBidAsk>(message);
                        OnMarketDataBidAskEvent(response);

                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateBidAskCompact:
                    {
                        var response = JsonConvert.DeserializeObject <Messages.MarketDataUpdateBidAskCompact>(message);
                        OnMarketDataBidAskEvent(new Messages.MarketDataUpdateBidAsk(response));

                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionHigh:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionHighInt:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateLastTradeSnapshot:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionLow:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionLowInt:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionNumTrades:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionOpen:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionOpenInt:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionSettlement:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionSettlementInt:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.MarketDataUpdateSessionVolume:
                    {
                        /* No Action - Output Handled by Raw Message Event */
                        break;
                    }

                    case Protocol.MessageType.SecurityDefinitionReject:
                    {
                        var response = JsonConvert.DeserializeObject <Messages.SecurityDefinitionReject>(message);
                        var error    = "Security Definition Request " + response.RequestID +
                                       " was rejected with message '" + response.RejectText + "'";
                        OnErrorEvent(new ErrorEventArgs(null, error));
                        break;
                    }

                    case Protocol.MessageType.SecurityDefinitionResponse:
                    {
                        var response =
                            JsonConvert.DeserializeObject <Messages.SecurityDefinitionResponse>(message);
                        OnSymbolInformationEvent(response);
                        break;
                    }

                    default:
                    {
                        // Unsupported Message Type
                        OnErrorEvent(new ErrorEventArgs(null,
                                                        "Message Type " + messageType.ToString() + " Not Supported"));
                        break;
                    }
                    }
                }

                Thread.Sleep(1);
            }
        }