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

org.knowm.xchange.coinmate.service.CoinmateTradeService Maven / Gradle / Ivy

/*
 * The MIT License
 *
 * Copyright 2015-2016 Coinmate.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

package org.knowm.xchange.coinmate.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.knowm.xchange.Exchange;
import org.knowm.xchange.coinmate.CoinmateAdapters;
import org.knowm.xchange.coinmate.CoinmateException;
import org.knowm.xchange.coinmate.CoinmateUtils;
import org.knowm.xchange.coinmate.dto.trade.CoinmateCancelOrderResponse;
import org.knowm.xchange.coinmate.dto.trade.CoinmateOpenOrders;
import org.knowm.xchange.coinmate.dto.trade.CoinmateOrder;
import org.knowm.xchange.coinmate.dto.trade.CoinmateOrderFlags;
import org.knowm.xchange.coinmate.dto.trade.CoinmateReplaceResponse;
import org.knowm.xchange.coinmate.dto.trade.CoinmateTradeHistory;
import org.knowm.xchange.coinmate.dto.trade.CoinmateTradeResponse;
import org.knowm.xchange.currency.CurrencyPair;
import org.knowm.xchange.dto.Order;
import org.knowm.xchange.dto.trade.LimitOrder;
import org.knowm.xchange.dto.trade.MarketOrder;
import org.knowm.xchange.dto.trade.OpenOrders;
import org.knowm.xchange.dto.trade.StopOrder;
import org.knowm.xchange.dto.trade.UserTrades;
import org.knowm.xchange.service.trade.TradeService;
import org.knowm.xchange.service.trade.params.CancelOrderByIdParams;
import org.knowm.xchange.service.trade.params.CancelOrderParams;
import org.knowm.xchange.service.trade.params.TradeHistoryParamCurrencyPair;
import org.knowm.xchange.service.trade.params.TradeHistoryParamLimit;
import org.knowm.xchange.service.trade.params.TradeHistoryParamOffset;
import org.knowm.xchange.service.trade.params.TradeHistoryParams;
import org.knowm.xchange.service.trade.params.TradeHistoryParamsIdSpan;
import org.knowm.xchange.service.trade.params.TradeHistoryParamsSorted;
import org.knowm.xchange.service.trade.params.TradeHistoryParamsTimeSpan;
import org.knowm.xchange.service.trade.params.orders.OpenOrdersParamCurrencyPair;
import org.knowm.xchange.service.trade.params.orders.OpenOrdersParams;
import org.knowm.xchange.service.trade.params.orders.OrderQueryParams;

/**
 * @author Martin Stachon
 */
public class CoinmateTradeService extends CoinmateTradeServiceRaw implements TradeService {

  public CoinmateTradeService(Exchange exchange) {
    super(exchange);
  }

  @Override
  public OpenOrders getOpenOrders() throws IOException {
    return getOpenOrders(createOpenOrdersParams());
  }

  @Override
  public OpenOrders getOpenOrders(OpenOrdersParams params) throws IOException {
    CurrencyPair currencyPair = null;
    if (params instanceof OpenOrdersParamCurrencyPair) {
      currencyPair = ((OpenOrdersParamCurrencyPair) params).getCurrencyPair();
    }

    String currencyPairString = CoinmateUtils.getPair(currencyPair);
    CoinmateOpenOrders coinmateOpenOrders = getCoinmateOpenOrders(currencyPairString);

    List orders = CoinmateAdapters.adaptOpenOrders(coinmateOpenOrders);
    List hiddenOrders = CoinmateAdapters.adaptStopOrders(coinmateOpenOrders);
    return new OpenOrders(orders, hiddenOrders);
  }

  @Override
  public Collection getOrder(OrderQueryParams... orderQueryParams) throws IOException {
    ArrayList result = new ArrayList<>(orderQueryParams.length);
    for (OrderQueryParams orderQueryParam : orderQueryParams) {
      CoinmateOrder response = this.getCoinmateOrderById(orderQueryParam.getOrderId());
      Order order =
          CoinmateAdapters.adaptOrder(
              response.getData(),
              orderId -> {
                try {
                  return this.getCoinmateOrderById(orderId).getData();
                } catch (IOException ex) {
                  return null;
                }
              });
      result.add(order);
    }
    return result;
  }

  @Override
  public String placeMarketOrder(MarketOrder marketOrder) throws IOException {
    CoinmateTradeResponse response;

    if (marketOrder.getType().equals(Order.OrderType.ASK)) {
      response =
          sellCoinmateInstant(
              marketOrder.getOriginalAmount(),
              CoinmateUtils.getPair(marketOrder.getCurrencyPair()),
              marketOrder.getUserReference());
    } else if (marketOrder.getType().equals(Order.OrderType.BID)) {
      response =
          buyCoinmateInstant(
              marketOrder.getOriginalAmount(),
              CoinmateUtils.getPair(marketOrder.getCurrencyPair()),
              marketOrder.getUserReference());
    } else {
      throw new CoinmateException("Unknown order type");
    }

    return Long.toString(response.getData());
  }

