private void EnableKlineStreams() { var successKlineStream = Socket.SubscribeToKlineStream( Configuration.Instance.EnabledAlgorithm.AlgorithmConfiguration.TradingPairs.First().ToString(), BinanceUtilities.ToInternalKline(Configuration.Instance.CandleWidth), candle => { if (candle.Data.Final) { _candleDispenserImplementation.Publish(BinanceUtilities.ToInternal(candle)); } }); if (!successKlineStream.Success) { _logger.LogError(successKlineStream.Error.Message); Program.ExitProgramWithCode(ExitCode.BinanceCommunicationStartupFailure); } successKlineStream.Data.ConnectionLost += () => { _logger.LogCritical($"Kline stream got closed at {DateTime.UtcNow}, attempting reconnect..."); }; successKlineStream.Data.ConnectionRestored += t => { _logger.LogCritical($"Kline stream was restored after {t}"); }; }
private void EnableOrderStreams() { // Obtain listenKey var response = _listenKeyManager.Obtain(); if (!response.Success) { _logger.LogError("Unable to obtain listenKey"); Program.ExitProgramWithCode(ExitCode.BinanceCommunicationStartupFailure); } var listenKey = response.Data; // Start socket connection // TODO: Is this correct? // TODO: TradeId is not correct. var successOrderBook = Socket.SubscribeToUserStream( listenKey, accountInfoUpdate => { // TODO: Implement AccountInfoUpdate callback }, orderInfoUpdate => { // ########################################################################## // ####### WARNING ########################################################## // ### Any exception will cause this method to shutdown without warning, // ### causing the observers to hear nothing. This is completely shitty behavior, // ### do not make the mistake I made and waste your time. // ########################################################################## try { _logger.LogDebug(JsonConvert.SerializeObject(orderInfoUpdate)); OrderUpdateDispenserImplementation.Publish(BinanceUtilities.ToInternal(orderInfoUpdate)); } catch (Exception e) { _logger.LogError($"Error parsing a BinanceOrderInfoUpdate: {e.Message} \n {JsonConvert.SerializeObject(orderInfoUpdate)}"); } }); if (!successOrderBook.Success) { _logger.LogError(successOrderBook.Error.Message); Program.ExitProgramWithCode(ExitCode.BinanceCommunicationStartupFailure); } // Set error handler successOrderBook.Data.ConnectionLost += () => { _logger.LogCritical($"Order stream got closed at {DateTime.UtcNow}, attempting reconnect..."); }; successOrderBook.Data.ConnectionRestored += t => _logger.LogCritical($"Order stream was restored after {t}"); }
/// <inheritdoc /> public override ResponseObject <OrderUpdate> ExecuteMarketOrder(TradingPair pair, OrderSide side, decimal quantity, long tradeId) { var client = _communications.Client; var realQuantity = pair.RoundToTradable(quantity); // Attempt to place the order on Binance var query = client.PlaceOrder( symbol: pair.ToString(), side: BinanceUtilities.ToExternal(side), type: OrderType.Market, quantity: realQuantity, newClientOrderId: null, price: null, timeInForce: null, stopPrice: null, icebergQty: null, orderResponseType: null, (int)_communications.ReceiveWindow); // Report failure of placing market order if (!query.Success) { Logger.LogError($"Placing market order {side} {realQuantity} {pair.Left} failed! --> {query.Error.Message}"); return(new ResponseObject <OrderUpdate>(ResponseCode.Error, query.Error.Message)); } var order = query.Data; // Create an order update with known information OrderUpdate result = new OrderUpdate( orderId: order.OrderId, tradeId: tradeId, orderStatus: OrderUpdate.OrderStatus.Filled, orderType: BinanceUtilities.ToInternal(order.Type), createdTimestamp: DateTimeOffset.Now.ToUnixTimeMilliseconds(), setPrice: 0, // This information is unknown for market orders side: side, pair: pair, setQuantity: realQuantity) { FilledQuantity = order.ExecutedQuantity, FilledTimestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(), AverageFilledPrice = HelperMethods.SafeDiv(order.CummulativeQuoteQuantity, order.ExecutedQuantity), }; return(new ResponseObject <OrderUpdate>(ResponseCode.Success, result)); }