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 captures
.externalNativeBuild .externalNativeBuild
.cxx .cxx
setAlpacaEnv.sh
# Databases (Local/Testing) # Databases (Local/Testing)
*.db *.db
+1 -1
View File
@@ -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)