  @Override
  public String placeLimitOrder(LimitOrder limitOrder) throws IOException {
    CoinmateTradeResponse response;
    boolean hidden = limitOrder.getOrderFlags().contains(CoinmateOrderFlags.HIDDEN);
    boolean immediateOrCancel =
        limitOrder.getOrderFlags().contains(CoinmateOrderFlags.IMMEDIATE_OR_CANCEL);
    boolean trailing = limitOrder.getOrderFlags().contains(CoinmateOrderFlags.TRAILING);
    boolean postOnly = limitOrder.getOrderFlags().contains(CoinmateOrderFlags.POST_ONLY);

    if (limitOrder.getType().equals(Order.OrderType.ASK)) {
      response =
          sellCoinmateLimit(
              limitOrder.getOriginalAmount(),
              limitOrder.getLimitPrice(),
              CoinmateUtils.getPair(limitOrder.getCurrencyPair()),
              null,
              hidden ? 1 : 0,
              postOnly ? 1 : 0,
              immediateOrCancel ? 1 : 0,
              trailing ? 1 : 0,
              limitOrder.getUserReference());
    } else if (limitOrder.getType().equals(Order.OrderType.BID)) {
      response =
          buyCoinmateLimit(
              limitOrder.getOriginalAmount(),
              limitOrder.getLimitPrice(),
              CoinmateUtils.getPair(limitOrder.getCurrencyPair()),
              null,
              hidden ? 1 : 0,
              postOnly ? 1 : 0,
              immediateOrCancel ? 1 : 0,
              trailing ? 1 : 0,
              limitOrder.getUserReference());
    } else {
      throw new CoinmateException("Unknown order type");
    }

    return Long.toString(response.getData());
  }

  @Override
  public String placeStopOrder(StopOrder stopOrder) throws IOException {
    CoinmateTradeResponse response;
    boolean hidden = stopOrder.getOrderFlags().contains(CoinmateOrderFlags.HIDDEN);
    boolean immediateOrCancel =
        stopOrder.getOrderFlags().contains(CoinmateOrderFlags.IMMEDIATE_OR_CANCEL);
    boolean trailing = stopOrder.getOrderFlags().contains(CoinmateOrderFlags.TRAILING);
    boolean postOnly = stopOrder.getOrderFlags().contains(CoinmateOrderFlags.POST_ONLY);

    if (stopOrder.getType().equals(Order.OrderType.ASK)) {
      response =
          sellCoinmateLimit(
              stopOrder.getOriginalAmount(),
              stopOrder.getLimitPrice(),
              CoinmateUtils.getPair(stopOrder.getCurrencyPair()),
              stopOrder.getStopPrice(),
              hidden ? 1 : 0,
              postOnly ? 1 : 0,
              immediateOrCancel ? 1 : 0,
              trailing ? 1 : 0,
              stopOrder.getUserReference());
    } else if (stopOrder.getType().equals(Order.OrderType.BID)) {
      response =
          buyCoinmateLimit(
              stopOrder.getOriginalAmount(),
              stopOrder.getLimitPrice(),
              CoinmateUtils.getPair(stopOrder.getCurrencyPair()),
              stopOrder.getStopPrice(),
              hidden ? 1 : 0,
              postOnly ? 1 : 0,
              immediateOrCancel ? 1 : 0,
              trailing ? 1 : 0,
              stopOrder.getUserReference());
    } else {
      throw new CoinmateException("Unknown order type");
    }

    return Long.toString(response.getData());
  }

  @Override
  public boolean cancelOrder(String orderId) throws IOException {
    CoinmateCancelOrderResponse response = cancelCoinmateOrder(orderId);

    return response.getData();
  }

  @Override
  public boolean cancelOrder(CancelOrderParams orderParams) throws IOException {
    if (orderParams instanceof CancelOrderByIdParams) {
      return cancelOrder(((CancelOrderByIdParams) orderParams).getOrderId());
    } else {
      return false;
    }
  }

