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

info.bitrich.xchangestream.coinmate.v2.CoinmateStreamingAdapter Maven / Gradle / Ivy

The newest version!
package info.bitrich.xchangestream.coinmate.v2;

import info.bitrich.xchangestream.coinmate.v2.dto.CoinmateWebSocketTrade;
import info.bitrich.xchangestream.coinmate.v2.dto.CoinmateWebSocketUserTrade;
import info.bitrich.xchangestream.coinmate.v2.dto.CoinmateWebsocketOpenOrder;
import java.math.BigDecimal;
import java.sql.Date;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import org.knowm.xchange.currency.CurrencyPair;
import org.knowm.xchange.dto.Order;
import org.knowm.xchange.dto.marketdata.Trade;
import org.knowm.xchange.dto.marketdata.Trades;
import org.knowm.xchange.dto.trade.LimitOrder;
import org.knowm.xchange.dto.trade.OpenOrders;
import org.knowm.xchange.dto.trade.UserTrade;
import org.knowm.xchange.dto.trade.UserTrades;

public class CoinmateStreamingAdapter {

  public static String getChannelPostfix(CurrencyPair currencyPair) {
    return currencyPair.base.toString().toUpperCase()
        + "_"
        + currencyPair.counter.toString().toUpperCase();
  }

  public static UserTrades adaptWebSocketUserTrades(
      List coinmateWebSocketUserTrades, CurrencyPair currencyPair) {
    List userTrades = new ArrayList<>();
    coinmateWebSocketUserTrades.forEach(
        (coinmateWebSocketUserTrade) -> {
          userTrades.add(
              UserTrade.builder()
                  .type(
                      (coinmateWebSocketUserTrade.getUserOrderType().equals("SELL"))
                          ? Order.OrderType.ASK
                          : Order.OrderType.BID)
                  .originalAmount(BigDecimal.valueOf(coinmateWebSocketUserTrade.getAmount()))
                  .currencyPair(currencyPair)
                  .price(BigDecimal.valueOf(coinmateWebSocketUserTrade.getPrice()))
                  .timestamp(
                      Date.from(Instant.ofEpochMilli(coinmateWebSocketUserTrade.getTimestamp())))
                  .id(coinmateWebSocketUserTrade.getTransactionId())
                  .orderId(
                      (coinmateWebSocketUserTrade.getUserOrderType().equals("SELL"))
                          ? coinmateWebSocketUserTrade.getSellOrderId()
                          : coinmateWebSocketUserTrade.getBuyOrderId())
                  .feeAmount(BigDecimal.valueOf(coinmateWebSocketUserTrade.getFee()))
                  .feeCurrency(currencyPair.counter)
                  .build());
        });
    return new UserTrades(userTrades, Trades.TradeSortType.SortByTimestamp);
  }

  public static OpenOrders adaptWebsocketOpenOrders(
      List coinmateWebsocketOpenOrders, CurrencyPair currencyPair) {
    List openOrders = new ArrayList<>();
    coinmateWebsocketOpenOrders.forEach(
        (coinmateWebsocketOpenOrder) -> {
          openOrders.add(
              new LimitOrder.Builder(
                      (coinmateWebsocketOpenOrder.getOrderType().contains("SELL"))
                          ? Order.OrderType.ASK
                          : Order.OrderType.BID,
                      currencyPair)
                  .originalAmount(BigDecimal.valueOf(coinmateWebsocketOpenOrder.getAmount()))
                  .cumulativeAmount(
                      BigDecimal.valueOf(coinmateWebsocketOpenOrder.getOriginalOrderSize()))
                  .id(coinmateWebsocketOpenOrder.getId())
                  .timestamp(
                      Date.from(Instant.ofEpochMilli(coinmateWebsocketOpenOrder.getTimestamp())))
                  .limitPrice(BigDecimal.valueOf(coinmateWebsocketOpenOrder.getPrice()))
                  .orderStatus(fromString(coinmateWebsocketOpenOrder.getOrderChangePushEvent()))
                  .build());
        });
    return new OpenOrders(openOrders);
  }

  private static Order.OrderStatus fromString(String orderChangePushEvent) {
    if (orderChangePushEvent == null) {
      return Order.OrderStatus.UNKNOWN;
    }
    switch (orderChangePushEvent) {
      case "CREATION":
        return Order.OrderStatus.NEW;
      case "UPDATE":
        return Order.OrderStatus.PARTIALLY_FILLED;
      case "REMOVAL":
        return Order.OrderStatus.CLOSED;
      case "SNAPSHOT":
        return Order.OrderStatus.OPEN;
    }
    return Order.OrderStatus.UNKNOWN;
  }

  public static Trade adaptTrade(CoinmateWebSocketTrade webSocketTrade, CurrencyPair currencyPair) {
    return new Trade(
        webSocketTrade.getType().equals("BUY") ? Order.OrderType.BID : Order.OrderType.ASK,
        webSocketTrade.getAmount(),
        currencyPair,
        webSocketTrade.getPrice(),
        new java.util.Date(webSocketTrade.getTimestamp()),
        null,
        webSocketTrade.getType().equals("BUY")
            ? webSocketTrade.getSellOrderId().toString()
            : webSocketTrade.getBuyOrderId().toString(),
        webSocketTrade.getType().equals("BUY")
            ? webSocketTrade.getBuyOrderId().toString()
            : webSocketTrade.getSellOrderId().toString());
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy