
org.knowm.xchange.binance.service.BinanceMarketDataService Maven / Gradle / Ivy
Show all versions of xchange-binance Show documentation
package org.knowm.xchange.binance.service;
import java.io.IOException;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.knowm.xchange.Exchange;
import org.knowm.xchange.binance.BinanceAdapters;
import org.knowm.xchange.binance.BinanceErrorAdapter;
import org.knowm.xchange.binance.dto.BinanceException;
import org.knowm.xchange.binance.dto.marketdata.BinanceAggTrades;
import org.knowm.xchange.binance.dto.marketdata.BinanceOrderbook;
import org.knowm.xchange.binance.dto.marketdata.BinanceTicker24h;
import org.knowm.xchange.currency.CurrencyPair;
import org.knowm.xchange.dto.Order.OrderType;
import org.knowm.xchange.dto.marketdata.OrderBook;
import org.knowm.xchange.dto.marketdata.Ticker;
import org.knowm.xchange.dto.marketdata.Trade;
import org.knowm.xchange.dto.marketdata.Trades;
import org.knowm.xchange.dto.marketdata.Trades.TradeSortType;
import org.knowm.xchange.dto.trade.LimitOrder;
import org.knowm.xchange.exceptions.ExchangeException;
import org.knowm.xchange.service.marketdata.MarketDataService;
import org.knowm.xchange.service.marketdata.params.Params;
public class BinanceMarketDataService extends BinanceMarketDataServiceRaw
implements MarketDataService {
public BinanceMarketDataService(Exchange exchange) {
super(exchange);
}
@Override
public OrderBook getOrderBook(CurrencyPair pair, Object... args) throws IOException {
try {
int limitDepth = 100;
if (args != null && args.length == 1) {
Object arg0 = args[0];
if (!(arg0 instanceof Integer)) {
throw new ExchangeException("Argument 0 must be an Integer!");
} else {
limitDepth = (Integer) arg0;
}
}
BinanceOrderbook binanceOrderbook = getBinanceOrderbook(pair, limitDepth);
return convertOrderBook(binanceOrderbook, pair);
} catch (BinanceException e) {
throw BinanceErrorAdapter.adapt(e);
}
}
public static OrderBook convertOrderBook(BinanceOrderbook ob, CurrencyPair pair) {
List bids =
ob.bids.entrySet().stream()
.map(e -> new LimitOrder(OrderType.BID, e.getValue(), pair, null, null, e.getKey()))
.collect(Collectors.toList());
List asks =
ob.asks.entrySet().stream()
.map(e -> new LimitOrder(OrderType.ASK, e.getValue(), pair, null, null, e.getKey()))
.collect(Collectors.toList());
return new OrderBook(null, asks, bids);
}
@Override
public Ticker getTicker(CurrencyPair pair, Object... args) throws IOException {
try {
return ticker24h(pair).toTicker();
} catch (BinanceException e) {
throw BinanceErrorAdapter.adapt(e);
}
}
@Override
public List getTickers(Params params) throws IOException {
try {
return ticker24h().stream().map(BinanceTicker24h::toTicker).collect(Collectors.toList());
} catch (BinanceException e) {
throw BinanceErrorAdapter.adapt(e);
}
}
/**
* optional parameters provided in the args array:
*
*
* - 0: Long fromId optional, ID to get aggregate trades from INCLUSIVE.
*
- 1: Long startTime optional, Timestamp in ms to get aggregate trades from INCLUSIVE.
*
- 2: Long endTime optional, Timestamp in ms to get aggregate trades until INCLUSIVE.
*
- 3: Integer limit optional, Default 500; max 500.
*
*
*
*/
@Override
public Trades getTrades(CurrencyPair pair, Object... args) throws IOException {
try {
Long fromId = tradesArgument(args, 0, Long::valueOf);
Long startTime = tradesArgument(args, 1, Long::valueOf);
Long endTime = tradesArgument(args, 2, Long::valueOf);
Integer limit = tradesArgument(args, 3, Integer::valueOf);
List aggTrades =
binance.aggTrades(BinanceAdapters.toSymbol(pair), fromId, startTime, endTime, limit);
List trades =
aggTrades.stream()
.map(
at ->
new Trade(
BinanceAdapters.convertType(at.buyerMaker),
at.quantity,
pair,
at.price,
at.getTimestamp(),
Long.toString(at.aggregateTradeId)))
.collect(Collectors.toList());
return new Trades(trades, TradeSortType.SortByTimestamp);
} catch (BinanceException e) {
throw BinanceErrorAdapter.adapt(e);
}
}
private T tradesArgument(
Object[] args, int index, Function converter) {
if (index >= args.length) {
return null;
}
Object arg = args[index];
if (arg == null) {
return null;
}
String argStr = arg.toString();
try {
return converter.apply(argStr);
} catch (NumberFormatException e) {
throw new IllegalArgumentException(
"Argument on index " + index + " is not a number: " + argStr, e);
}
}
}