전략편집기 기준값 보조지표 설정값 동기화

This commit is contained in:
Macbook
2026-05-28 09:20:06 +09:00
parent 9137864f48
commit e2816b037f
18 changed files with 710 additions and 153 deletions
@@ -59,6 +59,8 @@ public class LiveConditionStatusService {
Map<String, Map<String, Object>> params =
indicatorSettingsService.getAll(userId, deviceId);
Map<String, Map<String, Object>> visual =
indicatorSettingsService.getAllVisual(userId, deviceId);
List<PendingCond> pending = new ArrayList<>();
collectConditions(strategy.getBuyConditionJson(), "1m", "buy", pending);
@@ -84,12 +86,12 @@ public class LiveConditionStatusService {
for (PendingCond p : pending) {
String tf = LiveStrategyTimeframeService.normalize(p.timeframe());
if (!ta4jStorage.exists(market, tf)) {
rows.add(toRowUnevaluated(p));
rows.add(toRowUnevaluated(p, visual));
continue;
}
BarSeries series = ta4jStorage.getOrCreate(market, tf);
if (series.isEmpty()) {
rows.add(toRowUnevaluated(p));
rows.add(toRowUnevaluated(p, visual));
continue;
}
int index = series.getEndIndex();
@@ -100,12 +102,12 @@ public class LiveConditionStatusService {
StrategyDslToTa4jAdapter.RuleBuildContext ctx =
new StrategyDslToTa4jAdapter.RuleBuildContext(
series, params, market, ta4jStorage);
series, params, visual, market, ta4jStorage);
Rule rule = adapter.toRule(wrapper, ctx);
boolean satisfied = rule.isSatisfied(index, null);
Double current = adapter.readConditionFieldValue(
p.condition(), series, params, index, true);
Double target = readTargetNumeric(p.condition());
Double target = readTargetNumeric(p.condition(), visual);
if (target == null) {
target = adapter.readConditionFieldValue(
p.condition(), series, params, index, false);
@@ -115,7 +117,7 @@ public class LiveConditionStatusService {
if (satisfied) met++;
} catch (Exception e) {
log.debug("[LiveCondition] eval fail {} {}: {}", market, p.id(), e.getMessage());
rows.add(toRowUnevaluated(p));
rows.add(toRowUnevaluated(p, visual));
}
}
@@ -194,13 +196,14 @@ public class LiveConditionStatusService {
}
}
private LiveConditionRowDto toRowUnevaluated(PendingCond p) {
private LiveConditionRowDto toRowUnevaluated(PendingCond p,
Map<String, Map<String, Object>> visual) {
JsonNode c = p.condition();
String indType = c.path("indicatorType").asText("");
String plotKey = plotKeyFromCondition(c, indType);
String condType = c.path("conditionType").asText("GT");
String condLabel = CONDITION_LABEL.getOrDefault(condType, condType);
Double target = readTargetNumeric(c);
Double target = readTargetNumeric(c, visual);
return LiveConditionRowDto.builder()
.id(p.id())
.indicatorType(indType)
@@ -300,14 +303,17 @@ public class LiveConditionStatusService {
return String.format("%.2f", v);
}
private Double readTargetNumeric(JsonNode cond) {
private Double readTargetNumeric(JsonNode cond, Map<String, Map<String, Object>> visual) {
String indType = cond.path("indicatorType").asText("");
String rf = cond.path("rightField").asText("");
Double resolved = IndicatorHlineResolver.resolveThresholdField(cond, rf, indType, visual);
if (resolved != null) return resolved;
if (cond.has("targetValue") && !cond.path("targetValue").isNull()) {
return cond.path("targetValue").asDouble();
}
if (cond.has("compareValue") && !cond.path("compareValue").isNull()) {
return cond.path("compareValue").asDouble();
}
String rf = cond.path("rightField").asText("");
if (rf.startsWith("K_")) {
try { return Double.parseDouble(rf.substring(2)); } catch (NumberFormatException ignored) {}
}