retVal = new ArrayList<>();
+ for ( BitflyerDepositOrWithdrawal history : depositWithdrawls )
+ retVal.add( adaptFundingRecord(history, type));
+
+ return retVal;
+ }
+
+ public static FundingRecord adaptFundingRecord(BitflyerCoinHistory history, FundingRecord.Type type) {
+ return new FundingRecord.Builder()
+ .setDate(BitflyerUtils.parseDate( history.getEventDate()))
+ .setCurrency(new Currency(history.getCurrencyCode()))
+ .setAmount(history.getAmount())
+ .setAddress(history.getAddress())
+ .setInternalId(history.getID())
+ .setExternalId(history.getOrderID())
+ .setType(type)
+ .setStatus(adaptStatus(history.getStatus()))
+ .setBalance(history.getAmount())
+ .setFee(add(history.getFee(),history.getAdditionalFee()))
+ .build();
+ }
+
+ public static FundingRecord adaptFundingRecord(BitflyerDepositOrWithdrawal history, FundingRecord.Type type) {
+ return new FundingRecord.Builder()
+ .setDate(BitflyerUtils.parseDate( history.getEventDate()))
+ .setCurrency(new Currency(history.getCurrencyCode()))
+ .setAmount(history.getAmount())
+ .setInternalId(history.getID())
+ .setExternalId(history.getOrderID())
+ .setType(type)
+ .setStatus(adaptStatus(history.getStatus()))
+ .setBalance(history.getAmount())
+ .build();
+ }
+
+ private static FundingRecord.Status adaptStatus(String status) {
+ if ( status.equals("COMPLETED"))
+ return FundingRecord.Status.COMPLETE;
+ if ( status.equals("PENDING"))
+ return FundingRecord.Status.PROCESSING;
+
+ // ??
+ return FundingRecord.Status.FAILED;
+ }
+
+ private static BigDecimal add(BigDecimal a, BigDecimal b) {
+ BigDecimal a1 = a == null ? BigDecimal.ZERO : a;
+ BigDecimal b1 = b == null ? BigDecimal.ZERO : b;
+
+ return a1.add(b1);
+ }
public static void main(String[] args) {
adaptCurrencyPair("BTC_JPY");
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/BitflyerUtils.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/BitflyerUtils.java
index fe74dbd65..94f8f610f 100755
--- a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/BitflyerUtils.java
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/BitflyerUtils.java
@@ -20,7 +20,8 @@ private BitflyerUtils() {
public static Date parseDate(final String date) {
try {
- return DATE_FORMAT.parse(date);
+ SimpleDateFormat threadSafeClone = (SimpleDateFormat) DATE_FORMAT.clone();
+ return threadSafeClone.parse(date);
} catch (final ParseException e) {
throw new ExchangeException("Illegal date/time format: " + date, e);
}
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerAddress.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerAddress.java
new file mode 100644
index 000000000..c89230710
--- /dev/null
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerAddress.java
@@ -0,0 +1,67 @@
+package org.knowm.xchange.bitflyer.dto.account;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+/**
+ * Object representing json returned from GET /v1/me/getaddresses
+ *
+ * Example
+ * [
+ * {
+ * "type": "NORMAL",
+ * "currency_code": "BTC",
+ * "address": "3AYrDq8zhF82NJ2ZaLwBMPmaNziaKPaxa7"
+ * },
+ * {
+ * "type": "NORMAL",
+ * "currency_code": "ETH",
+ * "address": "0x7fbB2CC24a3C0cd3789a44e9073381Ca6470853f"
+ * }
+ * ]
+ * @author bryant_harris
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+ "type",
+ "currency_code",
+ "address"
+ })
+public class BitflyerAddress {
+ @JsonProperty("type")
+ private String type;
+ @JsonProperty("currency_code")
+ private String currencyCode;
+ @JsonProperty("address")
+ private String address;
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getCurrencyCode() {
+ return currencyCode;
+ }
+
+ public void setCurrencyCode(String currency_code) {
+ this.currencyCode = currency_code;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ @Override
+ public String toString() {
+ return "BitflyerAddress [type=" + type + ", currency_code=" + currencyCode + ", address=" + address + "]";
+ }
+}
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerBankAccount.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerBankAccount.java
new file mode 100644
index 000000000..667c2c1b4
--- /dev/null
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerBankAccount.java
@@ -0,0 +1,108 @@
+package org.knowm.xchange.bitflyer.dto.account;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Object representing json returned from GET /v1/me/getbankaccounts
+ *
+ * Example
+ * [
+ * {
+ * "id": 3402,
+ * "is_verified": true,
+ * "bank_name": "Wells Fargo",
+ * "branch_name": "1231234123",
+ * "account_type": "Checking",
+ * "account_number": "1111111",
+ * "account_name": "Name on Account"
+ * }
+ * ]
+ * @author bryant_harris
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class BitflyerBankAccount {
+ @JsonProperty("type")
+ Long id;
+
+ @JsonProperty("is_verified")
+ boolean isVerified;
+
+ @JsonProperty("bank_name")
+ String bankName;
+
+ @JsonProperty("branch_name")
+ String branchName;
+
+ @JsonProperty("account_type")
+ String accountType;
+
+ @JsonProperty("account_number")
+ String accountNumber;
+
+ @JsonProperty("account_name")
+ String accountName;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public boolean isVerified() {
+ return isVerified;
+ }
+
+ public void setVerified(boolean isVerified) {
+ this.isVerified = isVerified;
+ }
+
+ public String getBankName() {
+ return bankName;
+ }
+
+ public void setBankName(String bankName) {
+ this.bankName = bankName;
+ }
+
+ public String getBranchName() {
+ return branchName;
+ }
+
+ public void setBranchName(String branchName) {
+ this.branchName = branchName;
+ }
+
+ public String getAccountType() {
+ return accountType;
+ }
+
+ public void setAccountType(String accountType) {
+ this.accountType = accountType;
+ }
+
+ public String getAccountNumber() {
+ return accountNumber;
+ }
+
+ public void setAccountNumber(String accountNumber) {
+ this.accountNumber = accountNumber;
+ }
+
+ public String getAccountName() {
+ return accountName;
+ }
+
+ public void setAccountName(String accountName) {
+ this.accountName = accountName;
+ }
+
+ @Override
+ public String toString() {
+ return "BitflyerBankAccount [id=" + id + ", isVerified=" + isVerified + ", bankName=" + bankName + ", branchName="
+ + branchName + ", accountType=" + accountType + ", accountNumber=" + accountNumber + ", accountName="
+ + accountName + "]";
+ }
+}
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerBaseHistoryResponse.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerBaseHistoryResponse.java
new file mode 100644
index 000000000..c65002d43
--- /dev/null
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerBaseHistoryResponse.java
@@ -0,0 +1,79 @@
+package org.knowm.xchange.bitflyer.dto.account;
+
+import java.math.BigDecimal;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * A base class for history related responses
+ * @author bryant_harris
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public abstract class BitflyerBaseHistoryResponse {
+ @JsonProperty("id")
+ String id;
+
+ @JsonProperty("order_id")
+ String orderID;
+
+ @JsonProperty("currency_code")
+ String currencyCode;
+
+ @JsonProperty("amount")
+ BigDecimal amount;
+
+ @JsonProperty("status")
+ String status;
+
+ @JsonProperty("event_date")
+ String eventDate;
+
+ public String getID() {
+ return id;
+ }
+
+ public void setID(String id) {
+ this.id = id;
+ }
+
+ public String getOrderID() {
+ return orderID;
+ }
+
+ public void setOrderID(String orderID) {
+ this.orderID = orderID;
+ }
+
+ public String getCurrencyCode() {
+ return currencyCode;
+ }
+
+ public void setCurrencyCode(String currencyCode) {
+ this.currencyCode = currencyCode;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getEventDate() {
+ return eventDate;
+ }
+
+ public void setEventDate(String eventDate) {
+ this.eventDate = eventDate;
+ }
+}
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerCoinHistory.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerCoinHistory.java
new file mode 100644
index 000000000..3a9869ab1
--- /dev/null
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerCoinHistory.java
@@ -0,0 +1,91 @@
+package org.knowm.xchange.bitflyer.dto.account;
+
+import java.math.BigDecimal;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Object representing json returned from GET /v1/me/getcoinins or GET /v1/me/getcoinouts
+ *
+ * Example getcoinins
+ * {
+ * "id": 100,
+ * "order_id": "CDP20151227-024141-055555",
+ * "currency_code": "BTC",
+ * "amount": 0.00002,
+ * "address": "1WriteySQufKZ2pVuM1oMhPrTtTVFq35j",
+ * "tx_hash": "9f92ee65a176bb9545f7becb8706c50d07d4cee5ffca34d8be3ef11d411405ae",
+ * "status": "COMPLETED",
+ * "event_date": "2015-11-27T08:59:20.301"
+ * }
+ *
+ * Example getcoinouts
+ * {
+ * "id": 500,
+ * "order_id": "CWD20151224-014040-077777",
+ * "currency_code": "BTC",
+ * "amount": 0.1234,
+ * "address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
+ * "tx_hash": "724c07dfd4044abcb390b0412c3e707dd5c4f373f0a52b3bd295ce32b478c60a",
+ * "fee": 0.0005,
+ * "additional_fee": 0.0001,
+ * "status": "COMPLETED",
+ * "event_date": "2015-12-24T01:40:40.397"
+ * }
+
+ * @author bryant_harris
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class BitflyerCoinHistory extends BitflyerBaseHistoryResponse {
+ @JsonProperty("address")
+ String address;
+
+ @JsonProperty("fee")
+ BigDecimal fee;
+
+ @JsonProperty("additional_fee")
+ BigDecimal additionalFee;
+
+ @JsonProperty("tx_hash")
+ String txHash;
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public BigDecimal getFee() {
+ return fee;
+ }
+
+ public void setFee(BigDecimal fee) {
+ this.fee = fee;
+ }
+
+ public BigDecimal getAdditionalFee() {
+ return additionalFee;
+ }
+
+ public void setAdditionalFee(BigDecimal additionalFee) {
+ this.additionalFee = additionalFee;
+ }
+
+ public String getTxHash() {
+ return txHash;
+ }
+
+ public void setTxHash(String txHash) {
+ this.txHash = txHash;
+ }
+
+ @Override
+ public String toString() {
+ return "BitflyerCoinIn [id=" + id + ", orderID=" + orderID + ", currencyCode=" + currencyCode + ", amount="
+ + amount + ", address=" + address + ", fee=" + fee + ", additionalFee=" + additionalFee + ", txHash="
+ + txHash + ", status=" + status + ", eventDate=" + eventDate + "]";
+ }
+}
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerDepositOrWithdrawal.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerDepositOrWithdrawal.java
new file mode 100644
index 000000000..fb9bf132a
--- /dev/null
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerDepositOrWithdrawal.java
@@ -0,0 +1,29 @@
+package org.knowm.xchange.bitflyer.dto.account;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+/**
+ * Object representing json returned from GET /v1/me/getdeposits or GET /v1/me/getwithdrawals
+ *
+ * Example
+ * [
+ * {
+ * "id": 300,
+ * "order_id": "MDP20151014-101010-033333",
+ * "currency_code": "JPY",
+ * "amount": 10000,
+ * "status": "COMPLETED",
+ * "event_date": "2015-10-14T10:10:10.001"
+ * }
+ * ]
+ * @author bryant_harris
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class BitflyerDepositOrWithdrawal extends BitflyerBaseHistoryResponse {
+
+ @Override
+ public String toString() {
+ return "BitflyerCashDeposit [id=" + id + ", orderID=" + orderID + ", currencyCode=" + currencyCode + ", amount="
+ + amount + ", status=" + status + ", eventDate=" + eventDate + "]";
+ }
+}
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerWithdrawRequest.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerWithdrawRequest.java
new file mode 100644
index 000000000..f3712e6cc
--- /dev/null
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerWithdrawRequest.java
@@ -0,0 +1,66 @@
+package org.knowm.xchange.bitflyer.dto.account;
+
+import java.math.BigDecimal;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+/**
+ * Object representing body of request POST /v1/me/withdraw
+ *
+ * Example
+ * {
+ * "currency_code": "JPY",
+ * "bank_account_id": 1234,
+ * "amount": 12000
+ * }
+ * @author bryant_harris
+ */
+public class BitflyerWithdrawRequest {
+ @JsonProperty("currency_code")
+ private String currencyCode;
+
+ @JsonProperty("bank_account_id")
+ private String bankAccountID;
+
+ @JsonProperty("amount")
+ private BigDecimal amount;
+
+ public BitflyerWithdrawRequest(String currencyCode, String bankAccountID, BigDecimal amount) {
+ super();
+ this.currencyCode = currencyCode;
+ this.bankAccountID = bankAccountID;
+ this.amount = amount;
+ }
+
+ public String getCurrencyCode() {
+ return currencyCode;
+ }
+
+ public void setCurrencyCode(String currencyCode) {
+ this.currencyCode = currencyCode;
+ }
+
+ public String getBankAccountID() {
+ return bankAccountID;
+ }
+
+ public void setBankAccountID(String bankAccountID) {
+ this.bankAccountID = bankAccountID;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ @Override
+ public String toString() {
+ return "BitflyerWithdrawRequest [currencyCode=" + currencyCode + ", bankAccountID=" + bankAccountID + ", amount="
+ + amount + "]";
+ }
+}
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerWithdrawResponse.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerWithdrawResponse.java
new file mode 100644
index 000000000..95c87d689
--- /dev/null
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/dto/account/BitflyerWithdrawResponse.java
@@ -0,0 +1,39 @@
+package org.knowm.xchange.bitflyer.dto.account;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+/**
+ * Object representing json returned from GET /v1/me/withdraw
+ *
+ * Example
+ * {
+ * "message_id": "69476620-5056-4003-bcbe-42658a2b041b"
+ * }
+ *
+ * or
+ *
+ * {
+ * "status": -700,
+ * "error_message": "This account has not yet been authenticated",
+ * "data": null
+ * }
+ * @author bryant_harris
+ */
+public class BitflyerWithdrawResponse {
+ @JsonProperty("message_id")
+ String messageID;
+
+ @JsonProperty("status")
+ Long status;
+
+ @JsonProperty("error_message")
+ String errorMessage;
+
+ @Override
+ public String toString() {
+ return "BitflyerWithdrawResponse [messageID=" + messageID + ", status=" + status + ", errorMessage="
+ + errorMessage + "]";
+ }
+}
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerAccountService.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerAccountService.java
index 4ad7b275f..b18ee3788 100755
--- a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerAccountService.java
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerAccountService.java
@@ -2,13 +2,20 @@
import java.io.IOException;
import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
import org.knowm.xchange.Exchange;
import org.knowm.xchange.bitflyer.BitflyerAdapters;
+import org.knowm.xchange.bitflyer.dto.account.BitflyerAddress;
+import org.knowm.xchange.bitflyer.dto.account.BitflyerCoinHistory;
+import org.knowm.xchange.bitflyer.dto.account.BitflyerDepositOrWithdrawal;
import org.knowm.xchange.currency.Currency;
import org.knowm.xchange.dto.account.AccountInfo;
import org.knowm.xchange.dto.account.FundingRecord;
+import org.knowm.xchange.exceptions.NotAvailableFromExchangeException;
import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException;
import org.knowm.xchange.service.account.AccountService;
import org.knowm.xchange.service.trade.params.TradeHistoryParams;
@@ -41,16 +48,70 @@ public String withdrawFunds(WithdrawFundsParams params) throws IOException {
@Override
public String requestDepositAddress(Currency currency, String... args) throws IOException {
- throw new NotYetImplementedForExchangeException();
+ List addresses = getAddresses();
+ for ( BitflyerAddress address : addresses ) {
+ if ( address.getCurrencyCode().equals(currency.getCurrencyCode()))
+ return address.getAddress();
+ }
+
+ throw new NotAvailableFromExchangeException();
}
@Override
public TradeHistoryParams createFundingHistoryParams() {
- throw new NotYetImplementedForExchangeException();
+ return new BitflyerTradeHistoryParams();
}
@Override
- public List getFundingHistory(TradeHistoryParams params) throws IOException {
- throw new NotYetImplementedForExchangeException();
+ public List getFundingHistory(TradeHistoryParams param) throws IOException {
+ BitflyerTradeHistoryParams historyParms = (BitflyerTradeHistoryParams) (param instanceof BitflyerTradeHistoryParams ? createFundingHistoryParams() : param);
+ List coinsIn = getCoinIns();
+ List coinsOut = getCoinOuts();
+ List cashDeposits = getCashDeposits();
+ List withdrawals = getWithdrawals();
+
+ List retVal = new ArrayList<>();
+ List some;
+ some = BitflyerAdapters.adaptFundingRecordsFromCoinHistory(coinsIn, FundingRecord.Type.DEPOSIT);
+ cullNotWanted(some, historyParms);
+ retVal.addAll(some);
+
+ some = BitflyerAdapters.adaptFundingRecordsFromCoinHistory(coinsOut, FundingRecord.Type.WITHDRAWAL);
+ cullNotWanted(some, historyParms);
+ retVal.addAll(some);
+
+ some = BitflyerAdapters.adaptFundingRecordsFromDepositHistory(cashDeposits, FundingRecord.Type.DEPOSIT);
+ cullNotWanted(some, historyParms);
+ retVal.addAll(some);
+
+ some = BitflyerAdapters.adaptFundingRecordsFromDepositHistory(withdrawals, FundingRecord.Type.WITHDRAWAL);
+ cullNotWanted(some, historyParms);
+ retVal.addAll(some);
+
+ // interleave the records based on time, newest first
+ Collections.sort(retVal, (FundingRecord r1, FundingRecord r2)-> {
+ return r2.getDate().compareTo(r1.getDate());
+ });
+
+ return retVal;
+ }
+
+ private void cullNotWanted(List some, BitflyerTradeHistoryParams param) {
+ if ( param != null && param.getCurrencies() != null ) {
+ Iterator iter = some.iterator();
+ while ( iter.hasNext() ) {
+ FundingRecord record = iter.next();
+ if ( !isIn(record.getCurrency(), param.getCurrencies()))
+ iter.remove();
+ }
+ }
+ }
+
+ private boolean isIn(Currency currency, Currency[] currencies) {
+ for ( Currency cur : currencies )
+ if ( cur.equals(currency))
+ return true;
+
+ return false;
}
-}
\ No newline at end of file
+}
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerAccountServiceRaw.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerAccountServiceRaw.java
index 7976a7074..3905b6e0d 100755
--- a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerAccountServiceRaw.java
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerAccountServiceRaw.java
@@ -1,14 +1,21 @@
package org.knowm.xchange.bitflyer.service;
import java.io.IOException;
+import java.math.BigDecimal;
import java.util.List;
import org.knowm.xchange.Exchange;
import org.knowm.xchange.bitflyer.dto.BitflyerException;
+import org.knowm.xchange.bitflyer.dto.account.BitflyerAddress;
import org.knowm.xchange.bitflyer.dto.account.BitflyerBalance;
+import org.knowm.xchange.bitflyer.dto.account.BitflyerBankAccount;
+import org.knowm.xchange.bitflyer.dto.account.BitflyerCoinHistory;
+import org.knowm.xchange.bitflyer.dto.account.BitflyerDepositOrWithdrawal;
import org.knowm.xchange.bitflyer.dto.account.BitflyerMarginAccount;
import org.knowm.xchange.bitflyer.dto.account.BitflyerMarginStatus;
import org.knowm.xchange.bitflyer.dto.account.BitflyerMarginTransaction;
+import org.knowm.xchange.bitflyer.dto.account.BitflyerWithdrawRequest;
+import org.knowm.xchange.bitflyer.dto.account.BitflyerWithdrawResponse;
public class BitflyerAccountServiceRaw extends BitflyerBaseService {
@@ -21,24 +28,81 @@ public BitflyerAccountServiceRaw(Exchange exchange) {
super(exchange);
}
+
+ public List getPermissions() throws IOException {
+ try {
+ return bitflyer.getPermissions(apiKey, exchange.getNonceFactory(), signatureCreator);
+ } catch (BitflyerException e) {
+ throw handleError(e);
+ }
+ }
+
+ public List getAddresses() throws IOException {
+ try {
+ return bitflyer.getAddresses(apiKey, exchange.getNonceFactory(), signatureCreator);
+ } catch (BitflyerException e) {
+ throw handleError(e);
+ }
+ }
+
+ public List getCoinIns() throws IOException {
+ try {
+ return bitflyer.getCoinIns(apiKey, exchange.getNonceFactory(), signatureCreator);
+ } catch (BitflyerException e) {
+ throw handleError(e);
+ }
+ }
- public BitflyerMarginStatus getBitflyerMarginStatus() throws IOException {
+ public List getCoinOuts() throws IOException {
+ try {
+ return bitflyer.getCoinOuts(apiKey, exchange.getNonceFactory(), signatureCreator);
+ } catch (BitflyerException e) {
+ throw handleError(e);
+ }
+ }
+
+ public List getBankAccounts() throws IOException {
+ try {
+ return bitflyer.getBankAccounts(apiKey, exchange.getNonceFactory(), signatureCreator);
+ } catch (BitflyerException e) {
+ throw handleError(e);
+ }
+ }
+ public List getCashDeposits() throws IOException {
try {
- return bitflyer.getMarginStatus(apiKey, exchange.getNonceFactory(), signatureCreator);
+ return bitflyer.getCashDeposits(apiKey, exchange.getNonceFactory(), signatureCreator);
+ } catch (BitflyerException e) {
+ throw handleError(e);
+ }
+ }
+
+ public BitflyerWithdrawResponse withdrawFunds(String currencyCode, String bankAccountID, BigDecimal amount) throws IOException {
+ try {
+ return bitflyer.withdrawFunds(apiKey, exchange.getNonceFactory(), signatureCreator, new BitflyerWithdrawRequest(currencyCode, bankAccountID, amount));
+ } catch (BitflyerException e) {
+ throw handleError(e);
+ }
+ }
+
+ public List getWithdrawals() throws IOException {
+ try {
+ return bitflyer.getWithdrawals(apiKey, exchange.getNonceFactory(), signatureCreator);
} catch (BitflyerException e) {
throw handleError(e);
}
}
- public List getBitflyerBalances() throws IOException {
+
+ public BitflyerMarginStatus getBitflyerMarginStatus() throws IOException {
+
try {
- return bitflyer.getBalances(apiKey, exchange.getNonceFactory(), signatureCreator);
+ return bitflyer.getMarginStatus(apiKey, exchange.getNonceFactory(), signatureCreator);
} catch (BitflyerException e) {
throw handleError(e);
}
}
-
+
public List getBitflyerMarginAccounts() throws IOException {
try {
@@ -47,7 +111,15 @@ public List getBitflyerMarginAccounts() throws IOExceptio
throw handleError(e);
}
}
-
+
+ public List getBitflyerBalances() throws IOException {
+ try {
+ return bitflyer.getBalances(apiKey, exchange.getNonceFactory(), signatureCreator);
+ } catch (BitflyerException e) {
+ throw handleError(e);
+ }
+ }
+
public List getBitflyerMarginHistory() throws IOException {
try {
diff --git a/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerTradeHistoryParams.java b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerTradeHistoryParams.java
new file mode 100644
index 000000000..ab04f8e6e
--- /dev/null
+++ b/xchange-bitflyer/src/main/java/org/knowm/xchange/bitflyer/service/BitflyerTradeHistoryParams.java
@@ -0,0 +1,31 @@
+package org.knowm.xchange.bitflyer.service;
+
+import java.util.Arrays;
+
+import org.knowm.xchange.currency.Currency;
+import org.knowm.xchange.service.trade.params.TradeHistoryParamCurrencies;
+
+/**
+ * {@link TradeHistoryParam}. Allows filtering to just the provided set of currencies.
+ * If left null all currencies are included.
+ * @author bryant_harris
+ *
+ */
+public class BitflyerTradeHistoryParams implements TradeHistoryParamCurrencies {
+ Currency[] currencies;
+
+ @Override
+ public void setCurrencies(Currency[] currencies) {
+ this.currencies = currencies;
+ }
+
+ @Override
+ public Currency[] getCurrencies() {
+ return currencies;
+ }
+
+ @Override
+ public String toString() {
+ return "BitflyerTradeHistoryParams [currencies=" + Arrays.toString(currencies) + "]";
+ }
+}
diff --git a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/Bitmex.java b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/Bitmex.java
index bea15f929..e8d39da3c 100755
--- a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/Bitmex.java
+++ b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/Bitmex.java
@@ -1,15 +1,12 @@
package org.knowm.xchange.bitmex;
import java.io.IOException;
+import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.annotation.Nullable;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
+import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import org.knowm.xchange.bitmex.dto.account.BitmexAccount;
@@ -37,8 +34,8 @@ BitmexAccount getAccount(@HeaderParam("api-key") String apiKey, @HeaderParam("ap
@GET
@Path("user/wallet")
- BitmexWallet getWallet(@HeaderParam("api-key") String apiKey, @HeaderParam("api-nonce") SynchronizedValueFactory nonce, @HeaderParam("api-signature") ParamsDigest paramsDigest,
- @Nullable @QueryParam("currency") String currency) throws IOException;
+ BitmexWallet getWallet(@HeaderParam("api-key") String apiKey, @HeaderParam("api-nonce") SynchronizedValueFactory nonce, @HeaderParam("api-signature") ParamsDigest paramsDigest/*,
+ @Nullable @QueryParam("currency") String currency*/) throws IOException;
// Get a history of all of your wallet transactions (deposits, withdrawals, PNL)
@GET
@@ -64,7 +61,9 @@ List getMarginAccountsStatus(@HeaderParam("api-key") String
@GET
@Path("trade")
- BitmexPublicTrade[] getTrades(@QueryParam("symbol") String currencyPair, @QueryParam("reverse") Boolean reverse) throws IOException;
+ BitmexPublicTrade[] getTrades(@QueryParam("symbol") String currencyPair, @QueryParam("reverse") Boolean reverse,
+ @Nullable @QueryParam("count") Integer count,
+ @Nullable @QueryParam("start") Integer start) throws IOException;
@GET
@Path("orderBook/L2")
@@ -110,4 +109,39 @@ List getOrders(@HeaderParam("api-key") String apiKey,
@Nullable @QueryParam("reverse") Boolean reverse,
@Nullable @QueryParam("startTime") Date startTime,
@Nullable @QueryParam("endTime") Date endTime);
+
+ @POST
+ @Path("order")
+ BitmexPrivateOrder placeOrder(@HeaderParam("api-key") String apiKey,
+ @HeaderParam("api-nonce") SynchronizedValueFactory nonce,
+ @HeaderParam("api-signature") ParamsDigest paramsDigest,
+ @FormParam("symbol") String symbol,
+ @FormParam("orderQty") int orderQuantity,
+ @FormParam("price") BigDecimal price,
+ @Nullable @FormParam("stopPx") BigDecimal stopPrice,
+ @Nullable @FormParam("ordType") String orderType,
+ @Nullable @FormParam("execInst") String executionInstructions);
+
+ @DELETE
+ @Path("order")
+ List cancelOrder(@HeaderParam("api-key") String apiKey,
+ @HeaderParam("api-nonce") SynchronizedValueFactory nonce,
+ @HeaderParam("api-signature") ParamsDigest paramsDigest,
+ @FormParam("orderID") String orderID);
+
+ @GET
+ @Path("user/depositAddress")
+ String getDepositAddress(@HeaderParam("api-key") String apiKey,
+ @HeaderParam("api-nonce") SynchronizedValueFactory nonce,
+ @HeaderParam("api-signature") ParamsDigest paramsDigest,
+ @QueryParam("currency") String currency);
+
+ @POST
+ @Path("user/requestWithdrawal")
+ BitmexWalletTransaction withdrawFunds(@HeaderParam("api-key") String apiKey,
+ @HeaderParam("api-nonce") SynchronizedValueFactory nonce,
+ @HeaderParam("api-signature") ParamsDigest paramsDigest,
+ @FormParam("currency") String currency,
+ @FormParam("amount") BigDecimal amount,
+ @FormParam("address") String address);
}
\ No newline at end of file
diff --git a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/BitmexAdapters.java b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/BitmexAdapters.java
index fe6966029..acc78b8f7 100644
--- a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/BitmexAdapters.java
+++ b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/BitmexAdapters.java
@@ -67,14 +67,14 @@ public static OrdersContainer adaptOrders(List orders, Curren
}
- public static Trades adaptTrades(BitmexPublicTrade[] trades, CurrencyPair currencyPair) {
+ public static Trades adaptTrades(List trades, CurrencyPair currencyPair) {
- List tradeList = new ArrayList<>(trades.length);
- for (int i = 0; i < trades.length; i++) {
- BitmexPublicTrade trade = trades[i];
+ List tradeList = new ArrayList<>(trades.size());
+ for (int i = 0; i < trades.size(); i++) {
+ BitmexPublicTrade trade = trades.get(i);
tradeList.add(adaptTrade(trade, currencyPair));
}
- long lastTid = trades.length > 0 ? (trades[0].getTime().getTime()) : 0;
+ long lastTid = trades.size() > 0 ? (trades.get(0).getTime().getTime()) : 0;
// long lastTid = 0L;
return new Trades(tradeList, lastTid, TradeSortType.SortByTimestamp);
}
diff --git a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/BitmexUtils.java b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/BitmexUtils.java
index ea24e9068..eceb3489a 100644
--- a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/BitmexUtils.java
+++ b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/BitmexUtils.java
@@ -74,22 +74,22 @@ public static CurrencyPair translateBitmexCurrencyPair(String currencyPairIn) {
if (pair == null) {
// bitmex can give short pairs back from open orders ?
if (currencyPairIn.length() == 6) {
- Currency base = new Currency(currencyPairIn.substring(0, 3));
+ Currency base = Currency.getInstance(currencyPairIn.substring(0, 3));
if (base.getCommonlyUsedCurrency() != null) {
base = base.getCommonlyUsedCurrency();
}
- Currency counter = new Currency(currencyPairIn.substring(3, 6));
+ Currency counter = Currency.getInstance(currencyPairIn.substring(3, 6));
if (counter.getCommonlyUsedCurrency() != null) {
counter = counter.getCommonlyUsedCurrency();
}
pair = new CurrencyPair(base, counter);
}
else if (currencyPairIn.length() == 7) {
- Currency base = new Currency(currencyPairIn.substring(0, 4));
+ Currency base = Currency.getInstance(currencyPairIn.substring(0, 4));
if (base.getCommonlyUsedCurrency() != null) {
base = base.getCommonlyUsedCurrency();
}
- Currency counter = new Currency(currencyPairIn.substring(4, 7));
+ Currency counter = Currency.getInstance(currencyPairIn.substring(4, 7));
if (counter.getCommonlyUsedCurrency() != null) {
counter = counter.getCommonlyUsedCurrency();
}
diff --git a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexAccountService.java b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexAccountService.java
index ed4484a41..d343296e4 100755
--- a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexAccountService.java
+++ b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexAccountService.java
@@ -6,9 +6,12 @@
import org.knowm.xchange.Exchange;
import org.knowm.xchange.bitmex.dto.account.BitmexAccount;
+import org.knowm.xchange.bitmex.dto.account.BitmexWallet;
import org.knowm.xchange.currency.Currency;
import org.knowm.xchange.dto.account.AccountInfo;
+import org.knowm.xchange.dto.account.Balance;
import org.knowm.xchange.dto.account.FundingRecord;
+import org.knowm.xchange.dto.account.Wallet;
import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException;
import org.knowm.xchange.service.account.AccountService;
import org.knowm.xchange.service.trade.params.TradeHistoryParams;
@@ -16,45 +19,53 @@
public class BitmexAccountService extends BitmexAccountServiceRaw implements AccountService {
- /**
- * Constructor
- *
- * @param exchange
- */
- public BitmexAccountService(Exchange exchange) {
-
- super(exchange);
- }
-
- @Override
- public AccountInfo getAccountInfo() throws IOException {
- BitmexAccount account = super.getBitmexAccountInfo();
- return new AccountInfo(account.getUsername());
- }
-
- @Override
- public String withdrawFunds(Currency currency, BigDecimal amount, String address) throws IOException {
- throw new NotYetImplementedForExchangeException();
- }
-
- @Override
- public String withdrawFunds(WithdrawFundsParams params) throws IOException {
- throw new NotYetImplementedForExchangeException();
- }
-
- @Override
- public String requestDepositAddress(Currency currency, String... args) throws IOException {
- throw new NotYetImplementedForExchangeException();
- }
-
- @Override
- public TradeHistoryParams createFundingHistoryParams() {
- throw new NotYetImplementedForExchangeException();
- }
-
- @Override
- public List getFundingHistory(TradeHistoryParams params) throws IOException {
- throw new NotYetImplementedForExchangeException();
- }
+ /**
+ * Constructor
+ *
+ * @param exchange
+ */
+ public BitmexAccountService(Exchange exchange) {
+
+ super(exchange);
+ }
+
+ @Override
+ public AccountInfo getAccountInfo() throws IOException {
+ BitmexAccount account = super.getBitmexAccountInfo();
+ BitmexWallet bitmexWallet = getBitmexWallet();
+ String username = account.getUsername();
+ BigDecimal amount = bitmexWallet.getAmount();
+ BigDecimal amt = amount.divide(BigDecimal.valueOf(100_000_000L));
+ Balance balance = new Balance(Currency.BTC, amt);
+ Wallet wallet = new Wallet(Currency.BTC.getSymbol(), balance
+ );
+ AccountInfo accountInfo = new AccountInfo(username, wallet);
+ return accountInfo;
+ }
+
+ @Override
+ public String withdrawFunds(Currency currency, BigDecimal amount, String address) throws IOException {
+ return withdrawFunds(currency.getCurrencyCode(), amount, address);
+ }
+
+ @Override
+ public String withdrawFunds(WithdrawFundsParams params) throws IOException {
+ throw new NotYetImplementedForExchangeException();
+ }
+
+ @Override
+ public String requestDepositAddress(Currency currency, String... args) throws IOException {
+ return requestDepositAddress(currency.getCurrencyCode());
+ }
+
+ @Override
+ public TradeHistoryParams createFundingHistoryParams() {
+ throw new NotYetImplementedForExchangeException();
+ }
+
+ @Override
+ public List getFundingHistory(TradeHistoryParams params) throws IOException {
+ throw new NotYetImplementedForExchangeException();
+ }
}
diff --git a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexAccountServiceRaw.java b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexAccountServiceRaw.java
index fa8991bdb..d486878de 100755
--- a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexAccountServiceRaw.java
+++ b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexAccountServiceRaw.java
@@ -1,33 +1,37 @@
package org.knowm.xchange.bitmex.service;
import java.io.IOException;
+import java.math.BigDecimal;
import java.util.List;
import org.knowm.xchange.Exchange;
+import org.knowm.xchange.bitmex.Bitmex;
import org.knowm.xchange.bitmex.BitmexException;
import org.knowm.xchange.bitmex.dto.account.BitmexAccount;
import org.knowm.xchange.bitmex.dto.account.BitmexMarginAccount;
import org.knowm.xchange.bitmex.dto.account.BitmexWallet;
import org.knowm.xchange.bitmex.dto.account.BitmexWalletTransaction;
import org.knowm.xchange.currency.Currency;
+import org.knowm.xchange.dto.account.Balance;
+import org.knowm.xchange.dto.account.Wallet;
public class BitmexAccountServiceRaw extends BitmexBaseService {
- String apiKey = exchange.getExchangeSpecification().getApiKey();
+ String apiKey = exchange.getExchangeSpecification().getApiKey();
- /**
- * Constructor
- *
- * @param exchange
- */
+ /**
+ * Constructor
+ *
+ * @param exchange
+ */
- public BitmexAccountServiceRaw(Exchange exchange) {
+ public BitmexAccountServiceRaw(Exchange exchange) {
- super(exchange);
+ super(exchange);
- }
+ }
- public BitmexAccount getBitmexAccountInfo() throws IOException {
+ public BitmexAccount getBitmexAccountInfo() throws IOException {
try {
return bitmex.getAccount(apiKey, exchange.getNonceFactory(), signatureCreator);
@@ -36,49 +40,66 @@ public BitmexAccount getBitmexAccountInfo() throws IOException {
}
}
- public BitmexWallet getBitmexWallet(Currency ccy) throws IOException {
+ public BitmexWallet getBitmexWallet(Currency... ccy) throws IOException {
try {
- return bitmex.getWallet(apiKey, exchange.getNonceFactory(), signatureCreator, ccy.getCurrencyCode());
+ return bitmex.getWallet(apiKey, exchange.getNonceFactory(), signatureCreator/*, ccy.length>0?ccy[0].getCurrencyCode():null*/);
} catch (BitmexException e) {
throw handleError(e);
}
}
- public List getBitmexWalletHistory(Currency ccy) throws IOException {
+ public List getBitmexWalletHistory(Currency ccy) throws IOException {
- try {
- return bitmex.getWalletHistory(apiKey, exchange.getNonceFactory(), signatureCreator, ccy.getCurrencyCode());
- } catch (BitmexException e) {
- throw handleError(e);
+ try {
+ return bitmex.getWalletHistory(apiKey, exchange.getNonceFactory(), signatureCreator, ccy.getCurrencyCode());
+ } catch (BitmexException e) {
+ throw handleError(e);
+ }
}
- }
- public List getBitmexWalletSummary(Currency ccy) throws IOException {
+ public List getBitmexWalletSummary(Currency ccy) throws IOException {
- try {
- return bitmex.getWalletSummary(apiKey, exchange.getNonceFactory(), signatureCreator, ccy.getCurrencyCode());
- } catch (BitmexException e) {
- throw handleError(e);
+ try {
+ return bitmex.getWalletSummary(apiKey, exchange.getNonceFactory(), signatureCreator, ccy.getCurrencyCode());
+ } catch (BitmexException e) {
+ throw handleError(e);
+ }
}
- }
- public BitmexMarginAccount getBitmexMarginAccountStatus(Currency ccy) throws IOException {
+ public BitmexMarginAccount getBitmexMarginAccountStatus(Currency ccy) throws IOException {
- try {
- return bitmex.getMarginAccountStatus(apiKey, exchange.getNonceFactory(), signatureCreator, ccy.getCurrencyCode());
- } catch (BitmexException e) {
- throw handleError(e);
+ try {
+ return bitmex.getMarginAccountStatus(apiKey, exchange.getNonceFactory(), signatureCreator, ccy.getCurrencyCode());
+ } catch (BitmexException e) {
+ throw handleError(e);
+ }
}
- }
- public List getBitmexMarginAccountsStatus() throws IOException {
+ public List getBitmexMarginAccountsStatus() throws IOException {
- try {
- return bitmex.getMarginAccountsStatus(apiKey, exchange.getNonceFactory(), signatureCreator);
- } catch (BitmexException e) {
- throw handleError(e);
+ try {
+ return bitmex.getMarginAccountsStatus(apiKey, exchange.getNonceFactory(), signatureCreator);
+ } catch (BitmexException e) {
+ throw handleError(e);
+ }
+ }
+
+ public String requestDepositAddress(String currency) throws IOException {
+ try {
+ return bitmex.getDepositAddress(apiKey, exchange.getNonceFactory(), signatureCreator, currency);
+ } catch (BitmexException e) {
+ throw handleError(e);
+ }
+ }
+
+ public String withdrawFunds(String currency, BigDecimal amount, String address) throws IOException {
+ try {
+ BitmexWalletTransaction transaction = bitmex.withdrawFunds(apiKey, exchange.getNonceFactory(), signatureCreator, currency, amount, address);
+ return transaction.getTransactID();
+ } catch (BitmexException e) {
+ throw handleError(e);
+ }
}
- }
}
diff --git a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexDigest.java b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexDigest.java
index d9f3caeb6..43dabe2ad 100755
--- a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexDigest.java
+++ b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexDigest.java
@@ -3,7 +3,6 @@
import java.util.Base64;
import javax.ws.rs.HeaderParam;
-import javax.ws.rs.QueryParam;
import org.apache.commons.codec.binary.Hex;
import org.knowm.xchange.service.BaseParamsDigest;
@@ -37,11 +36,8 @@ public static BitmexDigest createInstance(String secretKeyBase64) {
public String digestParams(RestInvocation restInvocation) {
String nonce = restInvocation.getParamValue(HeaderParam.class, "api-nonce").toString();
-
- String params = restInvocation.getParamsMap().get(QueryParam.class).toString();
- String query = params.isEmpty() ? "" : "?" + params;
-
- String payload = restInvocation.getHttpMethod() + "/" + restInvocation.getPath() + query + nonce + restInvocation.getRequestBody();
+ String path = restInvocation.getInvocationUrl().split(restInvocation.getBaseUrl())[1];
+ String payload = restInvocation.getHttpMethod() + "/" + path + nonce + restInvocation.getRequestBody();
return new String(Hex.encodeHex(getMac().doFinal(payload.getBytes())));
}
diff --git a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexMarketDataServiceRaw.java b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexMarketDataServiceRaw.java
index c4539c71e..8d01858c6 100755
--- a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexMarketDataServiceRaw.java
+++ b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexMarketDataServiceRaw.java
@@ -1,9 +1,7 @@
package org.knowm.xchange.bitmex.service;
import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import org.knowm.xchange.Exchange;
import org.knowm.xchange.bitmex.BitmexAdapters;
@@ -60,17 +58,24 @@ public BitmexDepth getBitmexDepth(CurrencyPair pair, BitmexPrompt prompt, Object
public Trades getBitmexTrades(CurrencyPair pair, BitmexPrompt prompt, Object... args) throws IOException {
+ List trades = new ArrayList<>();
+
BitmexContract contract = new BitmexContract(pair, prompt);
String bitmexSymbol = BitmexUtils.translateBitmexContract(contract);
- BitmexPublicTrade[] result = bitmex.getTrades(bitmexSymbol, true);
- if (pair != null && prompt != null)
- return BitmexAdapters.adaptTrades(result, pair);
+ Integer limit = (Integer) args[0];
- // return result;
- return null;
+ for (int i = 0; trades.size() + 500 <= limit; i++) {
+ BitmexPublicTrade[] result = bitmex.getTrades(bitmexSymbol, true, 500, i * 500);
+ trades.addAll(Arrays.asList(result));
+ }
- // return checkResult(result);
+ if (pair != null && prompt != null) {
+ List trimmed = trades.subList(0, Math.min(limit, trades.size()));
+ return BitmexAdapters.adaptTrades(trimmed, pair);
+ }
+
+ return null;
}
public List getTicker(String symbol) throws IOException {
diff --git a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexTradeService.java b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexTradeService.java
index 9969e7cea..4d29747d0 100755
--- a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexTradeService.java
+++ b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexTradeService.java
@@ -1,9 +1,7 @@
package org.knowm.xchange.bitmex.service;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
import org.knowm.xchange.Exchange;
import org.knowm.xchange.bitmex.dto.marketdata.BitmexPrivateOrder;
@@ -54,27 +52,41 @@ public OpenOrders getOpenOrders() throws IOException {
@Override
public OpenOrders getOpenOrders(OpenOrdersParams params) throws IOException {
- throw new NotYetImplementedForExchangeException();
+ List limitOrders = new ArrayList<>();
+
+ for (LimitOrder order : getOpenOrders().getOpenOrders()) {
+ if (params.accept(order)) {
+ limitOrders.add(order);
+ }
+ }
+
+ return new OpenOrders(limitOrders);
}
@Override
public String placeMarketOrder(MarketOrder marketOrder) throws IOException {
- throw new NotYetImplementedForExchangeException();
+ String symbol = marketOrder.getCurrencyPair().base.getCurrencyCode() + marketOrder.getCurrencyPair().counter.getCurrencyCode();
+ BitmexPrivateOrder order = placeMarketOrder(symbol, marketOrder.getOriginalAmount(), null);
+ return order.getId();
}
@Override
public String placeLimitOrder(LimitOrder limitOrder) throws IOException {
- throw new NotYetImplementedForExchangeException();
+ String symbol = limitOrder.getCurrencyPair().base.getCurrencyCode() + limitOrder.getCurrencyPair().counter.getCurrencyCode();
+ BitmexPrivateOrder order = placeLimitOrder(symbol, limitOrder.getOriginalAmount(), limitOrder.getLimitPrice(), null);
+ return order.getId();
}
@Override
public String placeStopOrder(StopOrder stopOrder) throws IOException {
- throw new NotYetImplementedForExchangeException();
+ String symbol = stopOrder.getCurrencyPair().base.getCurrencyCode() + stopOrder.getCurrencyPair().counter.getCurrencyCode();
+ BitmexPrivateOrder order = placeStopOrder(symbol, stopOrder.getOriginalAmount(), stopOrder.getStopPrice(), null);
+ return order.getId();
}
@Override
public boolean cancelOrder(String orderId) throws IOException {
- throw new NotYetImplementedForExchangeException();
+ return cancelBitmexOrder(orderId);
}
@Override
@@ -99,6 +111,21 @@ public OpenOrdersParams createOpenOrdersParams() {
@Override
public Collection getOrder(String... orderIds) throws IOException {
- throw new NotYetImplementedForExchangeException();
+
+ String filter = "{\"orderID\": [\"" + String.join("\",\"", orderIds) + "\"]}";
+
+ List privateOrders = getBitmexOrders(null, filter);
+
+ Set orders = new HashSet<>();
+
+ for (BitmexPrivateOrder privateOrder : privateOrders) {
+ Order.OrderType type = privateOrder.getSide() == BitmexSide.BUY ? Order.OrderType.BID : Order.OrderType.ASK;
+ CurrencyPair pair = new CurrencyPair(privateOrder.getCurrency(), privateOrder.getSettleCurrency());
+
+ orders.add(new LimitOrder(type, privateOrder.getVolume(), pair, privateOrder.getId(), privateOrder.getTimestamp(),
+ privateOrder.getPrice()));
+ }
+
+ return orders;
}
}
diff --git a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexTradeServiceRaw.java b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexTradeServiceRaw.java
index ccd25c4e2..2a2444faa 100755
--- a/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexTradeServiceRaw.java
+++ b/xchange-bitmex/src/main/java/org/knowm/xchange/bitmex/service/BitmexTradeServiceRaw.java
@@ -1,6 +1,7 @@
package org.knowm.xchange.bitmex.service;
import java.io.IOException;
+import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -41,15 +42,39 @@ public List getBitmexPositions(String symbol) throws IOException
}
}
- public List getBitmexOrders() throws IOException {
+ public List