Пример #1
0
        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}");
            };
        }
Пример #2
0
        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}");
        }
Пример #3
0
        /// <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));
        }