improve getting data from alpaca

This commit is contained in:
Theo Tappe
2026-06-15 14:49:36 +02:00
parent 59dc70f62f
commit 3d7d124033
4 changed files with 24 additions and 12 deletions
+1
View File
@@ -33,6 +33,7 @@ secrets.properties
captures
.externalNativeBuild
.cxx
setAlpacaEnv.sh
# Databases (Local/Testing)
*.db
+1 -1
View File
@@ -36,7 +36,7 @@ dependencies {
}
allprojects {
version = "1.0.1"
version = "1.1.0"
}
tasks.register<Exec>("serverDockerBuild") {
@@ -13,13 +13,14 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
@Serializable
data class AlpacaAssetBar(
val c: Float
data class AlpacaQuote(
val ap: Float,
val bp: Float,
)
@Serializable
data class AlpacaBars(
val bars: Map<String, AlpacaAssetBar>
data class AlpacaSnapshot(
val latestQuote: AlpacaQuote
)
@Serializable
@@ -87,17 +88,18 @@ class AlpacaAPI(val apiKey: String, val apiSecret: String) {
if (assets.isEmpty()) {
return Result.success(emptyMap())
}
val result = safeApiCall<AlpacaBars>(
"https://data.alpaca.markets/v2/stocks/bars/latest",
val result = safeApiCall<Map<String, AlpacaSnapshot>>(
"https://data.alpaca.markets/v2/stocks/snapshots",
mapOf(
"symbols" to assets.joinToString(",") { it.symbol },
"symbols" to assets.joinToString(",") { it.symbol.trim().uppercase() },
"feed" to "delayed_sip"
)
)
return result.map { bars ->
bars.bars.mapNotNull { (key, value) ->
val asset = assets.find { it.symbol == key } ?: return@mapNotNull null
asset to Cash.fromFloat(value.c)
return result.map { data ->
data.mapNotNull { (assetSymbol, snapshot) ->
val asset = assets.find { it.symbol.equals(assetSymbol, ignoreCase = true) } ?: return@mapNotNull null
println("${snapshot.latestQuote.ap} + ${snapshot.latestQuote.bp}")
asset to Cash.fromFloat((snapshot.latestQuote.ap + snapshot.latestQuote.bp) / 2)
}.toMap()
}
}
@@ -98,6 +98,15 @@ fun Application.module() {
}
}
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) {
updateAssets(database = database, api = alpacaAPI)
delay(1.days)