final ZonedDateTime optionPay = ScheduleCalculator.getAdjustedDate(optionExpiry, SETTLEMENT_DAYS, CALENDAR);
final ForexOptionVanilla[] forexOption = new ForexOptionVanilla[nbStrike + 1];
for (int loopstrike = 0; loopstrike <= nbStrike; loopstrike++) {
strikes[loopstrike] = strikeMin + loopstrike * strikeRange / nbStrike;
final ForexDefinition forexUnderlyingDefinition = new ForexDefinition(EUR, USD, optionPay, notional, strikes[loopstrike]);
final ForexOptionVanillaDefinition forexOptionDefinition = new ForexOptionVanillaDefinition(forexUnderlyingDefinition, optionExpiry, isCall, isLong);
forexOption[loopstrike] = forexOptionDefinition.toDerivative(REFERENCE_DATE, CURVES_NAME);
}
final double forward = METHOD_BLACK.forwardForexRate(forexOption[0], SMILE_BUNDLE);
final double dfDomestic = CURVES.getCurve(CURVES_NAME[1]).getDiscountFactor(forexOption[0].getUnderlyingForex().getPaymentTime()); // USD
final SmileDeltaParameters smileAtTime = SMILE_BUNDLE.getSmile(EUR, USD, forexOption[0].getTimeToExpiry());
final double[] strikesVV = smileAtTime.getStrike(forward);
final double[] volVV = smileAtTime.getVolatility();
final ForexOptionVanilla[] optReference = new ForexOptionVanilla[3];
for (int loopvv = 0; loopvv < 3; loopvv++) {
final ForexDefinition forexUnderlyingDefinition = new ForexDefinition(EUR, USD, optionPay, notional, strikesVV[loopvv]);
final ForexOptionVanillaDefinition forexOptionDefinition = new ForexOptionVanillaDefinition(forexUnderlyingDefinition, optionExpiry, isCall, isLong);
optReference[loopvv] = forexOptionDefinition.toDerivative(REFERENCE_DATE, CURVES_NAME);
}
final MultipleCurrencyAmount[] ceVV = new MultipleCurrencyAmount[nbStrike + 1];
final MultipleCurrencyAmount[] ceFlat = new MultipleCurrencyAmount[nbStrike + 1];
final MultipleCurrencyAmount[] ceExpected = new MultipleCurrencyAmount[nbStrike + 1];
final MultipleCurrencyAmount[] ceVVATM = new MultipleCurrencyAmount[3];