// TODO no tuple? public static async Task <(decimal purchaseAmount, decimal quantity)> CalcPurchasePrice( this TradingPair tradingPair, decimal purchasePriceInBase) { decimal purchaseAmount = 0; decimal quantity = 0; OrderBook orderBook = await tradingPair.GetOrderBook(); for (int i = 0; i < orderBook.asksOrOffersYouCanBuy.Length; i++) { Order order = orderBook.asksOrOffersYouCanBuy[i]; decimal purchaseAmountFromOrder = Math.Min(purchasePriceInBase, order.price * order.volume); purchaseAmount += purchaseAmountFromOrder; quantity += purchaseAmountFromOrder / order.price; purchasePriceInBase -= purchaseAmountFromOrder; if (purchasePriceInBase <= 0) { break; } } return(purchaseAmount, quantity); }
public async Task OrderBook() { CrypnosticConfig config = new CrypnosticConfig(exchangeName); monitor = new CrypnosticController(config); await monitor.Start(); TradingPair tradingPair = popularQuoteCoin.GetTradingPair(popularBaseCoin, exchangeName); OrderBook orderBook = await tradingPair.GetOrderBook(); Assert.IsTrue(orderBook.asksOrOffersYouCanBuy.Length > 0); Assert.IsTrue(orderBook.asksOrOffersYouCanBuy[0].price > 0); Assert.IsTrue(orderBook.asksOrOffersYouCanBuy[0].volume > 0); Assert.IsTrue(orderBook.bidsOrOffersYouCanSell.Length > 0); Assert.IsTrue(orderBook.bidsOrOffersYouCanSell[0].price > 0); Assert.IsTrue(orderBook.bidsOrOffersYouCanSell[0].volume > 0); Assert.IsTrue(orderBook.asksOrOffersYouCanBuy[0].price >= orderBook.bidsOrOffersYouCanSell[0].price); Assert.IsTrue(orderBook.asksOrOffersYouCanBuy[1].price >= orderBook.asksOrOffersYouCanBuy[0].price); Assert.IsTrue(orderBook.bidsOrOffersYouCanSell[0].price >= orderBook.bidsOrOffersYouCanSell[1].price); }
public static async Task <decimal> CalcSellPrice( this TradingPair tradingPair, decimal quantityOfCoin) { decimal sellAmount = 0; OrderBook orderBook = await tradingPair.GetOrderBook(); for (int i = 0; i < orderBook.bidsOrOffersYouCanSell.Length; i++) { Order order = orderBook.bidsOrOffersYouCanSell[i]; decimal sellAmountFromOrder = Math.Min(quantityOfCoin, order.volume); sellAmount += sellAmountFromOrder * order.price; quantityOfCoin -= sellAmountFromOrder; if (quantityOfCoin <= 0) { break; } } return(sellAmount); }