/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.bondfutureoption;
import org.threeten.bp.LocalDate;
import com.opengamma.analytics.financial.provider.description.interestrate.BlackBondFuturesProviderInterface;
import com.opengamma.financial.analytics.conversion.BondFutureOptionTradeConverter;
import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesBundle;
import com.opengamma.sesame.Environment;
import com.opengamma.sesame.FixingsFn;
import com.opengamma.sesame.trade.BondFutureOptionTrade;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.result.Result;
/**
* Black calculator for bond future options.
*/
public class BondFutureOptionBlackCalculatorFactory implements BondFutureOptionCalculatorFactory {
private static final Result<HistoricalTimeSeriesBundle> EMPTY_BUNDLE = Result.success(new HistoricalTimeSeriesBundle());
private final BondFutureOptionTradeConverter _converter;
private final BlackBondFuturesProviderFn _blackBondFuturesProviderFn;
private final FixingsFn _fixingsFn;
public BondFutureOptionBlackCalculatorFactory(BondFutureOptionTradeConverter converter,
BlackBondFuturesProviderFn blackBondFuturesProviderFn,
FixingsFn fixingsFn) {
_converter = ArgumentChecker.notNull(converter, "converter");
_blackBondFuturesProviderFn = ArgumentChecker.notNull(blackBondFuturesProviderFn, "blackBondFuturesProviderFn");
_fixingsFn = ArgumentChecker.notNull(fixingsFn, "htsFn");
}
@Override
public Result<BondFutureOptionCalculator> createCalculator(Environment env, BondFutureOptionTrade trade) {
Result<BlackBondFuturesProviderInterface> blackResult = _blackBondFuturesProviderFn.getBlackBondFuturesProvider(env, trade);
Result<HistoricalTimeSeriesBundle> fixingsResult = getTimeSeries(env, trade);
if (Result.allSuccessful(blackResult, fixingsResult)) {
BlackBondFuturesProviderInterface black = blackResult.getValue();
HistoricalTimeSeriesBundle fixings = fixingsResult.getValue();
BondFutureOptionCalculator calculator = new BondFutureOptionBlackCalculator(trade, _converter, black, env.getValuationTime(), fixings);
return Result.success(calculator);
} else {
return Result.failure(blackResult, fixingsResult);
}
}
/**
* Is a time series of margin prices required.
* Not required if valued on trade date or if the security is not margined
*
* @param valuationDate the valuation date
* @param trade the trade date
* @return true if required, else false
*/
private static boolean requiresTimeSeries(LocalDate valuationDate, BondFutureOptionTrade trade) {
boolean requiresTimeSeries = !valuationDate.equals(trade.getTrade().getTradeDate()) && trade.getSecurity().isMargined();
return requiresTimeSeries;
}
private Result<HistoricalTimeSeriesBundle> getTimeSeries(Environment env, BondFutureOptionTrade trade) {
if (requiresTimeSeries(env.getValuationDate(), trade)) {
return _fixingsFn.getFixingsForSecurity(env, trade.getSecurity());
} else {
return EMPTY_BUNDLE;
}
}
}