public async override void GetPortfolios() { if (!_isPortfolioSubscribed && !_loginFailed) { var accountResponse = await _ftxRestApi.GetAccountInfoAsync(); var isSuccessfull = accountResponse.SelectToken("success").Value <bool>(); var portfolios = new List <Portfolio>(); if (isSuccessfull) { var fillsRequest = FtxWebSockerRequestGenerator.GetSubscribeRequest("fills"); _wsSource.SendMessage(fillsRequest); var ordersRequest = FtxWebSockerRequestGenerator.GetSubscribeRequest("orders"); _wsSource.SendMessage(ordersRequest); portfolios.Add(_portfoliosCreator.Create( accountResponse.SelectToken("result"), "main")); } else { _loginFailed = true; SendLogMessage($"Can not get portfolios info.", LogMessageType.Error); portfolios.Add(_portfoliosCreator.Create("undefined")); } OnPortfolioEvent(portfolios); } }
private async void SourceAliveCheckerThread(CancellationToken token) { var pingMessage = FtxWebSockerRequestGenerator.GetPingRequest(); var sourceAliveCheckerStart = DateTime.Now; while (!token.IsCancellationRequested) { await Task.Delay(15000); _wsSource?.SendMessage(pingMessage); if (_lastTimeUpdateSocket == DateTime.MinValue) { if (sourceAliveCheckerStart.AddSeconds(60) < DateTime.Now) { break; } continue; } if (_lastTimeUpdateSocket.AddSeconds(60) < DateTime.Now) { break; } } if (!token.IsCancellationRequested) { SendLogMessage("The websocket is disabled. Restart", LogMessageType.Error); lock (_locker) { OnDisconnectEvent(); } } }
public override void Dispose() { try { if (_wsSource != null) { if (_isPortfolioSubscribed) { var fillsRequest = FtxWebSockerRequestGenerator.GetUnsubscribeRequest("fills"); _wsSource.SendMessage(fillsRequest); var ordersRequest = FtxWebSockerRequestGenerator.GetUnsubscribeRequest("orders"); _wsSource.SendMessage(ordersRequest); _isPortfolioSubscribed = false; _loginFailed = false; } if (_subscribedSecurities.Any()) { foreach (var security in _subscribedSecurities) { var unsubscribeMarket = FtxWebSockerRequestGenerator.GetUnsubscribeRequest("market", security); _wsSource.SendMessage(unsubscribeMarket); var unsubscribeOrderbook = FtxWebSockerRequestGenerator.GetUnsubscribeRequest("orderbook", security); _wsSource.SendMessage(unsubscribeOrderbook); } _subscribedSecurities.Clear(); } _wsSource.Dispose(); _wsSource.MessageEvent -= WsSourceMessageEvent; _wsSource = null; _securitiesCreator = null; _portfoliosCreator = null; _marketDepthCreator = null; _tradesCreator = null; _orderCreator = null; _candlesCreator = null; _client = null; _ftxRestApi = null; _myOrders.Clear(); _securityMarketDepths.Clear(); } if (_cancelTokenSource != null && !_cancelTokenSource.IsCancellationRequested) { _cancelTokenSource.Cancel(); } } catch (Exception e) { SendLogMessage("FTX dispose error: " + e, LogMessageType.Error); } }
public override void Subscrible(Security security) { if (!_subscribedSecurities.Contains(security.Name)) { var subscribeMarket = FtxWebSockerRequestGenerator.GetSubscribeRequest("trades", security.Name); _wsSource.SendMessage(subscribeMarket); var subscribeOrderbook = FtxWebSockerRequestGenerator.GetSubscribeRequest("orderbook", security.Name); _wsSource.SendMessage(subscribeOrderbook); } }
private static async Task WebSocketTests(FtxWebSocketApi wsApi, Client client) { var ins = "BTC-PERP"; wsApi.OnWebSocketConnect += () => { wsApi.SendCommand(FtxWebSockerRequestGenerator.GetAuthRequest(client)); wsApi.SendCommand(FtxWebSockerRequestGenerator.GetSubscribeRequest("orderbook", ins)); wsApi.SendCommand(FtxWebSockerRequestGenerator.GetSubscribeRequest("trades", ins)); wsApi.SendCommand(FtxWebSockerRequestGenerator.GetSubscribeRequest("ticker", ins)); wsApi.SendCommand(FtxWebSockerRequestGenerator.GetSubscribeRequest("fills")); wsApi.SendCommand(FtxWebSockerRequestGenerator.GetSubscribeRequest("orders")); }; await wsApi.Connect(); }
private void SendLoginMessage() { var loginMessage = FtxWebSockerRequestGenerator.GetAuthRequest(_client); _wsSource.SendMessage(loginMessage); }