  @Override
  public UserTrades getTradeHistory(TradeHistoryParams params) throws IOException {
    TradeHistoryParamsSorted.Order order = TradeHistoryParamsSorted.Order.asc;
    Integer limit = 1000;
    int offset = 0;
    CurrencyPair currencyPair = null;
    String startId = null;

    if (params instanceof TradeHistoryParamOffset) {
      offset = Math.toIntExact(((TradeHistoryParamOffset) params).getOffset());
    }

    if (params instanceof TradeHistoryParamLimit) {
      limit = ((TradeHistoryParamLimit) params).getLimit();
    }

    if (params instanceof TradeHistoryParamsSorted) {
      order = ((TradeHistoryParamsSorted) params).getOrder();
    }

    if (params instanceof TradeHistoryParamCurrencyPair) {
      currencyPair = ((TradeHistoryParamCurrencyPair) params).getCurrencyPair();
    }

    if (params instanceof TradeHistoryParamsIdSpan) {
      startId = ((TradeHistoryParamsIdSpan) params).getStartId();
    }

    Long timestampFrom = null;
    Long timestampTo = null;
    if (params instanceof TradeHistoryParamsTimeSpan) {
      TradeHistoryParamsTimeSpan thpts = (TradeHistoryParamsTimeSpan) params;
      if (thpts.getStartTime() != null) {
        timestampFrom = thpts.getStartTime().getTime();
      }
      if (thpts.getEndTime() != null) {
        timestampTo = thpts.getEndTime().getTime();
      }
    }

    CoinmateTradeHistory coinmateTradeHistory =
        getCoinmateTradeHistory(
            CoinmateUtils.getPair(currencyPair),
            limit,
            CoinmateAdapters.adaptSortOrder(order),
            startId,
            timestampFrom,
            timestampTo,
            null);
    return CoinmateAdapters.adaptTradeHistory(coinmateTradeHistory);
  }

  @Override
  public String changeOrder(LimitOrder limitOrder) throws IOException {
    boolean hidden = limitOrder.getOrderFlags().contains(CoinmateOrderFlags.HIDDEN);
    boolean immediateOrCancel =
        limitOrder.getOrderFlags().contains(CoinmateOrderFlags.IMMEDIATE_OR_CANCEL);
    boolean trailing = limitOrder.getOrderFlags().contains(CoinmateOrderFlags.TRAILING);
    boolean postOnly = limitOrder.getOrderFlags().contains(CoinmateOrderFlags.POST_ONLY);

    CoinmateReplaceResponse response;
    if (limitOrder.getType().equals(Order.OrderType.ASK)) {
      response =
          coinmateReplaceBySellLimit(
              limitOrder.getId(),
              limitOrder.getOriginalAmount(),
              limitOrder.getLimitPrice(),
              CoinmateUtils.getPair(limitOrder.getCurrencyPair()),
              null,
              hidden ? 1 : 0,
              postOnly ? 1 : 0,
              immediateOrCancel ? 1 : 0,
              trailing ? 1 : 0,
              limitOrder.getUserReference());
    } else if (limitOrder.getType().equals(Order.OrderType.BID)) {
      response =
          coinmateReplaceByBuyLimit(
              limitOrder.getId(),
              limitOrder.getOriginalAmount(),
              limitOrder.getLimitPrice(),
              CoinmateUtils.getPair(limitOrder.getCurrencyPair()),
              null,
              hidden ? 1 : 0,
              postOnly ? 1 : 0,
              immediateOrCancel ? 1 : 0,
              trailing ? 1 : 0,
              limitOrder.getUserReference());
    } else {
      throw new CoinmateException("Unknown order type");
    }

    return Long.toString(response.getData().getCreatedOrderId());
  }

  @Override
  public TradeHistoryParams createTradeHistoryParams() {
    return new CoinmateTradeHistoryHistoryParams();
  }

  @Override
  public CoinmateOpenOrdersParams createOpenOrdersParams() {
    return new CoinmateOpenOrdersParams();
  }

  public static class CoinmateTradeHistoryHistoryParams
      implements TradeHistoryParamOffset,
          TradeHistoryParamLimit,
          TradeHistoryParamsSorted,
          TradeHistoryParamsIdSpan,
          TradeHistoryParamsTimeSpan {

    private Integer limit;
    private Long offset;
    private Order order;
    private String startId;
    private Date startTime;
    private Date endTime;

    public CoinmateTradeHistoryHistoryParams(Integer limit, Long offset, Order order) {
      this.limit = limit;
      this.offset = offset;
      this.order = order;
    }

    public CoinmateTradeHistoryHistoryParams() {
      this(100, 0L, Order.asc);
    }

    @Override
    public Integer getLimit() {
      return limit;
    }

    @Override
    public void setLimit(Integer limit) {
      this.limit = limit;
    }

    @Override
    public Long getOffset() {
      return offset;
    }

    @Override
    public void setOffset(Long offset) {
      this.offset = offset;
    }

    @Override
    public Order getOrder() {
      return order;
    }

    @Override
    public void setOrder(Order order) {
      this.order = order;
    }

    @Override
    public String getStartId() {
      return startId;
    }

    @Override
    public void setStartId(String startId) {
      this.startId = startId;
    }

    @Override
    public String getEndId() {
      return null;
    }

    @Override
    public void setEndId(String endId) {
      throw new UnsupportedOperationException("Coinmate doesn't support start id.");
    }

    @Override
    public Date getStartTime() {
      return startTime;
    }

    @Override
    public void setStartTime(Date startTime) {
      this.startTime = startTime;
    }

    @Override
    public Date getEndTime() {
      return endTime;
    }

    @Override
    public void setEndTime(Date endTime) {
      this.endTime = endTime;
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy