* @return The theta
*/
public CurrencyAmount forwardTheta(final ForexOptionSingleBarrier optionForex, final YieldCurveBundle curves) {
ArgumentChecker.notNull(curves, "Curves");
ArgumentChecker.isTrue(curves instanceof SmileDeltaTermStructureDataBundle, "Yield curve bundle should contain smile data");
final SmileDeltaTermStructureDataBundle smile = (SmileDeltaTermStructureDataBundle) curves;
final ForexOptionVanilla underlyingOption = optionForex.getUnderlyingOption();
final String domesticCurveName = underlyingOption.getUnderlyingForex().getPaymentCurrency2().getFundingCurveName();
final String foreignCurveName = underlyingOption.getUnderlyingForex().getPaymentCurrency1().getFundingCurveName();
final double payTime = underlyingOption.getUnderlyingForex().getPaymentTime();
final double dfForeign = smile.getCurve(foreignCurveName).getDiscountFactor(payTime);
final double dfDomestic = smile.getCurve(domesticCurveName).getDiscountFactor(payTime);
final double spot = smile.getFxRates().getFxRate(optionForex.getCurrency1(), optionForex.getCurrency2());
final double forward = spot * dfForeign / dfDomestic;
final double rateDomestic = smile.getCurve(domesticCurveName).getInterestRate(payTime);
final double rateForeign = smile.getCurve(foreignCurveName).getInterestRate(payTime);
final double foreignAmount = underlyingOption.getUnderlyingForex().getPaymentCurrency1().getAmount();
final double rebateByForeignUnit = optionForex.getRebate() / Math.abs(foreignAmount);
final double vol = FXVolatilityUtils.getVolatility(smile, optionForex.getCurrency1(), optionForex.getCurrency2(),
underlyingOption.getTimeToExpiry(), underlyingOption.getStrike(), forward);
final ForexOptionVanilla upOption = new ForexOptionVanilla(underlyingOption.getUnderlyingForex(), underlyingOption.getTimeToExpiry() + DEFAULT_THETA_SHIFT,