package org.knowm.xchange.anx.v2;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.knowm.xchange.anx.v2.dto.account.ANXAccountInfo;
import org.knowm.xchange.anx.v2.dto.account.ANXWallet;
import org.knowm.xchange.anx.v2.dto.marketdata.ANXOrder;
import org.knowm.xchange.anx.v2.dto.marketdata.ANXTicker;
import org.knowm.xchange.anx.v2.dto.marketdata.ANXTrade;
import org.knowm.xchange.anx.v2.dto.meta.ANXMetaData;
import org.knowm.xchange.anx.v2.dto.trade.ANXOpenOrder;
import org.knowm.xchange.anx.v2.dto.trade.ANXTradeResult;
import org.knowm.xchange.currency.Currency;
import org.knowm.xchange.currency.CurrencyPair;
import org.knowm.xchange.dto.Order.OrderType;
import org.knowm.xchange.dto.account.AccountInfo;
import org.knowm.xchange.dto.account.Balance;
import org.knowm.xchange.dto.account.Wallet;
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.dto.trade.UserTrade;
import org.knowm.xchange.dto.trade.UserTrades;
import org.knowm.xchange.utils.DateUtils;
/**
* Various adapters for converting from anx DTOs to XChange DTOs
*/
public final class ANXAdapters {
private static final String SIDE_BID = "bid";
private static final int PERCENT_DECIMAL_SHIFT = 2;
/**
* private Constructor
*/
private ANXAdapters() {
}
/**
* Adapts a ANXAccountInfo to an AccountInfo
*
* @param anxAccountInfo
* @return
*/
public static AccountInfo adaptAccountInfo(ANXAccountInfo anxAccountInfo) {
// Adapt to XChange DTOs
AccountInfo accountInfo = new AccountInfo(anxAccountInfo.getLogin(), percentToFactor(anxAccountInfo.getTradeFee()),
ANXAdapters.adaptWallet(anxAccountInfo.getWallets()));
return accountInfo;
}
public static BigDecimal percentToFactor(BigDecimal percent) {
return percent.movePointLeft(PERCENT_DECIMAL_SHIFT);
}
/**
* Adapts a ANXOrder to a LimitOrder
*
* @param price
* @param orderTypeString
* @return
*/
public static LimitOrder adaptOrder(BigDecimal amount, BigDecimal price, String tradedCurrency, String transactionCurrency, String orderTypeString,
String id, Date timestamp) {
// place a limit order
OrderType orderType = SIDE_BID.equalsIgnoreCase(orderTypeString) ? OrderType.BID : OrderType.ASK;
CurrencyPair currencyPair = adaptCurrencyPair(tradedCurrency, transactionCurrency);
LimitOrder limitOrder = new LimitOrder(orderType, amount, currencyPair, id, timestamp, price);
return limitOrder;
}
/**
* Adapts a List of ANXOrders to a List of LimitOrders
*
* @param anxOrders
* @param currency
* @param orderType
* @return
*/
public static List<LimitOrder> adaptOrders(List<ANXOrder> anxOrders, String tradedCurrency, String currency, String orderType, String id) {
List<LimitOrder> limitOrders = new ArrayList<LimitOrder>();
for (ANXOrder anxOrder : anxOrders) {
limitOrders.add(adaptOrder(anxOrder.getAmount(), anxOrder.getPrice(), tradedCurrency, currency, orderType, id, new Date(anxOrder.getStamp())));
}
return limitOrders;
}
public static List<LimitOrder> adaptOrders(ANXOpenOrder[] anxOpenOrders) {
List<LimitOrder> limitOrders = new ArrayList<LimitOrder>();
for (ANXOpenOrder anxOpenOrder : anxOpenOrders) {
limitOrders.add(adaptOrder(anxOpenOrder.getAmount().getValue(), anxOpenOrder.getPrice().getValue(), anxOpenOrder.getItem(),
anxOpenOrder.getCurrency(), anxOpenOrder.getType(), anxOpenOrder.getOid(), new Date(anxOpenOrder.getDate())));
}
return limitOrders;
}
/**
* Adapts a ANX Wallet to a XChange Balance
*
* @param anxWallet
* @return
*/
public static Balance adaptBalance(ANXWallet anxWallet) {
if (anxWallet == null) { // use the presence of a currency String to indicate existing wallet at ANX
return null; // an account maybe doesn't contain a ANXWallet
} else {
return new Balance(Currency.getInstance(anxWallet.getBalance().getCurrency()), anxWallet.getBalance().getValue(),
anxWallet.getAvailableBalance().getValue());
}
}
/**
* Adapts a List of ANX Wallets to an XChange Wallet
*
* @param anxWallets
* @return
*/
public static Wallet adaptWallet(Map<String, ANXWallet> anxWallets) {
List<Balance> balances = new ArrayList<Balance>();
for (ANXWallet anxWallet : anxWallets.values()) {
Balance balance = adaptBalance(anxWallet);
if (balance != null) {
balances.add(balance);
}
}
return new Wallet(balances);
}
// public static OrderBookUpdate adaptDepthUpdate(ANXDepthUpdate anxDepthUpdate) {
//
// OrderType orderType = anxDepthUpdate.getTradeType().equals("bid") ? OrderType.BID : OrderType.ASK;
// BigDecimal volume = new BigDecimal(anxDepthUpdate.getVolumeInt()).divide(new BigDecimal(ANXUtils.BTC_VOLUME_AND_AMOUNT_INT_2_DECIMAL_FACTOR));
//
// String tradableIdentifier = anxDepthUpdate.getItem();
// String transactionCurrency = anxDepthUpdate.getCurrency();
// CurrencyPair currencyPair = new CurrencyPair(tradableIdentifier, transactionCurrency);
//
// BigDecimal price = ANXUtils.getPrice(anxDepthUpdate.getPriceInt());
//
// BigDecimal totalVolume = new BigDecimal(anxDepthUpdate.getTotalVolumeInt()).divide(new BigDecimal(ANXUtils.BTC_VOLUME_AND_AMOUNT_INT_2_DECIMAL_FACTOR));
// Date date = new Date(anxDepthUpdate.getNow() / 1000);
//
// OrderBookUpdate orderBookUpdate = new OrderBookUpdate(orderType, volume, currencyPair, price, date, totalVolume);
//
// return orderBookUpdate;
// }
/**
* Adapts ANXTrade's to a Trades Object
*
* @param anxTrades
* @return
*/
public static Trades adaptTrades(List<ANXTrade> anxTrades) {
List<Trade> tradesList = new ArrayList<Trade>();
long latestTid = 0;
for (ANXTrade anxTrade : anxTrades) {
long tid = anxTrade.getTid();
if (tid > latestTid) {
latestTid = tid;
}
tradesList.add(adaptTrade(anxTrade));
}
return new Trades(tradesList, latestTid, TradeSortType.SortByID);
}
/**
* Adapts a ANXTrade to a Trade Object
*
* @param anxTrade
* @return
*/
public static Trade adaptTrade(ANXTrade anxTrade) {
OrderType orderType = adaptSide(anxTrade.getTradeType());
BigDecimal amount = anxTrade.getAmount();
BigDecimal price = anxTrade.getPrice();
CurrencyPair currencyPair = adaptCurrencyPair(anxTrade.getItem(), anxTrade.getPriceCurrency());
Date dateTime = DateUtils.fromMillisUtc(anxTrade.getTid());
final String tradeId = String.valueOf(anxTrade.getTid());
return new Trade(orderType, amount, currencyPair, price, dateTime, tradeId);
}
public static Ticker adaptTicker(ANXTicker anxTicker) {
BigDecimal volume = anxTicker.getVol().getValue();
BigDecimal last = anxTicker.getLast().getValue();
BigDecimal bid = anxTicker.getBuy().getValue();
BigDecimal ask = anxTicker.getSell().getValue();
BigDecimal high = anxTicker.getHigh().getValue();
BigDecimal low = anxTicker.getLow().getValue();
Date timestamp = new Date(anxTicker.getNow() / 1000);
CurrencyPair currencyPair = adaptCurrencyPair(anxTicker.getVol().getCurrency(), anxTicker.getAvg().getCurrency());
return new Ticker.Builder().currencyPair(currencyPair).last(last).bid(bid).ask(ask).high(high).low(low).volume(volume).timestamp(timestamp)
.build();
}
public static CurrencyPair adaptCurrencyPair(String tradeCurrency, String priceCurrency) {
return new CurrencyPair(tradeCurrency, priceCurrency);
}
public static UserTrades adaptUserTrades(ANXTradeResult[] anxTradeResults, ANXMetaData meta) {
List<UserTrade> trades = new ArrayList<UserTrade>(anxTradeResults.length);
for (ANXTradeResult tradeResult : anxTradeResults) {
trades.add(adaptUserTrade(tradeResult, meta));
}
long lastId = trades.size() > 0 ? anxTradeResults[0].getTimestamp().getTime() : 0L;
return new UserTrades(trades, lastId, TradeSortType.SortByTimestamp);
}
private static UserTrade adaptUserTrade(ANXTradeResult aNXTradeResult, ANXMetaData meta) {
BigDecimal tradedCurrencyFillAmount = aNXTradeResult.getTradedCurrencyFillAmount();
CurrencyPair currencyPair = adaptCurrencyPair(aNXTradeResult.getCurrencyPair());
int priceScale = meta.getCurrencyPairs().get(currencyPair).getPriceScale();
BigDecimal price = aNXTradeResult.getSettlementCurrencyFillAmount().divide(tradedCurrencyFillAmount, priceScale, BigDecimal.ROUND_HALF_EVEN);
OrderType type = adaptSide(aNXTradeResult.getSide());
// for fees, getWalletHistory should be used.
return new UserTrade(type, tradedCurrencyFillAmount, currencyPair, price, aNXTradeResult.getTimestamp(), aNXTradeResult.getTradeId(),
aNXTradeResult.getOrderId(), null, (Currency) null);
}
private static CurrencyPair adaptCurrencyPair(String currencyPairRaw) {
if ("DOGEBTC".equalsIgnoreCase(currencyPairRaw)) {
return CurrencyPair.DOGE_BTC;
} else if (currencyPairRaw.length() != 6) {
throw new IllegalArgumentException("Unrecognized currency pair " + currencyPairRaw);
} else {
return new CurrencyPair(currencyPairRaw.substring(0, 3), currencyPairRaw.substring(3));
}
}
private static OrderType adaptSide(String side) {
return SIDE_BID.equals(side) ? OrderType.BID : OrderType.ASK;
}
}