From 7dcd0080fc5f897b2c243c28b7423947af54b0ed Mon Sep 17 00:00:00 2001 From: Junyou Park Date: Mon, 10 Aug 2026 02:26:03 +0900 Subject: [PATCH] fix: align live strategy bars with adjusted history --- .../HttpAlpacaThirtyMinuteBarsClient.java | 2 +- .../HttpAlpacaThirtyMinuteBarsClientTest.java | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 modules/market-data-adapter/src/test/java/com/idea2strategy/trading/market/candle/HttpAlpacaThirtyMinuteBarsClientTest.java diff --git a/modules/market-data-adapter/src/main/java/com/idea2strategy/trading/market/candle/HttpAlpacaThirtyMinuteBarsClient.java b/modules/market-data-adapter/src/main/java/com/idea2strategy/trading/market/candle/HttpAlpacaThirtyMinuteBarsClient.java index 267ea02..dd2566a 100644 --- a/modules/market-data-adapter/src/main/java/com/idea2strategy/trading/market/candle/HttpAlpacaThirtyMinuteBarsClient.java +++ b/modules/market-data-adapter/src/main/java/com/idea2strategy/trading/market/candle/HttpAlpacaThirtyMinuteBarsClient.java @@ -50,7 +50,7 @@ public Map> fetch( String query = "symbols=" + encode(symbols) + "&timeframe=30Min&start=" + encode(session.opensAt().toString()) + "&end=" + encode(throughBoundary.toString()) - + "&limit=10000&feed=sip&adjustment=raw&sort=asc"; + + "&limit=10000&feed=sip&adjustment=all&sort=asc"; HttpRequest request = HttpRequest.newBuilder(URI.create(endpoint + "?" + query)) .header("APCA-API-KEY-ID", credentials.apiKey()) .header("APCA-API-SECRET-KEY", credentials.apiSecret()) diff --git a/modules/market-data-adapter/src/test/java/com/idea2strategy/trading/market/candle/HttpAlpacaThirtyMinuteBarsClientTest.java b/modules/market-data-adapter/src/test/java/com/idea2strategy/trading/market/candle/HttpAlpacaThirtyMinuteBarsClientTest.java new file mode 100644 index 0000000..130f2d0 --- /dev/null +++ b/modules/market-data-adapter/src/test/java/com/idea2strategy/trading/market/candle/HttpAlpacaThirtyMinuteBarsClientTest.java @@ -0,0 +1,53 @@ +package com.idea2strategy.trading.market.candle; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.idea2strategy.trading.market.alpaca.AlpacaCredentials; +import com.idea2strategy.trading.market.session.OfficialMarketSession; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Instant; +import java.time.LocalDate; +import java.util.Map; +import java.util.UUID; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; + +class HttpAlpacaThirtyMinuteBarsClientTest { + @Test + @SuppressWarnings("unchecked") + void requestsAdjustmentAllSoLiveBarsCanMergeWithCanonicalAdjustedHistory() throws Exception { + HttpClient http = mock(HttpClient.class); + HttpResponse response = mock(HttpResponse.class); + when(response.statusCode()).thenReturn(200); + when(response.body()).thenReturn("{}"); + when(http.send(any(HttpRequest.class), any(HttpResponse.BodyHandler.class))) + .thenReturn(response); + AlpacaThirtyMinuteBarsJsonParser parser = mock(AlpacaThirtyMinuteBarsJsonParser.class); + when(parser.parse(any(), any(), any(), any())).thenReturn(Map.of()); + HttpAlpacaThirtyMinuteBarsClient client = new HttpAlpacaThirtyMinuteBarsClient( + http, + URI.create("https://example.test/v2/stocks/bars"), + () -> new AlpacaCredentials("key", "secret"), + parser); + OfficialMarketSession session = new OfficialMarketSession( + LocalDate.parse("2026-08-10"), + Instant.parse("2026-08-10T13:30:00Z"), + Instant.parse("2026-08-10T20:00:00Z")); + + client.fetch( + Map.of("AAPL", UUID.fromString("70000000-0000-4000-8000-000000000001")), + session, + session.closesAt()); + + ArgumentCaptor request = ArgumentCaptor.forClass(HttpRequest.class); + verify(http).send(request.capture(), any(HttpResponse.BodyHandler.class)); + assertTrue(request.getValue().uri().getRawQuery().contains("adjustment=all")); + } +}