Implement A3, A4, A5, B3: Add MarketOutcomePriceSnapshot, implement Polymarket CLOB prices-history endpoint, improve strategy classification, introduce CopytradingScore, and decouple/optimize scoring pipeline into a separate worker

This commit is contained in:
Richard
2026-07-03 11:20:28 +02:00
parent e994e1ce72
commit f8c8230d99
21 changed files with 2035 additions and 22 deletions
@@ -1,4 +1,5 @@
using System.Net.Http.Json;
using System.Text.Json.Serialization;
using Microsoft.Extensions.Logging;
using Predictalytics.Application.Interfaces;
using Predictalytics.Domain.Enums;
@@ -13,11 +14,13 @@ public class PolymarketApiClient
{
private readonly HttpClient _client;
private readonly HttpClient _gammaClient;
private readonly HttpClient _clobClient;
private readonly IRateLimiter _rateLimiter;
private readonly ILogger<PolymarketApiClient> _logger;
private const string DataApiBase = "https://data-api.polymarket.com";
private const string GammaApiBase = "https://gamma-api.polymarket.com";
private const string ClobApiBase = "https://clob.polymarket.com";
public PolymarketApiClient(IHttpClientFactory httpFactory, IRateLimiter rateLimiter, ILogger<PolymarketApiClient> logger)
{
@@ -29,6 +32,10 @@ public class PolymarketApiClient
_gammaClient.BaseAddress = new Uri(GammaApiBase);
_gammaClient.DefaultRequestHeaders.Add("Accept", "application/json");
_clobClient = httpFactory.CreateClient("PolymarketClob");
_clobClient.BaseAddress = new Uri(ClobApiBase);
_clobClient.DefaultRequestHeaders.Add("Accept", "application/json");
_rateLimiter = rateLimiter;
_logger = logger;
}
@@ -161,4 +168,22 @@ public class PolymarketApiClient
return default;
}
}
public async Task<List<PriceHistoryEntry>> GetPricesHistoryAsync(string clobTokenId, string interval = "6h", CancellationToken ct = default)
{
var url = $"/prices-history?market={clobTokenId}&interval={interval}";
var result = await ExecuteWithRetryAsync<PolymarketPriceHistoryResponse>(_clobClient, url, ct);
return result?.History ?? [];
}
}
public class PolymarketPriceHistoryResponse
{
[JsonPropertyName("history")] public List<PriceHistoryEntry> History { get; set; } = [];
}
public class PriceHistoryEntry
{
[JsonPropertyName("t")] public long Timestamp { get; set; }
[JsonPropertyName("p")] public double Price { get; set; }
}