package org.marketcetera.core.instruments; import org.marketcetera.quickfix.FIXVersion; import org.marketcetera.trade.Currency; import org.marketcetera.trade.Instrument; import org.marketcetera.util.misc.ClassVersion; import quickfix.DataDictionary; import quickfix.Message; import quickfix.field.*; /** * Adds the appropriate fields for a currency instrument to a FIX Message. * */ @ClassVersion("$Id: CurrencyToMessage.java 16901 2014-05-11 16:14:11Z colin $") public class CurrencyToMessage extends InstrumentToMessage<Currency>{ /** * Creates an instance. */ public CurrencyToMessage(){ super(org.marketcetera.trade.Currency.class); } /* (non-Javadoc) * @see org.marketcetera.core.instruments.InstrumentToMessage#isSupported(quickfix.DataDictionary, java.lang.String) */ @Override public boolean isSupported(DataDictionary inDictionary, String inMsgType) { if(MsgType.ORDER_CANCEL_REQUEST.equals(inMsgType)) { return inDictionary.isMsgField(inMsgType,Symbol.FIELD); } else { return (inDictionary.isMsgField(inMsgType,Symbol.FIELD) && inDictionary.isMsgField(inMsgType,FutSettDate.FIELD) && inDictionary.isMsgField(inMsgType,quickfix.field.Currency.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.FOREX_NOT_SUPPORTED_FOR_FIX_VERSION.getText(inBeginString)); } inMessage.setField(new Symbol(inInstrument.getSymbol())); Currency currency = (Currency)inInstrument; switch(FIXVersion.getFIXVersion(inBeginString)){ case FIX_SYSTEM: //fall through case FIX40: //fall through case FIX41: //fall through case FIX42: //fall through case FIX43: //fall through case FIX44: //fall through setSecurityType(inInstrument, inBeginString, inMessage); break; default: setSecurityType(inInstrument, inBeginString, inMessage); setCFICode(inMessage, currency); 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 instrument, DataDictionary dictionary,String msgType, Message message) { // always include the symbol message.setString(Symbol.FIELD, instrument.getSymbol()); message.setString(SecurityType.FIELD,SecurityType.FOREIGN_EXCHANGE_CONTRACT); if (dictionary.isMsgField(msgType, Product.FIELD)) { message.setInt(Product.FIELD, Product.CURRENCY); } Currency currencyInstrument = (Currency) instrument; if (dictionary.isMsgField(msgType, quickfix.field.Currency.FIELD) && currencyInstrument.getTradedCCY()!=null) { message.setString(quickfix.field.Currency.FIELD,currencyInstrument.getTradedCCY()); } if(MsgType.ORDER_CANCEL_REQUEST.equals(msgType)) { message.removeField(FutSettDate.FIELD); message.removeField(quickfix.field.OrdType.FIELD); } else { if(currencyInstrument.getNearTenor() !=null) { message.setString(FutSettDate.FIELD,currencyInstrument.getNearTenor()); } if (currencyInstrument.isSwap()) { message.setString(FutSettDate2.FIELD,currencyInstrument.getFarTenor()); message.setChar(quickfix.field.OrdType.FIELD,quickfix.field.OrdType.FOREX_SWAP); } else { // potentially a broker dependent element message.setChar(quickfix.field.OrdType.FIELD,quickfix.field.OrdType.PREVIOUSLY_QUOTED); } } } /** * Sets the CFI Code on the given <code>Message</code> for the given <code>Currency</code>. * * @param inMessage a <code>Message</code> value * @param inCurrency a <code>Currency</code> value */ private static void setCFICode(Message inMessage, Currency inCurrency) { String cfiCode = CFICodeUtils.getCFICode(inCurrency); if(cfiCode != null) { inMessage.setField(new CFICode(cfiCode)); } } }