
Real-time data through the Cryptocompare API
For real-time data, the Cryptocompare API is used (https://www.cryptocompare.com/api/#), more specifically HistoMinute (https://www.cryptocompare.com/api/#-api-data-histominute-), which gives us access to OHLC data for the past seven days at most. The details of the API will be discussed in a section devoted to implementation, but the API response is very similar to our historical dataset, and this data is retrieved using a regular HTTP request. For example, a simple JSON response from https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=23&aggregate=1&e=Bitstamp has the following structure:
{
"Response":"Success",
"Type":100,
"Aggregated":false,
"Data":
[{"time":1510774800,"close":7205,"high":7205,"low":7192.67,"open":7198, "volumefrom":81.73,"volumeto":588726.94},
{"time":1510774860,"close":7209.05,"high":7219.91,"low":7205,"open":7205, "volumefrom":16.39,"volumeto":118136.61},
... (other price data)
],
"TimeTo":1510776180,
"TimeFrom":1510774800,
"FirstValueInArray":true,
"ConversionType":{"type":"force_direct","conversionSymbol":""}
}
Through Cryptocompare HistoMinute, we can get open, high, low, close, volumefrom, and volumeto from each minute of historical data. This data is stored for 7 days only; if you need more, use the hourly or daily path. It uses BTC conversion if data is not available because the coin is not being traded in the specified currency:

Now, the following method fetches the correctly formed URL of the Cryptocompare API (https://www.cryptocompare.com/api/#-api-data-histominute-), which is a fully formed URL with all parameters, such as currency, limit, and aggregation specified. It finally returns the future that will have a response body parsed into the data model, with the price list to be processed at an upper level:
import javax.inject.Inject
import play.api.libs.json.{JsResult, Json}
import scala.concurrent.Future
import play.api.mvc._
import play.api.libs.ws._
import processing.model.CryptoCompareResponse
class RestClient @Inject() (ws: WSClient) {
def getPayload(url : String): Future[JsResult[CryptoCompareResponse]] = {
val request: WSRequest = ws.url(url)
val future = request.get()
implicit val context = play.api.libs.concurrent.Execution.Implicits.defaultContext
future.map {
response => response.json.validate[CryptoCompareResponse]
}
}
}
In the preceding code segment, the CryptoCompareResponse class is the model of API, which takes the following parameters:
- Response
- Type
- Aggregated
- Data
- FirstValueInArray
- TimeTo
- TimeFrom
Now, it has the following signature:
case class CryptoCompareResponse(Response : String,
Type : Int,
Aggregated : Boolean,
Data : List[OHLC],
FirstValueInArray : Boolean,
TimeTo : Long,
TimeFrom: Long)
object CryptoCompareResponse {
implicit val cryptoCompareResponseReads = Json.reads[CryptoCompareResponse]
}
Again, the preceding two code segments the open-high-low-close (also known as OHLC), are a model class for mapping with CryptoAPI response data array internals. It takes these parameters:
- Time: Timestamp in seconds, 1508818680, for instance.
- Open: Open price at a given minute interval.
- High: Highest price.
- Low: Lowest price.
- Close: Price at the closing of the interval.
- Volumefrom: Trading volume in the from currency. It's BTC in our case.
- Volumeto: The trading volume in the to currency, USD in our case.
- Dividing Volumeto by Volumefrom gives us the weighted price of BTC.
Now, it has the following signature:
case class OHLC(time: Long,
open: Double,
high: Double,
low: Double,
close: Double,
volumefrom: Double,
volumeto: Double)
object OHLC {
implicit val implicitOHLCReads = Json.reads[OHLC]
}