Files
goldenChart/ta4j-master/ta4j-examples/src/main/java/ta4jexamples/wyckoff/WyckoffCycleIndicatorSuiteDemo.java
T
2026-05-23 15:11:48 +09:00

74 lines
2.7 KiB
Java

/*
* SPDX-License-Identifier: MIT
*/
package ta4jexamples.wyckoff;
import java.util.Locale;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.ta4j.core.BarSeries;
import org.ta4j.core.indicators.wyckoff.WyckoffCycleAnalysisRunner;
import org.ta4j.core.indicators.wyckoff.WyckoffCycleFacade;
import org.ta4j.core.indicators.wyckoff.WyckoffCycleType;
import org.ta4j.core.indicators.wyckoff.WyckoffPhase;
import ta4jexamples.datasources.CsvFileBarSeriesDataSource;
/**
* Demonstrates Wyckoff cycle indicator-suite and one-shot analysis entry
* points.
*/
public final class WyckoffCycleIndicatorSuiteDemo {
private static final Logger LOG = LogManager.getLogger(WyckoffCycleIndicatorSuiteDemo.class);
/**
* Creates a new WyckoffCycleIndicatorSuiteDemo instance.
*/
private WyckoffCycleIndicatorSuiteDemo() {
}
/**
* Executes the demo entry point.
*/
public static void main(String[] args) {
BarSeries series = CsvFileBarSeriesDataSource.loadSeriesFromFile();
var numFactory = series.numFactory();
WyckoffCycleFacade facade = WyckoffCycleFacade.builder(series)
.withSwingConfiguration(3, 3, 1)
.withVolumeWindows(5, 20)
.withTolerances(numFactory.numOf(0.02), numFactory.numOf(0.05))
.withVolumeThresholds(numFactory.numOf(1.5), numFactory.numOf(0.7))
.build();
int begin = series.getBeginIndex() + facade.unstableBars();
for (int i = begin; i <= series.getEndIndex(); i++) {
WyckoffPhase phase = facade.phase(i);
if (phase.cycleType() == WyckoffCycleType.UNKNOWN) {
continue;
}
if (facade.lastPhaseTransitionIndex(i) != i) {
continue;
}
var bar = series.getBar(i);
var low = facade.tradingRangeLow(i);
var high = facade.tradingRangeHigh(i);
LOG.info("{} -> {} {} (confidence={}, range=[{}, {}])", bar.getEndTime(), phase.cycleType(),
phase.phaseType(), String.format(Locale.US, "%.2f", phase.confidence()), low, high);
}
var analysis = WyckoffCycleAnalysisRunner.builder()
.withSwingConfiguration(3, 3, 1)
.withVolumeWindows(5, 20)
.withTolerances(0.02, 0.05)
.withVolumeThresholds(1.5, 0.7)
.build();
var result = analysis.analyze(series);
result.baseAnalysis()
.ifPresent(base -> LOG.info("One-shot analysis transitions: {}",
base.cycleSnapshot().transitions().size()));
}
}