매수, 매도 색상 수정

This commit is contained in:
Macbook
2026-05-31 01:23:47 +09:00
parent ba4ef5e230
commit 9d7dddfa57
24 changed files with 573 additions and 441 deletions
@@ -0,0 +1,97 @@
package com.goldenchart.service;
import com.goldenchart.entity.GcLiveStrategySettings;
import com.goldenchart.repository.GcLiveStrategySettingsRepository;
import com.goldenchart.storage.Ta4jStorage;
import com.goldenchart.trading.pipeline.OrderExecutionQueue;
import com.goldenchart.websocket.TradingWebSocketBroker;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.ta4j.core.Bar;
import org.ta4j.core.BarSeries;
import org.ta4j.core.BaseBarSeriesBuilder;
import org.ta4j.core.bars.TimeBarBuilderFactory;
import org.ta4j.core.num.DoubleNumFactory;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
class BarCloseStrategyEvaluationServiceTest {
@Mock private LiveStrategyEvaluator liveStrategyEvaluator;
@Mock private TradeSignalService tradeSignalService;
@Mock private OrderExecutionQueue orderExecutionQueue;
@Mock private GcLiveStrategySettingsRepository liveSettingsRepo;
@Mock private StrategyConditionTimeframeService conditionTimeframes;
@Mock private TradingWebSocketBroker broker;
@Mock private Ta4jStorage ta4jStorage;
private BarCloseStrategyEvaluationService service;
@BeforeEach
void setUp() {
service = new BarCloseStrategyEvaluationService(
liveStrategyEvaluator, tradeSignalService, orderExecutionQueue,
liveSettingsRepo, conditionTimeframes, broker, ta4jStorage);
}
@Test
void onMaturedBarClose_evaluatesOnlyDslTimeframes_andDedupesSameBarEnd() {
GcLiveStrategySettings setting = new GcLiveStrategySettings();
setting.setStrategyId(10L);
setting.setIsLiveCheck(true);
setting.setExecutionType("CANDLE_CLOSE");
setting.setMarket("KRW-BTC");
when(liveSettingsRepo.findActiveByMarket("KRW-BTC")).thenReturn(List.of(setting));
when(conditionTimeframes.usesTimeframe(10L, "5m")).thenReturn(true);
when(conditionTimeframes.usesTimeframe(10L, "15m")).thenReturn(false);
when(liveStrategyEvaluator.evaluateSettingOnCandleClose(eq(setting), eq("KRW-BTC"), eq("5m"), anyInt()))
.thenReturn("NONE");
Bar bar = sampleBar(Duration.ofMinutes(5), Instant.parse("2026-05-29T10:05:00Z"));
service.onMaturedBarClose("KRW-BTC", "5m", 0, bar);
service.onMaturedBarClose("KRW-BTC", "5m", 0, bar);
verify(liveStrategyEvaluator, times(1))
.evaluateSettingOnCandleClose(setting, "KRW-BTC", "5m", 0);
verify(broker, never()).publish(anyString(), anyString(), any());
}
@Test
void shouldEvaluateOnClose_falseWhenNoMatchingTimeframe() {
when(liveSettingsRepo.findActiveByMarket("KRW-ETH")).thenReturn(List.of());
assertFalse(service.shouldEvaluateOnClose("KRW-ETH", "3m"));
}
@Test
void shouldEvaluateOnClose_trueWhenStrategyUsesTimeframe() {
GcLiveStrategySettings s = new GcLiveStrategySettings();
s.setStrategyId(1L);
s.setIsLiveCheck(true);
when(liveSettingsRepo.findActiveByMarket("KRW-BTC")).thenReturn(List.of(s));
when(conditionTimeframes.usesTimeframe(1L, "10m")).thenReturn(true);
assertTrue(service.shouldEvaluateOnClose("KRW-BTC", "10m"));
}
private static Bar sampleBar(Duration period, Instant end) {
return new BaseBarSeriesBuilder()
.withBarBuilderFactory(new TimeBarBuilderFactory())
.withNumFactory(DoubleNumFactory.getInstance())
.build()
.barBuilder()
.timePeriod(period)
.endTime(end)
.openPrice(1).highPrice(2).lowPrice(0.5).closePrice(1.5).volume(10)
.build();
}
}