74 lines
2.7 KiB
Java
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()));
|
|
}
|
|
}
|