Beispiel #1
0
        public async Task <BitmexApiResult <TResult> > Execute <TParams, TResult>(ApiActionAttributes <TParams, TResult> apiAction, TParams @params)
        {
            switch (apiAction.Method)
            {
            case HttpMethods.GET:
            {
                var getQueryParams   = @params as IQueryStringParams;
                var serializedResult = await _bitmexApiProxy.Get(apiAction.Action, getQueryParams);

                var deserializedResult = BitmexJsonSerializer.Deserialize <TResult>(serializedResult.Result);
                return(serializedResult.ToResultType <TResult>(deserializedResult));
            }

            case HttpMethods.POST:
            {
                var postQueryParams  = @params as IJsonQueryParams;
                var serializedResult = await _bitmexApiProxy.Post(apiAction.Action, postQueryParams);

                var deserializedResult = BitmexJsonSerializer.Deserialize <TResult>(serializedResult.Result);
                return(serializedResult.ToResultType <TResult>(deserializedResult));
            }

            case HttpMethods.PUT:
            {
                var putQueryParams   = @params as IJsonQueryParams;
                var serializedResult = await _bitmexApiProxy.Put(apiAction.Action, putQueryParams);

                var deserializedResult = BitmexJsonSerializer.Deserialize <TResult>(serializedResult.Result);
                return(serializedResult.ToResultType <TResult>(deserializedResult));
            }

            case HttpMethods.DELETE:
            {
                var deleteQueryParams = @params as IQueryStringParams;
                var serializedResult  = await _bitmexApiProxy.Delete(apiAction.Action, deleteQueryParams);

                var deserializedResult = BitmexJsonSerializer.Deserialize <TResult>(serializedResult.Result);
                return(serializedResult.ToResultType <TResult>(deserializedResult));
            }

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Beispiel #2
0
        public bool Connect()
        {
            CloseConnectionIfItsNotNull();
            _socketConnection = new WebSocket($"wss://{Environments.Values[_bitmexEnvironment]}/realtime")
            {
                EnableAutoSendPing = true, AutoSendPingInterval = 2
            };
            BitmexWelcomeMessage welcomeData = null;
            EventHandler <MessageReceivedEventArgs> welcomeMessageReceived = (sender, e) =>
            {
                _logger.LogDebug($"Welcome Data Received {e.Message}");
                welcomeData = BitmexJsonSerializer.Deserialize <BitmexWelcomeMessage>(e.Message);
                _welcomeReceived.Set();
            };

            _socketConnection.MessageReceived += welcomeMessageReceived;
            _socketConnection.Open();
            var waitResult = _welcomeReceived.WaitOne(SocketMessageResponseTimeout);

            _socketConnection.MessageReceived -= welcomeMessageReceived;
            if (waitResult && (welcomeData?.Limit?.Remaining ?? 0) == 0)
            {
                _logger.LogError("Bitmex connection limit reached");
                throw new BitmexWebSocketLimitReachedException();
            }

            if (!waitResult)
            {
                _logger.LogError("Open connection timeout. Welcome message is not received");
                return(false);
            }

            if (IsAlive)
            {
                _logger.LogInformation("Bitmex web socket connection opened");
                _socketConnection.MessageReceived += SocketConnectionOnMessageReceived;
                _socketConnection.Closed          += SocketConnectionOnClosed;
                _socketConnection.Error           += SocketConnectionOnError;
            }

            return(IsAlive);
        }