Ejemplo n.º 1
0
        private OrderModel CreateTradeOrder(AlertMessage alertMessage, BinancePlacedOrder trade, decimal?btcAmount, decimal?usdtAmount, decimal?currentBtcPrice, decimal?quantity)
        {
            if (trade == null)
            {
                _logger.LogError($"Trade was null. Bailing out.");
            }

            var model = new OrderModel
            {
                Id                    = Guid.NewGuid(),
                CreatedAt             = alertMessage.CreatedAt,
                OrderId               = trade.OrderId,
                MessageId             = alertMessage.MessageId,
                Completed             = false,
                USDTAmount            = usdtAmount,
                BTCAmount             = btcAmount,
                BTCToTradeAmount      = trade.ExecutedQuantity,
                BTCToTradeAmountValue = trade.CummulativeQuoteQuantity,
                BTCPrice              = trade.Price == 0 ? currentBtcPrice : trade.Price,
                PercentageToTrade     = alertMessage.PercentageToTrade,
                Buy                   = alertMessage.Buy,
                Sell                  = alertMessage.Sell
            };

            return(model);
        }
Ejemplo n.º 2
0
        // Ej: BTC-EUR
        // Buy:  EUR -> BTC
        // Sell: BTC -> EUR
        private static void MakeMoney()
        {
            BinancePlacedOrder buyPlaced = Client.Spot.Order
                                           .PlaceOrder(_session.Pair, OrderSide.Buy, OrderType.Market, null, _session.EurAvailable)
                                           .GetResult();

            decimal      buyFee = GetFee(buyPlaced);
            BinanceOrder buy    = WaitOrder(buyPlaced);

            _session.WantedPrice = buy.QuoteQuantity + buy.QuoteQuantity * _session.Profit / 100;
            string logBuy = $" Comprado: {buy.QuoteQuantity.Round()} - {buyFee.Round()} = {buy.QuoteQuantityFilled.Round()} Eur";

            _session.Logs.Add(logBuy);
            _session.UpdateAvailable();
            UiController.PrintSession(_session);

            int  count = 1;
            bool exit  = false;

            while (!exit)
            {
                Sleep(_session.IntervalMin * 6); // 10 veces

                decimal price       = Client.Spot.Market.GetPrice(_session.Pair).GetResult().Price;
                decimal actualPrice = buy.QuantityFilled * price; // Antes o despues de impuestos?
                decimal actualFees  = actualPrice * _session.TakerFee;
                decimal wouldGet    = actualPrice - actualFees;

                Console.WriteLine($" {count}/10 - Obtendría: {actualPrice.Round()} - {actualFees.Round()} = {wouldGet.Round()} Eur");

                if (wouldGet >= _session.WantedPrice)
                {
                    exit = true;
                }

                if (count >= 10)
                {
                    break;
                }

                count++;
            }

            BinancePlacedOrder sellPlaced = Client.Spot.Order
                                            .PlaceOrder(_session.Pair, OrderSide.Sell, OrderType.Market, buy.QuantityFilled)
                                            .GetResult();

            decimal      sellFee = GetFee(buyPlaced);
            BinanceOrder sell    = WaitOrder(sellPlaced);

            decimal finalSell = sell.QuoteQuantityFilled - sellFee;
            string  logSell   = $" Vendido: {sell.QuoteQuantityFilled.Round()} - {sellFee.Round()} = {finalSell.Round()} Eur";

            _session.Logs.Add(logSell);

            decimal balance = finalSell - buy.QuoteQuantity;

            _session.UpdateBalance(balance);
        }
Ejemplo n.º 3
0
        private static BinanceOrder WaitOrder(BinancePlacedOrder placedOrder)
        {
            BinanceOrder order = Client.Spot.Order.GetOrder(_session.Pair, placedOrder.OrderId, placedOrder.ClientOrderId).GetResult();

            while (order.Status != OrderStatus.Filled)
            {
                Thread.Sleep(1000);
                order = Client.Spot.Order.GetOrder(_session.Pair, placedOrder.OrderId, placedOrder.ClientOrderId).GetResult();
            }

            return(order);
        }
Ejemplo n.º 4
0
        private static decimal GetFee(BinancePlacedOrder placed)
        {
            if (placed.Fills == null)
            {
                throw new Exception("No hay fills! (Ver Account Trade List)");
            }

            decimal feePrice = Client.Spot.Market.GetPrice("BNBEUR").GetResult().Price;
            decimal fee      = placed.Fills.Sum(f => f.Commission) * feePrice;

            return(fee);
        }
Ejemplo n.º 5
0
        public void PlaceOrders(decimal quantity, decimal currrentClose, StrategyOutput strategyOutput, StrategyData strategyData)
        {
            BinancePlacedOrder placedOrder = null;

            if (strategyOutput == StrategyOutput.OpenPositionWithBuy || strategyOutput == StrategyOutput.ExitPositionWithBuy ||
                strategyOutput == StrategyOutput.BookProfitWithBuy || strategyOutput == StrategyOutput.MissedPositionBuy ||
                strategyOutput == StrategyOutput.ExitPositionHeavyLossWithBuy)
            {
                placedOrder = webCall.PlaceBuyOrder(quantity, -1, true);
            }

            else if (strategyOutput == StrategyOutput.OpenPositionWithSell || strategyOutput == StrategyOutput.ExitPositionWithSell ||
                     strategyOutput == StrategyOutput.BookProfitWithSell || strategyOutput == StrategyOutput.MissedPositionSell ||
                     strategyOutput == StrategyOutput.ExitPositionHeavyLossWithSell)
            {
                placedOrder = webCall.PlaceSellOrder(quantity, -1, true);
            }

            else if (strategyOutput == StrategyOutput.EscapeTrapWithBuy)
            {
                if (BinanceBotSettings.settings.ReOpenOnEscape)
                {
                    placedOrder = webCall.PlaceBuyOrder(quantity * 2, -1, true);
                }
                else
                {
                    placedOrder = webCall.PlaceBuyOrder(quantity, -1, true);
                }
            }

            else if (strategyOutput == StrategyOutput.EscapeTrapWithSell)
            {
                if (BinanceBotSettings.settings.ReOpenOnEscape)
                {
                    placedOrder = webCall.PlaceSellOrder(quantity * 2, -1, true);
                }
                else
                {
                    placedOrder = webCall.PlaceSellOrder(quantity, -1, true);
                }
            }
            else
            {
                //no action
            }

            if (placedOrder != null)
            {
                DumpToLog(currrentClose, strategyOutput.ToString(), strategyData);
            }
        }
