package org.knowm.xchange.huobi; import org.knowm.xchange.BaseExchange; import org.knowm.xchange.Exchange; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.huobi.service.*; import si.mazi.rescu.SynchronizedValueFactory; /** * By default when instantiating this exchange market data and trading goes via Huobi. If the flag HuobiExchange.HUOBI_MARKET_DATA is true then market * data will go through Huobi still and trade execution and account information will go through BitVC. */ public class HuobiExchange extends BaseExchange implements Exchange { public static final String TRADE_PASSWORD_PARAMETER = "trade_password"; /** Potentially different market data endpoints should be settable */ public static final String HUOBI_MARKET_DATA = "huobi_uri_marketdata"; /** Using BitVc Spot for execution */ public static final String USE_BITVC = "use_bitvc"; /** Use BitVc Futures for market data */ public static final String USE_BITVC_FUTURES_MARKET_DATA = "use_bitvc_futures"; /** Use BitVc Futures for execution */ public static final String USE_BITVC_FUTURES_EXECUTION = "use_bitvc_futures_execution"; @Override public void applySpecification(ExchangeSpecification exchangeSpecification) { super.applySpecification(exchangeSpecification); concludeHostParams(exchangeSpecification); } @Override protected void initServices() { concludeHostParams(exchangeSpecification); if (exchangeSpecification.getExchangeSpecificParametersItem(USE_BITVC).equals(true) && exchangeSpecification.getExchangeSpecificParametersItem(USE_BITVC_FUTURES_MARKET_DATA).equals(true)) { marketDataService = new BitVcFuturesMarketDataService(this, futuresContractOfConfig(exchangeSpecification)); } else { marketDataService = new HuobiMarketDataService(this); } if (exchangeSpecification.getApiKey() != null) { if (exchangeSpecification.getExchangeSpecificParametersItem(USE_BITVC).equals(true)) { // BitVc futures execution or spot execution if (exchangeSpecification.getExchangeSpecificParametersItem(USE_BITVC_FUTURES_EXECUTION).equals(true)) { accountService = new BitVcFuturesAccountService(this); tradeService = new BitVcFuturesTradeService(this, futuresContractOfConfig(exchangeSpecification)); } else { accountService = new BitVcAccountService(this); tradeService = new GenericTradeService(this, new BitVcTradeServiceRaw(this)); } } else { accountService = new HuobiAccountService(this); tradeService = new GenericTradeService(this, new HuobiTradeServiceRaw(this)); } } } /** Adjust host parameters depending on exchange specific parameters */ private static void concludeHostParams(ExchangeSpecification exchangeSpecification) { if (exchangeSpecification.getExchangeSpecificParametersItem(USE_BITVC).equals(true)) { exchangeSpecification.setSslUri("https://api.bitvc.com"); exchangeSpecification.setExchangeSpecificParametersItem("Websocket_SslUri", "NOT IMPLEMENTED"); } } private static FuturesContract futuresContractOfConfig(ExchangeSpecification exchangeSpecification) { FuturesContract contract; if (exchangeSpecification.getExchangeSpecificParameters().containsKey("Futures_Contract")) { contract = (FuturesContract) exchangeSpecification.getExchangeSpecificParameters().get("Futures_Contract"); } else if (exchangeSpecification.getExchangeSpecificParameters().containsKey("Futures_Contract_String")) { contract = FuturesContract.valueOf((String) exchangeSpecification.getExchangeSpecificParameters().get("Futures_Contract_String")); } else { throw new RuntimeException("`Futures_Contract` or `Futures_Contract_String` not defined in exchange specific parameters."); } return contract; } @Override public ExchangeSpecification getDefaultExchangeSpecification() { ExchangeSpecification spec = new ExchangeSpecification(getClass()); spec.setExchangeName("Huobi"); spec.setExchangeDescription("Huobi-Family Exchange (Huobi, BitVC, BitVC Futures)"); /* by default we request market data from huobi and execute on bitvc */ spec.setPlainTextUri("http://market.huobi.com/staticmarket"); spec.setSslUri("https://api.huobi.com/apiv3"); /* set to true if trade and account service should be from BitVc too */ spec.setExchangeSpecificParametersItem(USE_BITVC, false); spec.setExchangeSpecificParametersItem(USE_BITVC_FUTURES_MARKET_DATA, false); spec.setExchangeSpecificParametersItem(USE_BITVC_FUTURES_EXECUTION, false); spec.setExchangeSpecificParametersItem(HUOBI_MARKET_DATA, "http://market.huobi.com/staticmarket"); spec.setExchangeSpecificParametersItem("Websocket_SslUri", "http://hq.huobi.com"); return spec; } @Override public SynchronizedValueFactory<Long> getNonceFactory() { // BitVC doesn't require a nonce for it's authenticated API return null; } }