/// <summary>
        /// Connects to a UserData Websocket endpoint.
        /// </summary>
        /// <param name="parameters">Paremeters to send to the Websocket.</param>
        /// <param name="accountHandler">Deletage to callback after receive a account info message.</param>
        /// <param name="tradeHandler">Deletage to callback after receive a trade message.</param>
        /// <param name="orderHandler">Deletage to callback after receive a order message.</param>
        public void ConnectToUserDataWebSocket(string parameters,
                                               Action <AccountUpdatedMessage> accountHandler,
                                               Action <OrderOrTradeUpdatedMessage> tradeHandler,
                                               Action <OrderOrTradeUpdatedMessage> orderHandler)
        {
            var finalEndpoint = WebSocketEndPoint + parameters;

            var ws = new WebSocket(finalEndpoint);

            ws.OnMessage += (sender, e) =>
            {
                var eventData = JsonConvert.DeserializeObject <dynamic>(e.Data);

                switch (eventData.e)
                {
                case "outboundAccountInfo":
                    accountHandler(JsonConvert.DeserializeObject <AccountUpdatedMessage>(e.Data));
                    break;

                case "executionReport":
                    var isTrade = ((string)eventData.x).ToLower() == "trade";

                    if (isTrade)
                    {
                        tradeHandler(JsonConvert.DeserializeObject <OrderOrTradeUpdatedMessage>(e.Data));
                    }
                    else
                    {
                        orderHandler(JsonConvert.DeserializeObject <OrderOrTradeUpdatedMessage>(e.Data));
                    }
                    break;
                }
            };

            ws.OnClose += (sender, e) =>
            {
                OpenSockets.Remove(ws);
            };

            ws.OnError += (sender, e) =>
            {
                OpenSockets.Remove(ws);
            };

            ws.Connect();
            OpenSockets.Add(ws);
        }
        /// <summary>
        /// Connects to a Websocket endpoint.
        /// </summary>
        /// <typeparam name="T">Type used to parsed the response message.</typeparam>
        /// <param name="parameters">Paremeters to send to the Websocket.</param>
        /// <param name="messageDelegate">Deletage to callback after receive a message.</param>
        /// <param name="useCustomParser">Specifies if needs to use a custom parser for the response message.</param>
        public void ConnectToWebSocket <T>(string parameters, Action <T> messageAction, bool useCustomParser = false)
        {
            var finalEndpoint = WebSocketEndPoint + parameters;

            var ws = new WebSocket(finalEndpoint);

            ws.OnMessage += (sender, e) =>
            {
                dynamic eventData;

                if (useCustomParser)
                {
                    var customParser = new CustomParser();
                    eventData = customParser.GetParsedDepthMessage(JsonConvert.DeserializeObject <dynamic>(e.Data));
                }
                else
                {
                    eventData = JsonConvert.DeserializeObject <T>(e.Data);
                }

                messageAction(eventData);
            };

            ws.OnClose += (sender, e) =>
            {
                OpenSockets.Remove(ws);
            };

            ws.OnError += (sender, e) =>
            {
                OpenSockets.Remove(ws);
            };

            ws.Connect();
            OpenSockets.Add(ws);
        }