package org.knowm.xchange.gemini.v1.service; import java.io.IOException; import java.util.Date; import java.util.List; import org.knowm.xchange.Exchange; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.marketdata.LoanOrderBook; import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Ticker; import org.knowm.xchange.dto.marketdata.Trades; import org.knowm.xchange.dto.trade.FixedRateLoanOrder; import org.knowm.xchange.dto.trade.FloatingRateLoanOrder; import org.knowm.xchange.exceptions.ExchangeException; import org.knowm.xchange.gemini.v1.GeminiAdapters; import org.knowm.xchange.gemini.v1.GeminiUtils; import org.knowm.xchange.gemini.v1.dto.marketdata.GeminiDepth; import org.knowm.xchange.gemini.v1.dto.marketdata.GeminiLendDepth; import org.knowm.xchange.gemini.v1.dto.marketdata.GeminiTrade; import org.knowm.xchange.service.marketdata.MarketDataService; /** * <p> * Implementation of the market data service for Gemini * </p> * <ul> * <li>Provides access to various market data values</li> * </ul> */ public class GeminiMarketDataService extends GeminiMarketDataServiceRaw implements MarketDataService { /** * Constructor * * @param exchange */ public GeminiMarketDataService(Exchange exchange) { super(exchange); } @Override public Ticker getTicker(CurrencyPair currencyPair, Object... args) throws IOException { return GeminiAdapters.adaptTicker(getGeminiTicker(GeminiUtils.toPairString(currencyPair)), currencyPair); } /** * @param args If two integers are provided, then those count as limit bid and limit ask count */ @Override public OrderBook getOrderBook(CurrencyPair currencyPair, Object... args) throws IOException { // null will cause fetching of full order book, the default behavior in XChange Integer limitBids = null; Integer limitAsks = null; if (args.length == 2) { Object arg0 = args[0]; if (!(arg0 instanceof Integer)) { throw new ExchangeException("Argument 0 must be an Integer!"); } else { limitBids = (Integer) arg0; } Object arg1 = args[1]; if (!(arg1 instanceof Integer)) { throw new ExchangeException("Argument 1 must be an Integer!"); } else { limitAsks = (Integer) arg1; } } GeminiDepth GeminiDepth = getGeminiOrderBook(GeminiUtils.toPairString(currencyPair), limitBids, limitAsks); OrderBook orderBook = GeminiAdapters.adaptOrderBook(GeminiDepth, currencyPair); return orderBook; } public LoanOrderBook getLendOrderBook(String currency, Object... args) throws IOException { // According to API docs, default is 50 int limitBids = 50; int limitAsks = 50; if (args.length == 2) { Object arg0 = args[0]; if (!(arg0 instanceof Integer)) { throw new ExchangeException("Argument 0 must be an Integer!"); } else { limitBids = (Integer) arg0; } Object arg1 = args[1]; if (!(arg1 instanceof Integer)) { throw new ExchangeException("Argument 1 must be an Integer!"); } else { limitAsks = (Integer) arg1; } } GeminiLendDepth GeminiLendDepth = getGeminiLendBook(currency, limitBids, limitAsks); List<FixedRateLoanOrder> fixedRateAsks = GeminiAdapters.adaptFixedRateLoanOrders(GeminiLendDepth.getAsks(), currency, "ask", ""); List<FixedRateLoanOrder> fixedRateBids = GeminiAdapters.adaptFixedRateLoanOrders(GeminiLendDepth.getBids(), currency, "bid", ""); List<FloatingRateLoanOrder> floatingRateAsks = GeminiAdapters.adaptFloatingRateLoanOrders(GeminiLendDepth.getAsks(), currency, "ask", ""); List<FloatingRateLoanOrder> floatingRateBids = GeminiAdapters.adaptFloatingRateLoanOrders(GeminiLendDepth.getBids(), currency, "bid", ""); return new LoanOrderBook(null, fixedRateAsks, fixedRateBids, floatingRateAsks, floatingRateBids); } /** * @param currencyPair The CurrencyPair for which to query trades. * @param args One argument may be supplied which is the timestamp after which trades should be collected. Trades before this time are not reported. * The argument may be of type java.util.Date or Number (milliseconds since Jan 1, 1970) */ @Override public Trades getTrades(CurrencyPair currencyPair, Object... args) throws IOException { long lastTradeTime = 0; if (args != null && args.length == 1) { // parameter 1, if present, is the last trade timestamp if (args[0] instanceof Number) { Number arg = (Number) args[0]; lastTradeTime = arg.longValue() / 1000; // divide by 1000 to convert to unix timestamp (seconds) } else if (args[0] instanceof Date) { Date arg = (Date) args[0]; lastTradeTime = arg.getTime() / 1000; // divide by 1000 to convert to unix timestamp (seconds) } else { throw new IllegalArgumentException( "Extra argument #1, the last trade time, must be a Date or Long (millisecond timestamp) (was " + args[0].getClass() + ")"); } } GeminiTrade[] trades = getGeminiTrades(GeminiUtils.toPairString(currencyPair), lastTradeTime); return GeminiAdapters.adaptTrades(trades, currencyPair); } }