All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.knowm.xchange.binance.service.BinanceMarketDataService Maven / Gradle / Ivy

The newest version!
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); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy