I just released my first open-source component, Scala Client for BTC-e Trade and Public Data APIs! BTC-e.com is broker for Bitcoin/Litecoin/Namecoin/other cryprocurrencies trading. This post is about some choices made during development and how to use the clients.
Usage Details and Examples
Implement ClientCredentials trait to connect to the Trade API :
object MyCredentials extends ClientCredentials { val Key = "my key" val Secret = "my secret" }Initialize Trade API client as
val tradeClient = new DefaultTradeApiClient(MyCredentials)Get free funds info with
It will print something likeclient.getInfo.map(println(_))USD: 4.7 RUR: 2399 EUR: 0.0 BTC: 10 LTC: 19.99 NMC: 0.0 NVC: 0.0 TRC: 0.0 PPC: 0.0Cancel all open orders with following code
tradeClient.orderList.getOrElse(List()).foreach{order=> tradeClient.cancelOrder(order.orderId) }Create order to sell 200 litecoins for $4.99 each
tradeClient.trade(Currency.LTC, Currency.USD, Direction.Sell, 4.99, 200.00)Close connections at the end
tradeClient.releaseConnectionsInitialize Public Data API as
val pubClient = new DefaultMarketDataApiClientGet last deal price from ticker data for BTC/USD and print it:
pubClient.ticker(Currency.BTC, Currency.USD).map{td=> println(td.last) }
See MarketDataApiClient and TradeApiClient classes for more functions.
Implementation and Customization Details
Common functions located in btce.scala, Trade API client in btce-trade.scala, Public Data API client in btce-marketdata.scala, Specs2 tests in BtceSpec.scala
There are many HTTP layer implementations. I implemented http requests/responses using WS framework from PlayFramework 2(Scala wrapper for Ning framework). If your project doesn’t use PlayFramework and/or already uses another HTTP framework(e.g. Apache HttpClient), make own implementation of HttpApiClient trait. Override functions
getRequest(url: String): String(simple get request, it’s used by Public Data API),signedPostRequest(url: String, key: String, Secret: String, postBody: String): String(post request with already signed postBody, used by Trade API ),releaseConnections(shutdown connections pool here, if needed). Then define own Trade API client with code likeclass MyTradeApiClient(credentials: ClientCredentials) extends TradeApiClient(credentials) with MyHttpApiClient,class MyMarketDataApiClient extends MarketDataApiClient with MyHttpApiClientfor Public Data client.Enumerations chosen over sealed case classes hierarchy, e.g.
object Direction extends Enumeration { type Direction = Value val Sell = Value("sell") val Buy = Value("buy") }It could be not the best choice in case of having in mind to build trading DSL over it. But I have no plans for trading DSL now.
No logging implemented in the released version to avoid extra dependency. If you incorporate a client into your software, add logging where needed(catch clauses, None results) with a logging framework project uses.
Again, the URL is https://github.com/kushti/btce-scala