package org.marketcetera.core.instruments; import org.marketcetera.quickfix.FIXVersion; import org.marketcetera.trade.Future; import org.marketcetera.trade.Instrument; import org.marketcetera.util.misc.ClassVersion; import quickfix.DataDictionary; import quickfix.Message; import quickfix.field.CFICode; import quickfix.field.MaturityDay; import quickfix.field.MaturityMonthYear; import quickfix.field.Symbol; /* $License$ */ /** * Adds the appropriate fields for a future instrument to a FIX Message. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: FutureToMessage.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.1.0 */ @ClassVersion("$Id: FutureToMessage.java 16154 2012-07-14 16:34:05Z colin $") public class FutureToMessage extends InstrumentToMessage<Future> { /** * Create a new FutureToMessage instance. */ public FutureToMessage() { super(Future.class); } /* (non-Javadoc) * @see org.marketcetera.core.instruments.InstrumentToMessage#isSupported(quickfix.DataDictionary, java.lang.String) */ @Override public boolean isSupported(DataDictionary inDictionary, String inMsgType) { // dictionary supports means to specify the 2 attributes of a future return (inDictionary.isMsgField(inMsgType,Symbol.FIELD)) && inDictionary.isMsgField(inMsgType, MaturityMonthYear.FIELD); } /* (non-Javadoc) * @see org.marketcetera.core.instruments.InstrumentToMessage#set(org.marketcetera.trade.Instrument, java.lang.String, quickfix.Message) */ @Override public void set(Instrument inInstrument, String inBeginString, Message inMessage) { if(FIXVersion.FIX40.equals(FIXVersion.getFIXVersion(inBeginString))) { throw new IllegalArgumentException( Messages.FUTURES_NOT_SUPPORTED_FOR_FIX_VERSION.getText(inBeginString)); } inMessage.setField(new Symbol(inInstrument.getSymbol())); Future future = (Future)inInstrument; int maturityDay = future.getExpirationDay(); switch(FIXVersion.getFIXVersion(inBeginString)){ case FIX_SYSTEM: //fall through case FIX41: //fall through case FIX42: setSecurityType(inInstrument, inBeginString, inMessage); inMessage.setField(future.getExpiryAsMaturityMonthYear()); if(maturityDay != -1) { inMessage.setField(new MaturityDay(String.valueOf(maturityDay))); } break; case FIX43: setCFICode(inMessage, future); if(maturityDay != -1) { inMessage.setField(new MaturityDay(String.valueOf(maturityDay))); } break; case FIX44: setCFICode(inMessage, future); if(maturityDay != -1) { inMessage.setField(new MaturityDay(String.valueOf(maturityDay))); } break; default: setCFICode(inMessage, future); break; } } /* (non-Javadoc) * @see org.marketcetera.core.instruments.InstrumentToMessage#set(org.marketcetera.trade.Instrument, quickfix.DataDictionary, java.lang.String, quickfix.Message) */ @Override public void set(Instrument inInstrument, DataDictionary inDictionary, String inMsgType, Message inMessage) { setSecurityType(inInstrument, inDictionary, inMsgType, inMessage); setSymbol(inInstrument, inDictionary, inMsgType, inMessage); Future future = (Future)inInstrument; //set as many fields as are available in the dictionary. if(inDictionary.isMsgField(inMsgType, CFICode.FIELD)) { setCFICode(inMessage, future); } if(inDictionary.isMsgField(inMsgType, MaturityMonthYear.FIELD)) { inMessage.setField(future.getExpiryAsMaturityMonthYear()); } } /** * Sets the CFI Code on the given <code>Message</code> for the given <code>Future</code>. * * @param inMessage a <code>Message</code> value * @param inFuture a <code>Future</code> value */ private static void setCFICode(Message inMessage, Future inFuture) { String cfiCode = CFICodeUtils.getCFICode(inFuture); if(cfiCode != null) { inMessage.setField(new CFICode(cfiCode)); } inMessage.setField(inFuture.getExpiryAsMaturityMonthYear()); } }