public EventType periodType(Integer calculationStartIdx, Integer calculationEndIdx) throws NotEnoughDataException { // Avg previous variations double[] quotationCloseValues = sma.getSma(); double lastVariation = periodVariation( quotationCloseValues, calculationEndIdx - NOTICABLEPERIODBAND, calculationEndIdx); Boolean positiveVariation = lastVariation > 0; List<Double> variations = new ArrayList<Double>(); for (int i = calculationStartIdx + NOTICABLEPERIODBAND; i < calculationEndIdx; i++) { double periodVariation = periodVariation(quotationCloseValues, i - NOTICABLEPERIODBAND, i); if (periodVariation <= 0 && !positiveVariation) { variations.add(periodVariation); } if (periodVariation > 0 & positiveVariation) { variations.add(periodVariation); } } int nbSignedVariations = variations.size(); if (variations.size() < MINNBVAR) throw new NotEnoughDataException(null, "", null); double[] variationsArray = new double[nbSignedVariations]; for (int i = 0; i < nbSignedVariations; i++) { variationsArray[i] = variations.get(i); } double meanPreviousVariation = mean(0, nbSignedVariations, variationsArray); double stdDev = stdDev(variationsArray, 0, nbSignedVariations, meanPreviousVariation); // Last variation double lastDiffToMean = lastVariation - meanPreviousVariation; if (lastDiffToMean < -stdDev && !positiveVariation) { return EventType.BEARISH; } if (stdDev < lastDiffToMean && positiveVariation) { return EventType.BULLISH; } return EventType.NONE; }
@Override public Integer getOutputBeginIdx() { return Math.max(chaikinOscillator.getOutBegIdx().value, sma.getOutBegIdx().value) + getDaysSpan(); }
@Override public Integer getStartShift() { // return Math.max(20, getDaysSpan()); return Math.max(chaikinOscillator.getStartShift(), sma.getStartShift()) + getDaysSpan(); }