5555import quickfix .field .TimeInForce ;
5656import quickfix .fix42 .ExecutionReport ;
5757import quickfix .fix42 .MarketDataRequest ;
58+ import quickfix .fix42 .MarketDataSnapshotFullRefresh ;
5859import quickfix .fix42 .NewOrderSingle ;
5960import quickfix .fix42 .OrderCancelRequest ;
6061
6162import java .util .ArrayList ;
63+ import quickfix .field .CxlRejResponseTo ;
64+ import quickfix .field .MDEntryPx ;
65+ import quickfix .field .MDEntryType ;
66+ import quickfix .field .MDReqID ;
67+ import quickfix .field .OrdRejReason ;
68+ import quickfix .fix42 .OrderCancelReject ;
6269
6370public class Application extends MessageCracker implements quickfix .Application {
6471 private final OrderMatcher orderMatcher = new OrderMatcher ();
@@ -103,7 +110,7 @@ public void onMessage(NewOrderSingle message, SessionID sessionID) throws FieldN
103110
104111 processOrder (order );
105112 } catch (Exception e ) {
106- rejectOrder (senderCompId , targetCompId , clOrdId , symbol , side , e .getMessage ());
113+ rejectOrder (targetCompId , senderCompId , clOrdId , symbol , side , e .getMessage ());
107114 }
108115 }
109116
@@ -117,6 +124,7 @@ private void rejectOrder(String senderCompId, String targetCompId, String clOrdI
117124
118125 fixOrder .setString (ClOrdID .FIELD , clOrdId );
119126 fixOrder .setString (Text .FIELD , message );
127+ fixOrder .setInt (OrdRejReason .FIELD , OrdRejReason .BROKER_EXCHANGE_OPTION );
120128
121129 try {
122130 Session .sendToTarget (fixOrder , senderCompId , targetCompId );
@@ -187,9 +195,23 @@ public void onMessage(OrderCancelRequest message, SessionID sessionID) throws Fi
187195 char side = message .getChar (Side .FIELD );
188196 String id = message .getString (OrigClOrdID .FIELD );
189197 Order order = orderMatcher .find (symbol , side , id );
190- order .cancel ();
191- cancelOrder (order );
192- orderMatcher .erase (order );
198+ if (order != null ) {
199+ order .cancel ();
200+ cancelOrder (order );
201+ orderMatcher .erase (order );
202+ } else {
203+ OrderCancelReject fixOrderReject = new OrderCancelReject (new OrderID ("NONE" ), new ClOrdID (message .getString (ClOrdID .FIELD )),
204+ new OrigClOrdID (message .getString (OrigClOrdID .FIELD )), new OrdStatus (OrdStatus .REJECTED ), new CxlRejResponseTo (CxlRejResponseTo .ORDER_CANCEL_REQUEST ));
205+
206+ String senderCompId = message .getHeader ().getString (SenderCompID .FIELD );
207+ String targetCompId = message .getHeader ().getString (TargetCompID .FIELD );
208+ fixOrderReject .getHeader ().setString (SenderCompID .FIELD , targetCompId );
209+ fixOrderReject .getHeader ().setString (TargetCompID .FIELD , senderCompId );
210+ try {
211+ Session .sendToTarget (fixOrderReject , targetCompId , senderCompId );
212+ } catch (SessionNotFound e ) {
213+ }
214+ }
193215 }
194216
195217 public void onMessage (MarketDataRequest message , SessionID sessionID ) throws FieldNotFound ,
@@ -204,10 +226,26 @@ public void onMessage(MarketDataRequest message, SessionID sessionID) throws Fie
204226 //int marketDepth = message.getInt(MarketDepth.FIELD);
205227 int relatedSymbolCount = message .getInt (NoRelatedSym .FIELD );
206228
229+ MarketDataSnapshotFullRefresh fixMD = new MarketDataSnapshotFullRefresh ();
230+ fixMD .setString (MDReqID .FIELD , message .getString (MDReqID .FIELD ));
231+
207232 for (int i = 1 ; i <= relatedSymbolCount ; ++i ) {
208233 message .getGroup (i , noRelatedSyms );
209234 String symbol = noRelatedSyms .getString (Symbol .FIELD );
210- System .err .println ("*** market data: " + symbol );
235+ fixMD .setString (Symbol .FIELD , symbol );
236+ }
237+
238+ MarketDataSnapshotFullRefresh .NoMDEntries noMDEntries = new MarketDataSnapshotFullRefresh .NoMDEntries ();
239+ noMDEntries .setChar (MDEntryType .FIELD , '0' );
240+ noMDEntries .setDouble (MDEntryPx .FIELD , 123.45 );
241+ fixMD .addGroup (noMDEntries );
242+ String senderCompId = message .getHeader ().getString (SenderCompID .FIELD );
243+ String targetCompId = message .getHeader ().getString (TargetCompID .FIELD );
244+ fixMD .getHeader ().setString (SenderCompID .FIELD , targetCompId );
245+ fixMD .getHeader ().setString (TargetCompID .FIELD , senderCompId );
246+ try {
247+ Session .sendToTarget (fixMD , targetCompId , senderCompId );
248+ } catch (SessionNotFound e ) {
211249 }
212250 }
213251
0 commit comments