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

info.bitrich.xchangestream.lgo.LgoAdapter Maven / Gradle / Ivy

The newest version!
package info.bitrich.xchangestream.lgo;

import static java.util.stream.Collectors.toList;

import info.bitrich.xchangestream.lgo.domain.LgoBatchOrderEvent;
import info.bitrich.xchangestream.lgo.domain.LgoMatchOrderEvent;
import info.bitrich.xchangestream.lgo.domain.LgoPendingOrderEvent;
import info.bitrich.xchangestream.lgo.dto.LgoTrade;
import info.bitrich.xchangestream.lgo.dto.LgoUserSnapshotData;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import org.knowm.xchange.currency.Currency;
import org.knowm.xchange.currency.CurrencyPair;
import org.knowm.xchange.dto.Order;
import org.knowm.xchange.dto.account.Balance;
import org.knowm.xchange.dto.marketdata.Trade;
import org.knowm.xchange.dto.trade.LimitOrder;
import org.knowm.xchange.dto.trade.MarketOrder;
import org.knowm.xchange.dto.trade.UserTrade;

public class LgoAdapter {

  static String channelName(String name, CurrencyPair currencyPair) {
    return name + "-" + currencyPair.base.toString() + "-" + currencyPair.counter.toString();
  }

  public static Trade adaptTrade(CurrencyPair currencyPair, LgoTrade lgoTrade) {
    return new Trade.Builder()
        .type(parseTradeType(lgoTrade))
        .originalAmount(lgoTrade.getQuantity())
        .currencyPair(currencyPair)
        .price(lgoTrade.getPrice())
        .timestamp(lgoTrade.getCreationTime())
        .id(lgoTrade.getId())
        .build();
  }

  static List adaptBalances(List> data) {
    return data.stream()
        .map(
            balance -> {
              Currency currency = Currency.getInstance(balance.get(0));
              BigDecimal available = new BigDecimal(balance.get(1));
              BigDecimal escrow = new BigDecimal(balance.get(2));
              BigDecimal total = available.add(escrow);
              return new Balance.Builder()
                  .currency(currency)
                  .total(total)
                  .available(available)
                  .frozen(escrow)
                  .build();
            })
        .collect(toList());
  }

  private static Order.OrderType parseTradeType(LgoTrade lgoTrade) {
    // the XChange API requires the taker order type whereas the LGO API gives the maker order type
    return lgoTrade.getSide().equals("B") ? Order.OrderType.ASK : Order.OrderType.BID;
  }

  private static Order.OrderType parseOrderType(String side) {
    return side.equals("B") ? Order.OrderType.BID : Order.OrderType.ASK;
  }

  static Collection adaptOrdersSnapshot(
      List orderEvents, CurrencyPair currencyPair) {
    return orderEvents.stream()
        .map(
            orderEvent -> {
              Order.OrderStatus status =
                  orderEvent.getQuantity().equals(orderEvent.getRemainingQuantity())
                      ? Order.OrderStatus.NEW
                      : Order.OrderStatus.PARTIALLY_FILLED;
              return new LimitOrder.Builder(parseOrderType(orderEvent.getSide()), currencyPair)
                  .id(orderEvent.getOrderId())
                  .userReference(null)
                  .originalAmount(orderEvent.getQuantity())
                  .remainingAmount(orderEvent.getRemainingQuantity())
                  .limitPrice(orderEvent.getPrice())
                  .orderStatus(status)
                  .timestamp(orderEvent.getOrderCreationTime())
                  .build();
            })
        .collect(toList());
  }

  public static Order adaptPendingOrder(
      LgoPendingOrderEvent orderEvent, CurrencyPair currencyPair) {
    if (orderEvent.getOrderType().equals("L")) {
      return adaptPendingLimitOrder(orderEvent, currencyPair);
    }
    return adaptPendingMarketOrder(orderEvent, currencyPair);
  }

  private static LimitOrder adaptPendingLimitOrder(
      LgoPendingOrderEvent orderEvent, CurrencyPair currencyPair) {
    return new LimitOrder.Builder(orderEvent.getSide(), currencyPair)
        .id(orderEvent.getOrderId())
        .originalAmount(orderEvent.getInitialAmount())
        .remainingAmount(orderEvent.getInitialAmount())
        .limitPrice(orderEvent.getLimitPrice())
        .orderStatus(Order.OrderStatus.PENDING_NEW)
        .timestamp(orderEvent.getTime())
        .build();
  }

  private static MarketOrder adaptPendingMarketOrder(
      LgoPendingOrderEvent orderEvent, CurrencyPair currencyPair) {
    return new MarketOrder.Builder(orderEvent.getSide(), currencyPair)
        .id(orderEvent.getOrderId())
        .originalAmount(orderEvent.getInitialAmount())
        .cumulativeAmount(BigDecimal.ZERO)
        .orderStatus(Order.OrderStatus.PENDING_NEW)
        .timestamp(orderEvent.getTime())
        .build();
  }

  static List adaptOrderEvent(
      List data, Long batchId, List openOrders) {
    data.forEach(
        e -> {
          e.setBatchId(batchId);
          if ("match".equals(e.getType())) {
            LgoMatchOrderEvent matchEvent = (LgoMatchOrderEvent) e;
            Optional matchedOrder =
                openOrders.stream()
                    .filter(order -> order.getId().equals(e.getOrderId()))
                    .findFirst();
            matchEvent.setOrderType(matchedOrder.map(Order::getType).orElse(null));
          }
        });
    return data;
  }

  static UserTrade adaptUserTrade(CurrencyPair currencyPair, LgoMatchOrderEvent event) {
    return UserTrade.builder()
        .type(event.getOrderType())
        .originalAmount(event.getFilledQuantity())
        .currencyPair(currencyPair)
        .price(event.getTradePrice())
        .timestamp(event.getTime())
        .id(event.getTradeId())
        .orderId(event.getOrderId())
        .feeAmount(event.getFees())
        .feeCurrency(currencyPair.counter)
        .build();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy