diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/BitVcAdapters.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/BitVcAdapters.java index 1fc670aaa9e..1f4d5e1a4cc 100644 --- a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/BitVcAdapters.java +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/BitVcAdapters.java @@ -19,6 +19,7 @@ import com.xeiam.xchange.ExchangeException; import com.xeiam.xchange.bitvc.dto.account.BitVcAccountInfo; +import com.xeiam.xchange.bitvc.dto.account.HuobiAccountInfo; import com.xeiam.xchange.bitvc.dto.marketdata.BitVcDepth; import com.xeiam.xchange.bitvc.dto.marketdata.BitVcOrderBookTAS; import com.xeiam.xchange.bitvc.dto.marketdata.BitVcTicker; @@ -115,6 +116,21 @@ public static AccountInfo adaptAccountInfo(BitVcAccountInfo a) { List wallets = Arrays.asList(cny, btc, ltc, cnyLoan, btcLoan, ltcLoan); return new AccountInfo(null, wallets); } + + public static AccountInfo adaptHuobiAccountInfo(HuobiAccountInfo a) { + + Wallet cny = new Wallet(CNY, a.getAvailableCnyDisplay().add(a.getFrozenCnyDisplay()).subtract(a.getLoanCnyDisplay()), "available"); + Wallet btc = new Wallet(BTC, a.getAvailableBtcDisplay().add(a.getFrozenBtcDisplay()).subtract(a.getLoanBtcDisplay()), "available"); + Wallet ltc = new Wallet(LTC, a.getAvailableLtcDisplay().add(a.getFrozenLtcDisplay()).subtract(a.getLoanLtcDisplay()), "available"); + + // loaned wallets + Wallet cnyLoan = new Wallet(CNY, a.getLoanCnyDisplay(), "loan"); + Wallet btcLoan = new Wallet(BTC, a.getLoanBtcDisplay(), "loan"); + Wallet ltcLoan = new Wallet(LTC, a.getLoanLtcDisplay(), "loan"); + + List wallets = Arrays.asList(cny, btc, ltc, cnyLoan, btcLoan, ltcLoan); + return new AccountInfo(null, wallets); + } public static String adaptPlaceOrderResult(BitVcPlaceOrderResult result) { @@ -129,8 +145,8 @@ public static String adaptPlaceOrderResult(BitVcPlaceOrderResult result) { public static List adaptOpenOrders(BitVcOrder[] orders, CurrencyPair currencyPair) { List openOrders = new ArrayList(orders.length); - for (BitVcOrder order : orders) { - openOrders.add(adaptOpenOrder(order, currencyPair)); + for (int i = 0; i < orders.length; i++) { + openOrders.add(adaptOpenOrder(orders[i], currencyPair)); } return openOrders; } diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/BitVcExchange.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/BitVcExchange.java index f50373c6ddf..cf6a3692ab5 100644 --- a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/BitVcExchange.java +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/BitVcExchange.java @@ -9,13 +9,19 @@ import com.xeiam.xchange.bitvc.service.polling.BitVcAccountService; import com.xeiam.xchange.bitvc.service.polling.BitVcMarketDataService; import com.xeiam.xchange.bitvc.service.polling.BitVcTradeService; +import com.xeiam.xchange.bitvc.service.polling.BitVcTradeServiceRaw; import com.xeiam.xchange.currency.CurrencyPair; +import com.xeiam.xchange.huobi.service.polling.HuobiAccountService; +import com.xeiam.xchange.huobi.service.polling.HuobiTradeServiceRaw; public class BitVcExchange extends BaseExchange implements Exchange { public static final String SYMBOLS_PARAMETER = "symbols"; public static final String TRADE_PASSWORD_PARAMETER = "trade_password"; - + public static final String URI_HUOBI = "huobi_uri"; + public static final String URI_HUOBI_MARKETDATA = "huobi_uri_marketdata"; + public static final String USE_HUOBI = "use_huobi"; + private static final List SYMBOLS = Arrays.asList(CurrencyPair.BTC_CNY, CurrencyPair.LTC_CNY); @Override @@ -24,8 +30,15 @@ public void applySpecification(ExchangeSpecification exchangeSpecification) { super.applySpecification(exchangeSpecification); pollingMarketDataService = new BitVcMarketDataService(exchangeSpecification); if (exchangeSpecification.getApiKey() != null) { - pollingAccountService = new BitVcAccountService(exchangeSpecification); - pollingTradeService = new BitVcTradeService(exchangeSpecification); + if((Boolean) exchangeSpecification.getExchangeSpecificParametersItem(USE_HUOBI)) { + pollingAccountService = new HuobiAccountService(exchangeSpecification); + pollingTradeService = new BitVcTradeService(new HuobiTradeServiceRaw(exchangeSpecification)); + + } else { + + pollingAccountService = new BitVcAccountService(exchangeSpecification); + pollingTradeService = new BitVcTradeService(new BitVcTradeServiceRaw(exchangeSpecification)); + } } } @@ -37,10 +50,18 @@ public ExchangeSpecification getDefaultExchangeSpecification() { ExchangeSpecification spec = new ExchangeSpecification(getClass()); spec.setExchangeName("BitVc"); - spec.setExchangeDescription("BitVC"); + spec.setExchangeDescription("BitVC and Huobi"); + + /* by default we request market data from huobi and execute on bitvc */ spec.setPlainTextUri("http://market.huobi.com/staticmarket"); spec.setSslUri("https://api.bitvc.com"); spec.setExchangeSpecificParametersItem(SYMBOLS_PARAMETER, SYMBOLS); + + /* set to true if trade and account service should be from Huobi too */ + spec.setExchangeSpecificParametersItem(USE_HUOBI, false); + spec.setExchangeSpecificParametersItem(URI_HUOBI, "https://api.huobi.com/apiv3"); + spec.setExchangeSpecificParametersItem(URI_HUOBI_MARKETDATA, "http://market.huobi.com/staticmarket"); + return spec; } } diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/Huobi.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/Huobi.java new file mode 100644 index 00000000000..30e9c4392ab --- /dev/null +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/Huobi.java @@ -0,0 +1,41 @@ +package com.xeiam.xchange.bitvc; + +import java.io.IOException; + +import javax.ws.rs.FormParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import com.xeiam.xchange.bitvc.dto.account.HuobiAccountInfo; +import com.xeiam.xchange.bitvc.dto.trade.BitVcCancelOrderResult; +import com.xeiam.xchange.bitvc.dto.trade.BitVcOrder; +import com.xeiam.xchange.bitvc.dto.trade.BitVcPlaceOrderResult; + +import si.mazi.rescu.ParamsDigest; + + +@Path("") +@Produces(MediaType.APPLICATION_JSON) +public interface Huobi { + + @POST + public HuobiAccountInfo getAccountInfo(@FormParam("access_key") String accessKey, @FormParam("created") long created, @FormParam("method") String method, @FormParam("sign") ParamsDigest sign) throws IOException; + + @POST + public BitVcOrder[] getOrders(@FormParam("access_key") String accessKey, @FormParam("coin_type") int coinType, @FormParam("created") long created, @FormParam("method") String method, @FormParam("sign") ParamsDigest sign) + throws IOException; + + @POST + public BitVcPlaceOrderResult placeLimitOrder(@FormParam("access_key") String accessKey, @FormParam("amount") String amount, @FormParam("coin_type") int coinType, @FormParam("created") long created, + @FormParam("price") String price, @FormParam("method") String method, @FormParam("sign") ParamsDigest sign) throws IOException; + + @POST + public BitVcPlaceOrderResult placeMarketOrder(@FormParam("access_key") String accessKey, @FormParam("amount") String amount, @FormParam("coin_type") int coinType, + @FormParam("created") long created, @FormParam("method") String method, @FormParam("sign") ParamsDigest sign) throws IOException; + + @POST + public BitVcCancelOrderResult cancelOrder(@FormParam("access_key") String accessKey, @FormParam("coin_type") int coinType, @FormParam("created") long created, @FormParam("id") long id, + @FormParam("method") String method, @FormParam("sign") ParamsDigest sign) throws IOException; +} diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/dto/account/HuobiAccountInfo.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/dto/account/HuobiAccountInfo.java new file mode 100644 index 00000000000..6a9d1e0d131 --- /dev/null +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/dto/account/HuobiAccountInfo.java @@ -0,0 +1,87 @@ +package com.xeiam.xchange.bitvc.dto.account; + +import java.math.BigDecimal; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class HuobiAccountInfo { + + private final BigDecimal availableCny; + private final BigDecimal availableBtc; + private final BigDecimal availableLtc; + private final BigDecimal frozenCny; + private final BigDecimal frozenBtc; + private final BigDecimal frozenLtc; + private final BigDecimal loanCny; + private final BigDecimal loanBtc; + private final BigDecimal loanLtc; + + private final String message; + + public HuobiAccountInfo(@JsonProperty("available_cny_display") final BigDecimal availableCnyDisplay, @JsonProperty("available_btc_display") final BigDecimal availableBtcDisplay, + @JsonProperty("available_ltc_display") final BigDecimal availableLtcDisplay, @JsonProperty("frozen_cny_display") final BigDecimal frozenCnyDisplay, + @JsonProperty("frozen_btc_display") final BigDecimal frozenBtcDisplay, @JsonProperty("frozen_ltc_display") final BigDecimal frozenLtcDisplay, @JsonProperty("loan_cny_display") final BigDecimal loanCnyDisplay, + @JsonProperty("loan_btc_display") final BigDecimal loanBtcDisplay, @JsonProperty("loan_ltc_display") final BigDecimal loanLtcDisplay, @JsonProperty("message") String message) { + + this.availableCny = availableCnyDisplay; + this.availableBtc = availableBtcDisplay; + this.availableLtc = availableLtcDisplay; + this.frozenCny = frozenCnyDisplay; + this.frozenBtc = frozenBtcDisplay; + this.frozenLtc = frozenLtcDisplay; + this.loanCny = loanCnyDisplay; + this.loanBtc = loanBtcDisplay; + this.loanLtc = loanLtcDisplay; + + this.message = message; + } + + public BigDecimal getAvailableCnyDisplay() { + + return availableCny == null ? BigDecimal.ZERO : availableCny; + } + + public BigDecimal getAvailableBtcDisplay() { + + return availableBtc == null ? BigDecimal.ZERO : availableBtc; + } + + public BigDecimal getAvailableLtcDisplay() { + + return availableLtc == null ? BigDecimal.ZERO : availableLtc; + } + + public BigDecimal getFrozenCnyDisplay() { + + return frozenCny == null ? BigDecimal.ZERO : frozenCny; + } + + public BigDecimal getFrozenBtcDisplay() { + + return frozenBtc == null ? BigDecimal.ZERO : frozenBtc; + } + + public BigDecimal getFrozenLtcDisplay() { + + return frozenLtc == null ? BigDecimal.ZERO : frozenLtc; + } + + public BigDecimal getLoanCnyDisplay() { + + return loanCny == null ? BigDecimal.ZERO : loanCny; + } + + public BigDecimal getLoanBtcDisplay() { + + return loanBtc == null ? BigDecimal.ZERO : loanBtc; + } + + public BigDecimal getLoanLtcDisplay() { + + return loanLtc == null ? BigDecimal.ZERO : loanLtc; + } + + public String getMessage() { + return message; + } +} diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcAccountService.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcAccountService.java index 30505699f81..4ced25328d5 100644 --- a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcAccountService.java +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcAccountService.java @@ -12,13 +12,11 @@ public class BitVcAccountService extends BitVcAccountServiceRaw implements PollingAccountService { public BitVcAccountService(ExchangeSpecification exchangeSpecification) { - super(exchangeSpecification); } @Override public AccountInfo getAccountInfo() throws IOException { - return BitVcAdapters.adaptAccountInfo(getBitVcAccountInfo()); } diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcMarketDataServiceRaw.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcMarketDataServiceRaw.java index adf554c90df..092bf6b4db6 100644 --- a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcMarketDataServiceRaw.java +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcMarketDataServiceRaw.java @@ -6,6 +6,7 @@ import com.xeiam.xchange.ExchangeSpecification; import com.xeiam.xchange.bitvc.BitVc; +import com.xeiam.xchange.bitvc.BitVcExchange; import com.xeiam.xchange.bitvc.dto.marketdata.BitVcDepth; import com.xeiam.xchange.bitvc.dto.marketdata.BitVcOrderBookTAS; import com.xeiam.xchange.bitvc.dto.marketdata.BitVcTicker; @@ -18,7 +19,7 @@ protected BitVcMarketDataServiceRaw(ExchangeSpecification exchangeSpecification) super(exchangeSpecification); - final String baseUrl = exchangeSpecification.getPlainTextUri(); + final String baseUrl = (String) exchangeSpecification.getExchangeSpecificParametersItem(BitVcExchange.URI_HUOBI_MARKETDATA); bitvc = RestProxyFactory.createProxy(BitVc.class, baseUrl); } diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcTradeService.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcTradeService.java index a8f635a99ce..42581880ba2 100644 --- a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcTradeService.java +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcTradeService.java @@ -2,13 +2,13 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import com.xeiam.xchange.ExchangeException; -import com.xeiam.xchange.ExchangeSpecification; import com.xeiam.xchange.NotAvailableFromExchangeException; import com.xeiam.xchange.NotYetImplementedForExchangeException; import com.xeiam.xchange.bitvc.BitVcAdapters; @@ -20,17 +20,18 @@ import com.xeiam.xchange.dto.trade.MarketOrder; import com.xeiam.xchange.dto.trade.OpenOrders; import com.xeiam.xchange.dto.trade.UserTrades; +import com.xeiam.xchange.huobi.service.polling.TradeServiceRaw; import com.xeiam.xchange.service.polling.PollingTradeService; import com.xeiam.xchange.service.polling.trade.TradeHistoryParams; -public class BitVcTradeService extends BitVcTradeServiceRaw implements PollingTradeService { - +public class BitVcTradeService implements PollingTradeService { private final Map coinTypes; + private final TradeServiceRaw tradeServiceRaw; private static final OpenOrders noOpenOrders = new OpenOrders(Collections. emptyList()); - public BitVcTradeService(ExchangeSpecification exchangeSpecification) { + public BitVcTradeService(TradeServiceRaw tradeServiceRaw) { - super(exchangeSpecification); + this.tradeServiceRaw = tradeServiceRaw; coinTypes = new HashMap(2); coinTypes.put(CurrencyPair.BTC_CNY, 1); coinTypes.put(CurrencyPair.LTC_CNY, 2); @@ -41,7 +42,7 @@ public OpenOrders getOpenOrders() throws ExchangeException, NotAvailableFromExch List openOrders = new ArrayList(); for (CurrencyPair currencyPair : getExchangeSymbols()) { - BitVcOrder[] orders = getBitVcOrders(coinTypes.get(currencyPair)); + BitVcOrder[] orders = tradeServiceRaw.getBitVcOrders(coinTypes.get(currencyPair)); for (int i = 0; i < orders.length; i++) { openOrders.add(BitVcAdapters.adaptOpenOrder(orders[i], currencyPair)); @@ -58,14 +59,14 @@ public OpenOrders getOpenOrders() throws ExchangeException, NotAvailableFromExch @Override public String placeMarketOrder(MarketOrder marketOrder) throws ExchangeException, NotAvailableFromExchangeException, NotYetImplementedForExchangeException, IOException { - BitVcPlaceOrderResult result = placeBitVcMarketOrder(marketOrder.getType(), coinTypes.get(marketOrder.getCurrencyPair()), marketOrder.getTradableAmount()); + BitVcPlaceOrderResult result = tradeServiceRaw.placeBitVcMarketOrder(marketOrder.getType(), coinTypes.get(marketOrder.getCurrencyPair()), marketOrder.getTradableAmount()); return BitVcAdapters.adaptPlaceOrderResult(result); } @Override public String placeLimitOrder(LimitOrder limitOrder) throws ExchangeException, NotAvailableFromExchangeException, NotYetImplementedForExchangeException, IOException { - BitVcPlaceOrderResult result = placeBitVcLimitOrder(limitOrder.getType(), coinTypes.get(limitOrder.getCurrencyPair()), limitOrder.getLimitPrice(), limitOrder.getTradableAmount()); + BitVcPlaceOrderResult result = tradeServiceRaw.placeBitVcLimitOrder(limitOrder.getType(), coinTypes.get(limitOrder.getCurrencyPair()), limitOrder.getLimitPrice(), limitOrder.getTradableAmount()); return BitVcAdapters.adaptPlaceOrderResult(result); } @@ -76,7 +77,7 @@ public boolean cancelOrder(String orderId) throws IOException { BitVcCancelOrderResult result = null; for (CurrencyPair currencyPair : getExchangeSymbols()) { - result = cancelBitVcOrder(coinTypes.get(currencyPair), id); + result = tradeServiceRaw.cancelBitVcOrder(coinTypes.get(currencyPair), id); if (result.getCode() == 0) { break; @@ -99,14 +100,16 @@ public UserTrades getTradeHistory(Object... arguments) { @Override public UserTrades getTradeHistory(TradeHistoryParams params) throws ExchangeException, NotAvailableFromExchangeException, NotYetImplementedForExchangeException, IOException { - throw new NotAvailableFromExchangeException(); } @Override public com.xeiam.xchange.service.polling.trade.TradeHistoryParams createTradeHistoryParams() { - return null; } + @Override + public Collection getExchangeSymbols() throws IOException { + return tradeServiceRaw.getExchangeSymbols(); + } } diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcTradeServiceRaw.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcTradeServiceRaw.java index 6234a297e65..0f908d71687 100644 --- a/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcTradeServiceRaw.java +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/bitvc/service/polling/BitVcTradeServiceRaw.java @@ -11,11 +11,11 @@ import com.xeiam.xchange.bitvc.dto.trade.BitVcOrderResult; import com.xeiam.xchange.bitvc.dto.trade.BitVcPlaceOrderResult; import com.xeiam.xchange.dto.Order.OrderType; +import com.xeiam.xchange.huobi.service.polling.TradeServiceRaw; -public class BitVcTradeServiceRaw extends BitVcBaseTradeService { - - protected BitVcTradeServiceRaw(ExchangeSpecification exchangeSpecification) { +public class BitVcTradeServiceRaw extends BitVcBaseTradeService implements TradeServiceRaw { + public BitVcTradeServiceRaw(ExchangeSpecification exchangeSpecification) { super(exchangeSpecification); } diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiAccountService.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiAccountService.java new file mode 100644 index 00000000000..94962f79b6c --- /dev/null +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiAccountService.java @@ -0,0 +1,34 @@ +package com.xeiam.xchange.huobi.service.polling; + +import java.io.IOException; +import java.math.BigDecimal; + +import com.xeiam.xchange.ExchangeSpecification; +import com.xeiam.xchange.NotAvailableFromExchangeException; +import com.xeiam.xchange.bitvc.BitVcAdapters; +import com.xeiam.xchange.dto.account.AccountInfo; +import com.xeiam.xchange.service.polling.PollingAccountService; + +public class HuobiAccountService extends HuobiAccountServiceRaw implements PollingAccountService { + + public HuobiAccountService(ExchangeSpecification exchangeSpecification) { + + super(exchangeSpecification); + } + + @Override + public AccountInfo getAccountInfo() throws IOException { + return BitVcAdapters.adaptHuobiAccountInfo(getHuobiAccountInfo()); + } + + @Override + public String withdrawFunds(String currency, BigDecimal amount, String address) { + throw new NotAvailableFromExchangeException(); + } + + @Override + public String requestDepositAddress(String currency, String... args) { + throw new NotAvailableFromExchangeException(); + } + +} diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiAccountServiceRaw.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiAccountServiceRaw.java new file mode 100644 index 00000000000..15745619bff --- /dev/null +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiAccountServiceRaw.java @@ -0,0 +1,26 @@ +package com.xeiam.xchange.huobi.service.polling; + +import java.io.IOException; + +import com.xeiam.xchange.ExchangeException; +import com.xeiam.xchange.ExchangeSpecification; +import com.xeiam.xchange.bitvc.dto.account.HuobiAccountInfo; + +public class HuobiAccountServiceRaw extends HuobiBaseTradeService { + + public HuobiAccountServiceRaw(ExchangeSpecification exchangeSpecification) { + + super(exchangeSpecification); + } + + public HuobiAccountInfo getHuobiAccountInfo() throws IOException { + HuobiAccountInfo accountInfo = huobi.getAccountInfo(accessKey, nextCreated(), "get_account_info", digest); + + if (accountInfo.getMessage() != null) { + throw new ExchangeException(accountInfo.getMessage()); + } + else { + return accountInfo; + } + } +} diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiBaseTradeService.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiBaseTradeService.java new file mode 100644 index 00000000000..4a8b07fdd70 --- /dev/null +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiBaseTradeService.java @@ -0,0 +1,29 @@ +package com.xeiam.xchange.huobi.service.polling; + +import si.mazi.rescu.RestProxyFactory; + +import com.xeiam.xchange.ExchangeSpecification; +import com.xeiam.xchange.bitvc.BitVcExchange; +import com.xeiam.xchange.bitvc.Huobi; +import com.xeiam.xchange.bitvc.service.BitVcDigest; +import com.xeiam.xchange.bitvc.service.polling.BitVcBasePollingService; + + +public class HuobiBaseTradeService extends BitVcBasePollingService { + protected final Huobi huobi; + protected final String accessKey; + protected final BitVcDigest digest; + + protected HuobiBaseTradeService(ExchangeSpecification exchangeSpecification) { + + super(exchangeSpecification); + + huobi = RestProxyFactory.createProxy(Huobi.class, (String) exchangeSpecification.getExchangeSpecificParametersItem(BitVcExchange.URI_HUOBI)); + accessKey = exchangeSpecification.getApiKey(); + digest = new BitVcDigest(exchangeSpecification.getSecretKey()); + } + + protected long nextCreated() { + return System.currentTimeMillis() / 1000; + } +} diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiTradeServiceRaw.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiTradeServiceRaw.java new file mode 100644 index 00000000000..4c13f11339f --- /dev/null +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/HuobiTradeServiceRaw.java @@ -0,0 +1,39 @@ +package com.xeiam.xchange.huobi.service.polling; + +import static com.xeiam.xchange.dto.Order.OrderType.BID; + +import java.io.IOException; +import java.math.BigDecimal; + +import com.xeiam.xchange.ExchangeSpecification; +import com.xeiam.xchange.bitvc.dto.trade.BitVcCancelOrderResult; +import com.xeiam.xchange.bitvc.dto.trade.BitVcOrder; +import com.xeiam.xchange.bitvc.dto.trade.BitVcPlaceOrderResult; +import com.xeiam.xchange.dto.Order.OrderType; + + +public class HuobiTradeServiceRaw extends HuobiBaseTradeService implements TradeServiceRaw { + public HuobiTradeServiceRaw(ExchangeSpecification exchangeSpecification) { + super(exchangeSpecification); + } + + public BitVcOrder[] getBitVcOrders(int coinType) throws IOException { + return huobi.getOrders(accessKey, coinType, nextCreated(), "get_orders", digest); + } + + public BitVcPlaceOrderResult placeBitVcLimitOrder(OrderType type, int coinType, BigDecimal price, BigDecimal amount) throws IOException { + String method = type == BID ? "buy" : "sell"; + + return huobi.placeLimitOrder(accessKey, amount.toPlainString(), coinType, nextCreated(), price.toPlainString(), method, digest); + } + + public BitVcPlaceOrderResult placeBitVcMarketOrder(OrderType type, int coinType, BigDecimal amount) throws IOException { + final String method = type == BID ? "buy_market" : "sell_market"; + + return huobi.placeMarketOrder(accessKey, amount.toPlainString(), coinType, nextCreated(), method, digest); + } + + public BitVcCancelOrderResult cancelBitVcOrder(int coinType, long id) throws IOException { + return huobi.cancelOrder(accessKey, coinType, nextCreated(), id, "cancel_order", digest); + } +} \ No newline at end of file diff --git a/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/TradeServiceRaw.java b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/TradeServiceRaw.java new file mode 100644 index 00000000000..87fb504aa54 --- /dev/null +++ b/xchange-bitvc/src/main/java/com/xeiam/xchange/huobi/service/polling/TradeServiceRaw.java @@ -0,0 +1,20 @@ +package com.xeiam.xchange.huobi.service.polling; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.Collection; + +import com.xeiam.xchange.bitvc.dto.trade.BitVcCancelOrderResult; +import com.xeiam.xchange.bitvc.dto.trade.BitVcOrder; +import com.xeiam.xchange.bitvc.dto.trade.BitVcPlaceOrderResult; +import com.xeiam.xchange.currency.CurrencyPair; +import com.xeiam.xchange.dto.Order.OrderType; + +public interface TradeServiceRaw { + public BitVcOrder[] getBitVcOrders(int coinType) throws IOException; + public BitVcPlaceOrderResult placeBitVcLimitOrder(OrderType type, int coinType, BigDecimal price, BigDecimal amount) throws IOException; + public BitVcPlaceOrderResult placeBitVcMarketOrder(OrderType type, int coinType, BigDecimal amount) throws IOException; + public BitVcCancelOrderResult cancelBitVcOrder(int coinType, long id) throws IOException; + + public Collection getExchangeSymbols() throws IOException; +} \ No newline at end of file