diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/service/cryptotail/CryptoTailOrderbookWsService.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/service/cryptotail/CryptoTailOrderbookWsService.kt index 7ad37b3..8797df3 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/service/cryptotail/CryptoTailOrderbookWsService.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/service/cryptotail/CryptoTailOrderbookWsService.kt @@ -10,6 +10,7 @@ import com.wrbug.polymarketbot.service.binance.BinanceKlineAutoSpreadService import com.wrbug.polymarketbot.util.RetrofitFactory import com.wrbug.polymarketbot.util.createClient import com.wrbug.polymarketbot.util.fromJson +import com.wrbug.polymarketbot.util.gt import com.wrbug.polymarketbot.util.toJson import com.wrbug.polymarketbot.util.toSafeBigDecimal import kotlinx.coroutines.CoroutineScope @@ -136,8 +137,13 @@ class CryptoTailOrderbookWsService( val assetId = (json.get("asset_id") as? com.google.gson.JsonPrimitive)?.asString ?: return val bids = json.get("bids") as? com.google.gson.JsonArray if (bids == null || bids.isEmpty) return - val firstBid = bids.get(0) as? com.google.gson.JsonObject - val bestBid = (firstBid?.get("price") as? com.google.gson.JsonPrimitive)?.asString?.toSafeBigDecimal() + // Polymarket book 的 bids 为价格升序,bids[0] 为最低买价;bestBid 应取最高买价 + var bestBid: BigDecimal? = null + for (i in 0 until bids.size()) { + val level = bids.get(i) as? com.google.gson.JsonObject ?: continue + val p = (level.get("price") as? com.google.gson.JsonPrimitive)?.asString?.toSafeBigDecimal() ?: continue + if (bestBid == null || p.gt(bestBid)) bestBid = p + } if (bestBid != null) onBestBid(assetId, bestBid) } @@ -157,10 +163,7 @@ class CryptoTailOrderbookWsService( private fun onBestBid(tokenId: String, bestBid: BigDecimal) { if (closedForNoStrategies.get()) return val entries = tokenToEntries.get()[tokenId] - if (entries == null) { - logger.debug("tokenToEntries null: $tokenId") - return - } + if (entries == null) return val nowSeconds = System.currentTimeMillis() / 1000 for (e in entries) { val windowStart = e.periodStartUnix + e.strategy.windowStartSeconds