package org.knowm.xchange.service; import java.math.BigDecimal; import org.knowm.xchange.Exchange; import org.knowm.xchange.dto.Order; import org.knowm.xchange.dto.meta.CurrencyPairMetaData; import org.knowm.xchange.dto.meta.ExchangeMetaData; import org.knowm.xchange.dto.trade.LimitOrder; import org.knowm.xchange.dto.trade.MarketOrder; /** * Top of the hierarchy abstract class for an "exchange service" */ public abstract class BaseExchangeService { /** * The base Exchange. Every service has access to the containing exchange class, which hold meta data and the exchange specification */ protected final Exchange exchange; /** * Constructor */ protected BaseExchangeService(Exchange exchange) { this.exchange = exchange; } public void verifyOrder(LimitOrder limitOrder) { ExchangeMetaData exchangeMetaData = exchange.getExchangeMetaData(); verifyOrder(limitOrder, exchangeMetaData); BigDecimal price = limitOrder.getLimitPrice().stripTrailingZeros(); if (price.scale() > exchangeMetaData.getCurrencyPairs().get(limitOrder.getCurrencyPair()).getPriceScale()) { throw new IllegalArgumentException("Unsupported price scale " + price.scale()); } } public void verifyOrder(MarketOrder marketOrder) { verifyOrder(marketOrder, exchange.getExchangeMetaData()); } final protected void verifyOrder(Order order, ExchangeMetaData exchangeMetaData) { CurrencyPairMetaData metaData = exchangeMetaData.getCurrencyPairs().get(order.getCurrencyPair()); if (metaData == null) { throw new IllegalArgumentException("Invalid CurrencyPair"); } BigDecimal tradableAmount = order.getTradableAmount(); if (tradableAmount == null) { throw new IllegalArgumentException("Missing tradableAmount"); } BigDecimal amount = tradableAmount.stripTrailingZeros(); BigDecimal minimumAmount = metaData.getMinimumAmount(); if (amount.scale() > minimumAmount.scale()) { throw new IllegalArgumentException("Unsupported amount scale " + amount.scale()); } else if (amount.compareTo(minimumAmount) < 0) { throw new IllegalArgumentException("Order amount less than minimum"); } } }