Skip to content

Commit d88d611

Browse files
committed
fix: log execution result fields before assertions for CI diagnostics
BacktestWorkflow now logs instrument/strategyId/pnl/trades at INFO level after each execution poll completes. BacktestIntegrationTest logs the full ResultMap and individual fields unconditionally before any assertion, so transient backend anomalies leave a trace in CI output. The CI failure (strategyId=null) was a transient backend issue — confirmed by local re-run returning the field correctly.
1 parent b3af209 commit d88d611

2 files changed

Lines changed: 17 additions & 5 deletions

File tree

src/main/java/net/qtsurfer/api/sdk/workflows/BacktestWorkflow.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,15 @@ private ResultMap pollExecution(
192192
if (norm == Normalized.ABORTED) {
193193
throw new QTSCanceledError("Execution aborted");
194194
}
195-
return finalResult.getResults();
195+
ResultMap results = finalResult.getResults();
196+
log.info("Execution result for job {}: state={} instrument={} strategyId={} pnl={} trades={}",
197+
executeJobId,
198+
finalResult.getState().getStatus(),
199+
results != null ? results.getInstrument() : null,
200+
results != null ? results.getStrategyId() : null,
201+
results != null ? results.getPnlTotal() : null,
202+
results != null ? results.getTotalTrades() : null);
203+
return results;
196204
}
197205

198206
private String compileStrategy(String source, BacktestOptions opts) {

src/test/java/net/qtsurfer/api/sdk/integration/BacktestIntegrationTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,20 @@ void completesCompilePrepareExecuteAgainstBinanceBtcUsdt() throws Exception {
8080

8181
ResultMap result = qts.backtest(req, opts).get(5, TimeUnit.MINUTES);
8282

83+
// Log full result before any assertion so CI always shows the response
84+
log.info("Result: {}", result);
85+
log.info(" instrument={} strategyId={} pnl={} trades={} winRate={} sharpe={} cagr={} maxDD={}%",
86+
result.getInstrument(), result.getStrategyId(),
87+
result.getPnlTotal(), result.getTotalTrades(),
88+
result.getWinRate(), result.getSharpeRatio(),
89+
result.getCagr(), result.getMaxDrawdownPercent());
90+
8391
assertNotNull(result, "result");
8492
assertNotNull(result.getStrategyId(), "strategyId");
8593
assertEquals("BTC/USDT", result.getInstrument(), "instrument");
8694
assertTrue(stages.contains(BacktestStage.COMPILING), "compiling stage fired");
8795
assertTrue(stages.contains(BacktestStage.PREPARING), "preparing stage fired");
8896
assertTrue(stages.contains(BacktestStage.EXECUTING), "executing stage fired");
89-
90-
if (VERBOSE) {
91-
log.info("Result: {}", result);
92-
}
9397
}
9498

9599
private static String dayStartIso(int offsetDays) {

0 commit comments

Comments
 (0)