improve getting data from alpaca
This commit is contained in:
@@ -33,6 +33,7 @@ secrets.properties
|
|||||||
captures
|
captures
|
||||||
.externalNativeBuild
|
.externalNativeBuild
|
||||||
.cxx
|
.cxx
|
||||||
|
setAlpacaEnv.sh
|
||||||
|
|
||||||
# Databases (Local/Testing)
|
# Databases (Local/Testing)
|
||||||
*.db
|
*.db
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
version = "1.0.1"
|
version = "1.1.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register<Exec>("serverDockerBuild") {
|
tasks.register<Exec>("serverDockerBuild") {
|
||||||
|
|||||||
@@ -13,13 +13,14 @@ import kotlinx.serialization.Serializable
|
|||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class AlpacaAssetBar(
|
data class AlpacaQuote(
|
||||||
val c: Float
|
val ap: Float,
|
||||||
|
val bp: Float,
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class AlpacaBars(
|
data class AlpacaSnapshot(
|
||||||
val bars: Map<String, AlpacaAssetBar>
|
val latestQuote: AlpacaQuote
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@@ -87,17 +88,18 @@ class AlpacaAPI(val apiKey: String, val apiSecret: String) {
|
|||||||
if (assets.isEmpty()) {
|
if (assets.isEmpty()) {
|
||||||
return Result.success(emptyMap())
|
return Result.success(emptyMap())
|
||||||
}
|
}
|
||||||
val result = safeApiCall<AlpacaBars>(
|
val result = safeApiCall<Map<String, AlpacaSnapshot>>(
|
||||||
"https://data.alpaca.markets/v2/stocks/bars/latest",
|
"https://data.alpaca.markets/v2/stocks/snapshots",
|
||||||
mapOf(
|
mapOf(
|
||||||
"symbols" to assets.joinToString(",") { it.symbol },
|
"symbols" to assets.joinToString(",") { it.symbol.trim().uppercase() },
|
||||||
"feed" to "delayed_sip"
|
"feed" to "delayed_sip"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return result.map { bars ->
|
return result.map { data ->
|
||||||
bars.bars.mapNotNull { (key, value) ->
|
data.mapNotNull { (assetSymbol, snapshot) ->
|
||||||
val asset = assets.find { it.symbol == key } ?: return@mapNotNull null
|
val asset = assets.find { it.symbol.equals(assetSymbol, ignoreCase = true) } ?: return@mapNotNull null
|
||||||
asset to Cash.fromFloat(value.c)
|
println("${snapshot.latestQuote.ap} + ${snapshot.latestQuote.bp}")
|
||||||
|
asset to Cash.fromFloat((snapshot.latestQuote.ap + snapshot.latestQuote.bp) / 2)
|
||||||
}.toMap()
|
}.toMap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,6 +98,15 @@ fun Application.module() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
launch {
|
launch {
|
||||||
|
val assets = alpacaAPI.getTradableAssets()
|
||||||
|
assets.onSuccess { assets ->
|
||||||
|
val prices = alpacaAPI.getPrices(assets.filterIndexed { index, asset -> index < 20 }
|
||||||
|
.map { asset -> asset.toAsset(0) })
|
||||||
|
prices.onSuccess { prices ->
|
||||||
|
prices.forEach { (asset, cash) -> println("${asset.name}: ${cash.toString()}") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return@launch
|
||||||
while (true) {
|
while (true) {
|
||||||
updateAssets(database = database, api = alpacaAPI)
|
updateAssets(database = database, api = alpacaAPI)
|
||||||
delay(1.days)
|
delay(1.days)
|
||||||
|
|||||||
Reference in New Issue
Block a user