/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.livedata.normalization;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import com.opengamma.core.value.MarketDataRequirementNames;
import com.opengamma.livedata.server.FieldHistoryStore;
/**
* Calculates a best estimate of the implied volatility of an option.
*
* @author pietari
*/
public class ImpliedVolatilityCalculator implements NormalizationRule {
@Override
public MutableFudgeMsg apply(MutableFudgeMsg msg, String securityUniqueId, FieldHistoryStore fieldHistory) {
Double impliedVolatility = msg.getDouble(MarketDataRequirementNames.BEST_IMPLIED_VOLATILITY);
if (impliedVolatility != null) {
msg.add(MarketDataRequirementNames.IMPLIED_VOLATILITY, impliedVolatility);
return msg;
}
impliedVolatility = msg.getDouble(MarketDataRequirementNames.MID_IMPLIED_VOLATILITY);
if (impliedVolatility != null) {
msg.add(MarketDataRequirementNames.IMPLIED_VOLATILITY, impliedVolatility);
return msg;
}
impliedVolatility = msg.getDouble(MarketDataRequirementNames.LAST_IMPLIED_VOLATILITY);
if (impliedVolatility != null) {
msg.add(MarketDataRequirementNames.IMPLIED_VOLATILITY, impliedVolatility);
return msg;
}
Double impliedVolatilityBid = msg.getDouble(MarketDataRequirementNames.BID_IMPLIED_VOLATILITY);
Double impliedVolatilityAsk = msg.getDouble(MarketDataRequirementNames.ASK_IMPLIED_VOLATILITY);
if (impliedVolatilityBid != null && impliedVolatilityAsk != null) {
impliedVolatility = (impliedVolatilityBid + impliedVolatilityAsk) / 2;
msg.add(MarketDataRequirementNames.IMPLIED_VOLATILITY, impliedVolatility);
return msg;
}
FudgeMsg lkv = fieldHistory.getLastKnownValues();
impliedVolatility = lkv.getDouble(MarketDataRequirementNames.IMPLIED_VOLATILITY);
if (impliedVolatility != null) {
msg.add(MarketDataRequirementNames.IMPLIED_VOLATILITY, impliedVolatility);
return msg;
}
return msg;
}
}