public DonchianChannelStrategy(final int periodUpper, final int periodLower, final TimeSeries timeSeries) { super(timeSeries); this.periodUpper = periodUpper; this.periodLower = periodLower; this.donchianChannelLower = new DonchianChannelLower(lowPriceIndicator, periodLower); this.donchianChannelUpper = new DonchianChannelUpper(highPriceIndicator, periodUpper); }
/** * Get the upper channel value * @param currencyPair * @return */ private Decimal getUpperChannelValue(final BitfinexCurrencyPair currencyPair) { final TimeSeries currencyTimeSeries = timeSeries.get(currencyPair); final MaxPriceIndicator maxPrice = new MaxPriceIndicator(currencyTimeSeries); final DonchianChannelUpper donchianChannelUpper = new DonchianChannelUpper(maxPrice, periodIn); return donchianChannelUpper.getValue(currencyTimeSeries.getEndIndex()); }
/** * Get the lower channel value * @param currencyPair * @return */ private Decimal getLowerChannelValue(final BitfinexCurrencyPair currencyPair) { final TimeSeries currencyTimeSeries = timeSeries.get(currencyPair); final MinPriceIndicator minPrice = new MinPriceIndicator(currencyTimeSeries); final DonchianChannelLower donchianChannelLower = new DonchianChannelLower(minPrice, periodOut); return donchianChannelLower.getValue(currencyTimeSeries.getEndIndex()); }
@Override public double getContracts(final double portfolioValue, final int barIndex) { final double channelUpper = donchianChannelUpper.getValue(barIndex).doubleValue(); final double channelLower = donchianChannelLower.getValue(barIndex).doubleValue(); final double maxLossPerContract = channelUpper - channelLower; final double closePrice = timeSeries.getBar(barIndex).getClosePrice().doubleValue(); // Max position size per stop loss final double positionSizePerLoss = (portfolioValue * 0.02) / maxLossPerContract; return Math.min(positionSizePerLoss, portfolioValue * 0.5 / closePrice); }