package org.knowm.xchange.okcoin;
import org.knowm.xchange.BaseExchange;
import org.knowm.xchange.ExchangeSpecification;
import org.knowm.xchange.okcoin.service.OkCoinAccountService;
import org.knowm.xchange.okcoin.service.OkCoinFuturesAccountService;
import org.knowm.xchange.okcoin.service.OkCoinFuturesMarketDataService;
import org.knowm.xchange.okcoin.service.OkCoinFuturesTradeService;
import org.knowm.xchange.okcoin.service.OkCoinMarketDataService;
import org.knowm.xchange.okcoin.service.OkCoinTradeService;
import si.mazi.rescu.SynchronizedValueFactory;
public class OkCoinExchange extends BaseExchange {
@Override
public void applySpecification(ExchangeSpecification exchangeSpecification) {
super.applySpecification(exchangeSpecification);
if (exchangeSpecification.getExchangeSpecificParametersItem("Use_Intl").equals(false)
&& exchangeSpecification.getExchangeSpecificParametersItem("Use_Futures").equals(true)) {
throw new RuntimeException("Futures only available on international version. Set `Use_Intl` to true.");
}
concludeHostParams(exchangeSpecification);
}
@Override
protected void initServices() {
concludeHostParams(exchangeSpecification);
if (exchangeSpecification.getExchangeSpecificParameters() != null
&& exchangeSpecification.getExchangeSpecificParametersItem("Use_Futures").equals(true)) {
FuturesContract contract = futuresContractOfConfig(exchangeSpecification);
this.marketDataService = new OkCoinFuturesMarketDataService(this, contract);
if (exchangeSpecification.getApiKey() != null) {
this.accountService = new OkCoinFuturesAccountService(this);
this.tradeService = new OkCoinFuturesTradeService(this, contract, futuresLeverageOfConfig(exchangeSpecification));
}
} else {
this.marketDataService = new OkCoinMarketDataService(this);
if (exchangeSpecification.getApiKey() != null) {
this.accountService = new OkCoinAccountService(this);
this.tradeService = new OkCoinTradeService(this);
}
}
}
/** Adjust host parameters depending on exchange specific parameters */
private static void concludeHostParams(ExchangeSpecification exchangeSpecification) {
if (exchangeSpecification.getExchangeSpecificParameters() != null
&& exchangeSpecification.getExchangeSpecificParametersItem("Use_Intl").equals(true)) {
exchangeSpecification.setSslUri("https://www.okcoin.com/api");
exchangeSpecification.setHost("www.okcoin.com");
exchangeSpecification.setExchangeSpecificParametersItem("Websocket_SslUri", "wss://real.okcoin.com:10440/websocket/okcoinapi");
}
}
/** Extract futures leverage used by spec */
private static int futuresLeverageOfConfig(ExchangeSpecification exchangeSpecification) {
if (exchangeSpecification.getExchangeSpecificParameters().containsKey("Futures_Leverage")) {
return Integer.valueOf((String) exchangeSpecification.getExchangeSpecificParameters().get("Futures_Leverage"));
} else {
// default choice of 10x leverage is "safe" choice and default by OkCoin.
return 10;
}
}
/** Extract contract used by spec */
public 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.valueOfIgnoreCase(FuturesContract.class,
(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 exchangeSpecification = new ExchangeSpecification(this.getClass().getCanonicalName());
exchangeSpecification.setSslUri("https://www.okcoin.cn/api");
exchangeSpecification.setHost("www.okcoin.cn");
exchangeSpecification.setExchangeName("OKCoin");
exchangeSpecification.setExchangeDescription("OKCoin is a globally oriented crypto-currency trading platform.");
// set to true to automatically use the Intl_ parameters for ssluri and host
exchangeSpecification.setExchangeSpecificParametersItem("Use_Intl", false);
exchangeSpecification.setExchangeSpecificParametersItem("Use_Futures", false);
exchangeSpecification.setExchangeSpecificParametersItem("Websocket_SslUri", "wss://real.okcoin.cn:10440/websocket/okcoinapi");
return exchangeSpecification;
}
@Override
public SynchronizedValueFactory<Long> getNonceFactory() {
// This exchange doesn't use a nonce for authentication
return null;
}
@Override
public String getMetaDataFileName(ExchangeSpecification exchangeSpecification) {
if (exchangeSpecification.getExchangeSpecificParametersItem("Use_Intl").equals(false)) {
return exchangeSpecification.getExchangeName().toLowerCase().replace(" ", "").replace("-", "").replace(".", "") + "_china";
} else {
if (exchangeSpecification.getExchangeSpecificParametersItem("Use_Futures").equals(true)) {
return exchangeSpecification.getExchangeName().toLowerCase().replace(" ", "").replace("-", "").replace(".", "") + "_futures";
} else {
return exchangeSpecification.getExchangeName().toLowerCase().replace(" ", "").replace("-", "").replace(".", "") + "_intl";
}
}
}
}