Ejemplo n.º 6
0
        public void PlaceOrder_Should_RespondWithPlacedOrder()
        {
            // arrange
            var placed = new BinancePlacedOrder()
            {
                ClientOrderId = "test",
                OrderId       = 100000000000,
                Symbol        = "BNBBTC",
                TransactTime  = new DateTime(2017, 1, 1)
            };

            var client = PrepareClient(JsonConvert.SerializeObject(placed));

            // act
            var result = client.PlaceOrder("BNBBTC", OrderSide.Buy, OrderType.Limit, TimeInForce.GoodTillCancel, 1, 2);

            // assert
            Assert.IsTrue(result.Success);
            Assert.IsTrue(Compare.PublicInstancePropertiesEqual(placed, result.Data));
        }
Ejemplo n.º 7
0
        public void PlaceOrder_Should_RespondWithPlacedOrder()
        {
            // arrange
            var placed = new BinancePlacedOrder()
            {
                ClientOrderId = "test",
                OrderId       = 100000000000,
                Symbol        = "BNBBTC",
                TransactTime  = new DateTime(2017, 1, 1)
            };

            var objects = TestHelpers.PrepareClient(() => Construct(new BinanceClientOptions()
            {
                ApiCredentials = new ApiCredentials("Test", "Test")
            }), JsonConvert.SerializeObject(placed));

            // act
            var result = objects.Client.PlaceOrder("BNBBTC", OrderSide.Buy, OrderType.Limit, timeInForce: TimeInForce.GoodTillCancel, quantity: 1, price: 2);

            // assert
            Assert.IsTrue(result.Success);
            Assert.IsTrue(TestHelpers.PublicInstancePropertiesEqual(placed, result.Data));
        }
Ejemplo n.º 8
0
        public static ExchangeOrder ToOrder(this BinancePlacedOrder externalOrder)
        {
            if (externalOrder == null)
            {
                return(null);
            }

            ExchangeOrder order = new ExchangeOrder();

            order.Symbol           = externalOrder.Symbol;
            order.Status           = externalOrder.Status.ToStatus();
            order.OriginalQuantity = externalOrder.OriginalQuantity;
            order.OrderId          = long.Parse(externalOrder.ClientOrderId);
            order.ExchangeOrderId  = externalOrder.OrderId.ToString();
            order.OrderSideCode    = externalOrder.Side.ToCode();
            order.OrderTypeCode    = externalOrder.Type.ToCode();
            order.FillPoliticsCode = externalOrder.TimeInForce.ToCode();
            order.ExecutedQuantity = externalOrder.ExecutedQuantity;
            order.Price            = externalOrder.Price;
            order.TransactTime     = externalOrder.TransactTime;

            return(order);
        }
Ejemplo n.º 9
0
        public void PlaceMarginOrder_Should_RespondWithMarginPlacedOrder()
        {
            // arrange
            var placed = new BinancePlacedOrder()
            {
                ClientOrderId = "test",
                OrderId       = 100000000000,
                Symbol        = "BNBBTC",
                TransactTime  = new DateTime(2017, 1, 1)
            };

            var client = TestHelpers.CreateResponseClient(placed, new BinanceClientOptions()
            {
                ApiCredentials = new ApiCredentials("Test", "Test"),
                AutoTimestamp  = false
            });

            // act
            var result = client.PlaceMarginOrder("BTCUSDT", OrderSide.Buy, OrderType.Limit, timeInForce: TimeInForce.GoodTillCancel, quantity: 1, price: 2);

            // assert
            Assert.IsTrue(result.Success);
            Assert.IsTrue(TestHelpers.AreEqual(placed, result.Data));
        }
Ejemplo n.º 10
0
        private BinancePlacedOrder CloneBinancePlaceOrder(BinancePlacedOrder binancePlaced)
        {
            var clone = new BinancePlacedOrder()
            {
                ExecutedQuantity         = binancePlaced.ExecutedQuantity,
                Price                    = binancePlaced.Price,
                Status                   = binancePlaced.Status,
                OriginalQuantity         = binancePlaced.OriginalQuantity,
                TransactTime             = binancePlaced.TransactTime,
                OrderId                  = binancePlaced.OrderId,
                ClientOrderId            = binancePlaced.ClientOrderId,
                CummulativeQuoteQuantity = binancePlaced.CummulativeQuoteQuantity,
                Fills                    = binancePlaced.Fills,
                OrderListId              = binancePlaced.OrderListId,
                OriginalClientOrderId    = binancePlaced.OriginalClientOrderId,
                Side        = binancePlaced.Side,
                StopPrice   = binancePlaced.StopPrice,
                Symbol      = binancePlaced.Symbol,
                TimeInForce = binancePlaced.TimeInForce,
                Type        = binancePlaced.Type
            };

            return(clone);
        }