private void FIXRequestSessionStatus(MessageFIX4_2 packet) { if (packet.TradingSessionId != "TSSTATE") { throw new ApplicationException("Expected TSSTATE for trading session id but was: " + packet.TradingSessionId); } if (!packet.TradingSessionRequestId.Contains(sender) || !packet.TradingSessionRequestId.Contains(packet.Sequence.ToString())) { throw new ApplicationException("Expected unique trading session request id but was:" + packet.TradingSessionRequestId); } requestSessionStatus = true; if (onlineNextTime) { ProviderSimulator.SetOrderServerOnline(); onlineNextTime = false; } if (ProviderSimulator.IsOrderServerOnline) { SendSessionStatusOnline(); } else { SendSessionStatus("3"); } onlineNextTime = true; }
public bool SendSessionStatus(string status) { switch (status) { case "2": ProviderSimulator.SetOrderServerOnline(); break; case "3": ProviderSimulator.SetOrderServerOffline(); break; default: throw new ApplicationException("Unknown session status:" + status); } var mbtMsg = FixFactory.Create(); mbtMsg.AddHeader("h"); mbtMsg.SetTradingSessionId("TSSTATE"); mbtMsg.SetTradingSessionStatus(status); if (debug) { log.Debug("Sending order server status: " + mbtMsg); } SendMessage(mbtMsg); return(true); }
private void ProcessChangeOrder(CreateOrChangeOrder order) { SendExecutionReport(order, "E", 0.0, 0, 0, 0, (int)order.Size, TimeStamp.UtcNow); SendPositionUpdate(order.Symbol, ProviderSimulator.GetPosition(order.Symbol)); SendExecutionReport(order, "5", 0.0, 0, 0, 0, (int)order.Size, TimeStamp.UtcNow); SendPositionUpdate(order.Symbol, ProviderSimulator.GetPosition(order.Symbol)); }
private void FIXCreateOrder(MessageFIX4_2 packet) { if (debug) { log.Debug("FIXCreateOrder() for " + packet.Symbol + ". Client id: " + packet.ClientOrderId); } var symbol = Factory.Symbol.LookupSymbol(packet.Symbol); var order = ConstructOrder(packet, packet.ClientOrderId); if (!ProviderSimulator.IsOrderServerOnline) { if (debug) { log.Debug(symbol + ": Rejected " + packet.ClientOrderId + ". Order server offline."); } OnRejectOrder(order, symbol + ": Order Server Offline."); return; } var simulator = simulators[SimulatorType.RejectSymbol]; if (FixFactory != null && simulator.CheckFrequencyAndSymbol(symbol)) { if (debug) { log.Debug("Simulating create order reject of 35=" + packet.MessageType); } OnRejectOrder(order, "Testing reject of create order"); return; } simulator = simulators[SimulatorType.ServerOfflineReject]; if (FixFactory != null && simulator.CheckFrequency()) { if (debug) { log.Debug("Simulating order server offline business reject of 35=" + packet.MessageType); } OnBusinessRejectOrder(packet.ClientOrderId, "Server offline for create order."); ProviderSimulator.SwitchBrokerState("offline", false); ProviderSimulator.SetOrderServerOffline(); return; } if (packet.Symbol == "TestPending") { log.Info("Ignoring FIX order since symbol is " + packet.Symbol); } else { if (string.IsNullOrEmpty(packet.ClientOrderId)) { System.Diagnostics.Debugger.Break(); } ProviderSimulator.CreateOrder(order); ProcessCreateOrder(order); ProviderSimulator.TryProcessAdustments(order); } return; }
private void ProcessCancelOrder(CreateOrChangeOrder cancelOrder) { var origOrder = cancelOrder.OriginalOrder; var randomOrder = random.Next(0, 10) < 5 ? cancelOrder : origOrder; SendExecutionReport(randomOrder, "6", 0.0, 0, 0, 0, (int)origOrder.Size, TimeStamp.UtcNow); SendPositionUpdate(cancelOrder.Symbol, ProviderSimulator.GetPosition(cancelOrder.Symbol)); SendExecutionReport(randomOrder, "4", 0.0, 0, 0, 0, (int)origOrder.Size, TimeStamp.UtcNow); SendPositionUpdate(cancelOrder.Symbol, ProviderSimulator.GetPosition(cancelOrder.Symbol)); }
public virtual void SendSessionStatusOnline() { if (debug) { log.Debug("Sending session status online."); } var wasOrderServerOnline = ProviderSimulator.IsOrderServerOnline; SendSessionStatus("2"); if (!wasOrderServerOnline) { ProviderSimulator.SwitchBrokerState("online", true); } ProviderSimulator.FlushFillQueues(); }
private void ProcessCreateOrder(CreateOrChangeOrder order) { SendExecutionReport(order, "A", 0.0, 0, 0, 0, (int)order.Size, TimeStamp.UtcNow); SendPositionUpdate(order.Symbol, ProviderSimulator.GetPosition(order.Symbol)); if (order.Symbol.FixSimulationType == FIXSimulationType.BrokerHeldStopOrder && (order.Type == OrderType.BuyStop || order.Type == OrderType.StopLoss)) { SendExecutionReport(order, "A", "D", 0.0, 0, 0, 0, (int)order.Size, TimeStamp.UtcNow); SendPositionUpdate(order.Symbol, ProviderSimulator.GetPosition(order.Symbol)); } else { SendExecutionReport(order, "0", 0.0, 0, 0, 0, (int)order.Size, TimeStamp.UtcNow); SendPositionUpdate(order.Symbol, ProviderSimulator.GetPosition(order.Symbol)); } }
private unsafe void SymbolRequest(LimeQuoteMessage message) { LimeQuotesInterop.subscription_request_msg *subRequest = (LimeQuotesInterop.subscription_request_msg *)message.Ptr; String symbol = ""; for (int i = 0; subRequest->syb_symbols[i] != 0; i++) { symbol += (char)subRequest->syb_symbols[i]; } var symbolInfo = Factory.Symbol.LookupSymbol(symbol); log.Info("Lime: Received symbol request for " + symbolInfo); ProviderSimulator.AddSymbol(symbolInfo.Symbol); var writePacket = (LimeQuoteMessage)QuoteSocket.MessageFactory.Create(); LimeQuotesInterop.subscription_reply_msg *reply = (LimeQuotesInterop.subscription_reply_msg *)writePacket.Ptr; reply->msg_type = LimeQuotesInterop.limeq_message_type.SUBSCRIPTION_REPLY; var msg_len = (ushort)sizeof(LimeQuotesInterop.subscription_reply_msg); reply->msg_len = Reverse(msg_len); writePacket.Length = msg_len; reply->outcome = LimeQuotesInterop.subscription_outcome.SUBSCRIPTION_SUCCESSFUL; for (int i = 0; i < 4; i++) { reply->qsid[i] = subRequest->qsid[i]; } QuotePacketQueue.Enqueue(writePacket, message.SendUtcTime); var bookRebuildMessage = (LimeQuoteMessage)QuoteSocket.MessageFactory.Create(); LimeQuotesInterop.book_rebuild_msg *book = (LimeQuotesInterop.book_rebuild_msg *)bookRebuildMessage.Ptr; book->msg_type = LimeQuotesInterop.limeq_message_type.BOOK_REBUILD; msg_len = (ushort)sizeof(LimeQuotesInterop.book_rebuild_msg); book->msg_len = Reverse(msg_len); bookRebuildMessage.Length = msg_len; book->symbol_index = (uint)symbolInfo.BinaryIdentifier; for (int i = 0; i < symbol.Length; i++) { book->symbol[i] = (byte)symbol[i]; } QuotePacketQueue.Enqueue(bookRebuildMessage, message.SendUtcTime); }
private void SymbolRequest(MessageMbtQuotes message) { var symbolInfo = Factory.Symbol.LookupSymbol(message.Symbol); log.Info("Received symbol request for " + symbolInfo); ProviderSimulator.AddSymbol(symbolInfo.Symbol); switch (message.FeedType) { case "20000": // Level 1 if (symbolInfo.QuoteType != QuoteType.Level1) { throw new ApplicationException("Requested data feed of Level1 but Symbol.QuoteType is " + symbolInfo.QuoteType); } break; case "20001": // Level 2 if (symbolInfo.QuoteType != QuoteType.Level2) { throw new ApplicationException("Requested data feed of Level2 but Symbol.QuoteType is " + symbolInfo.QuoteType); } break; case "20002": // Level 1 & Level 2 if (symbolInfo.QuoteType != QuoteType.Level2) { throw new ApplicationException("Requested data feed of Level1 and Level2 but Symbol.QuoteType is " + symbolInfo.QuoteType); } break; case "20003": // Trades if (symbolInfo.TimeAndSales != TimeAndSales.ActualTrades) { throw new ApplicationException("Requested data feed of Trades but Symbol.TimeAndSale is " + symbolInfo.TimeAndSales); } break; case "20004": // Option Chains break; default: throw new ApplicationException("Sorry, unknown data type: " + message.FeedType); } }
public override void OnPhysicalFill(PhysicalFill fill, CreateOrChangeOrder order) { if (order.Symbol.FixSimulationType == FIXSimulationType.BrokerHeldStopOrder && (order.Type == OrderType.BuyStop || order.Type == OrderType.SellStop)) { order.Type = order.Type == OrderType.BuyStop ? OrderType.BuyMarket : OrderType.SellMarket; var marketOrder = Factory.Utility.PhysicalOrder(order.Action, order.OrderState, order.Symbol, order.Side, order.Type, OrderFlags.None, 0, order.Size, order.LogicalOrderId, order.LogicalSerialNumber, order.BrokerOrder, null, TimeStamp.UtcNow); SendExecutionReport(marketOrder, "0", 0.0, 0, 0, 0, (int)marketOrder.Size, TimeStamp.UtcNow); } if (debug) { log.Debug("Converting physical fill to FIX: " + fill); } SendPositionUpdate(order.Symbol, ProviderSimulator.GetPosition(order.Symbol)); var orderStatus = fill.CumulativeSize == fill.TotalSize ? "2" : "1"; SendExecutionReport(order, orderStatus, "F", fill.Price, fill.TotalSize, fill.CumulativeSize, fill.Size, fill.RemainingSize, fill.UtcTime); }
private void FIXCancelOrder(MessageFIX4_2 packet) { var symbol = Factory.Symbol.LookupSymbol(packet.Symbol); if (!ProviderSimulator.IsOrderServerOnline) { throw new LimeException("Order server offline testing for Lime not yet implemeneted"); if (debug) { log.Debug(symbol + ": Cannot cancel order by client id: " + packet.OriginalClientOrderId + ". Order Server Offline."); } OnRejectCancel(packet.Symbol, packet.ClientOrderId, packet.OriginalClientOrderId, symbol + ": Order Server Offline"); return; } var simulator = simulators[SimulatorType.RejectSymbol]; if (FixFactory != null && simulator.CheckFrequencyAndSymbol(symbol)) { if (debug) { log.Debug("Simulating cancel order reject of 35=" + packet.MessageType); } OnRejectCancel(packet.Symbol, packet.ClientOrderId, packet.OriginalClientOrderId, "Testing reject of cancel order."); return; } simulator = simulators[SimulatorType.ServerOfflineReject]; if (FixFactory != null && simulator.CheckFrequency()) { throw new LimeException("Order server offline testing for Lime not yet implemeneted"); if (debug) { log.Debug("Simulating order server offline business reject of 35=" + packet.MessageType); } OnBusinessRejectOrder(packet.ClientOrderId, "Server offline for cancel order."); ProviderSimulator.SwitchBrokerState("offline", false); ProviderSimulator.SetOrderServerOffline(); return; } if (debug) { log.Debug("FIXCancelOrder() for " + packet.Symbol + ". Original client id: " + packet.OriginalClientOrderId); } CreateOrChangeOrder origOrder = null; try { long origClientId; if (!long.TryParse(packet.OriginalClientOrderId, out origClientId)) { log.Error("original client order id " + packet.OriginalClientOrderId + " cannot be converted to long: " + packet); origClientId = 0; } origOrder = ProviderSimulator.GetOrderById(symbol, origClientId); } catch (ApplicationException) { if (debug) { log.Debug(symbol + ": Cannot cancel order by client id: " + packet.OriginalClientOrderId + ". Probably already filled or canceled."); } OnRejectCancel(packet.Symbol, packet.ClientOrderId, packet.OriginalClientOrderId, "No such order"); return; } var cancelOrder = ConstructCancelOrder(packet, packet.ClientOrderId); cancelOrder.OriginalOrder = origOrder; ProviderSimulator.CancelOrder(cancelOrder); ProcessCancelOrder(cancelOrder); ProviderSimulator.TryProcessAdustments(cancelOrder); return; }
private void FIXChangeOrder(MessageFIX4_2 packet) { var symbol = Factory.Symbol.LookupSymbol(packet.Symbol); var order = ConstructOrder(packet, packet.ClientOrderId); if (!ProviderSimulator.IsOrderServerOnline) { throw new LimeException("Order server offline testing for Lime not yet implemeneted"); log.Info(symbol + ": Rejected " + packet.ClientOrderId + ". Order server offline."); OnRejectOrder(order, symbol + ": Order Server Offline."); return; } var simulator = simulators[SimulatorType.RejectSymbol]; if (FixFactory != null && simulator.CheckFrequencyAndSymbol(symbol)) { if (debug) { log.Debug("Simulating create order reject of 35=" + packet.MessageType); } OnRejectOrder(order, "Testing reject of change order."); return; } simulator = simulators[SimulatorType.ServerOfflineReject]; if (FixFactory != null && simulator.CheckFrequency()) { throw new LimeException("Order server offline testing for Lime not yet implemeneted"); if (debug) { log.Debug("Simulating order server offline business reject of 35=" + packet.MessageType); } OnBusinessRejectOrder(packet.ClientOrderId, "Server offline for change order."); ProviderSimulator.SwitchBrokerState("offline", false); ProviderSimulator.SetOrderServerOffline(); return; } CreateOrChangeOrder origOrder = null; if (debug) { log.Debug("FIXChangeOrder() for " + packet.Symbol + ". Client id: " + packet.ClientOrderId + ". Original client id: " + packet.OriginalClientOrderId); } try { long origClientId; if (!long.TryParse(packet.OriginalClientOrderId, out origClientId)) { log.Error("original client order id " + packet.OriginalClientOrderId + " cannot be converted to long: " + packet); origClientId = 0; } origOrder = ProviderSimulator.GetOrderById(symbol, origClientId); } catch (ApplicationException ex) { if (debug) { log.Debug(symbol + ": Rejected " + packet.ClientOrderId + ". Cannot change order: " + packet.OriginalClientOrderId + ". Already filled or canceled. Message: " + ex.Message); } OnRejectOrder(order, symbol + ": Cannot change order. Probably already filled or canceled."); return; } order.OriginalOrder = origOrder; #if VERIFYSIDE if (order.Side != origOrder.Side) { var message = symbol + ": Cannot change " + origOrder.Side + " to " + order.Side; log.Error(message); OnRejectOrder(order, false, message); return; } if (order.Type != origOrder.Type) { var message = symbol + ": Cannot change " + origOrder.Type + " to " + order.Type; log.Error(message); OnRejectOrder(order, false, message); return; } #endif ProviderSimulator.ChangeOrder(order); ProcessChangeOrder(order); }
public void SendMessage(FIXTMessage1_1 fixMessage) { FixFactory.AddHistory(fixMessage); if (isConnectionLost) { RemoveTickSync(fixMessage); return; } var simulator = simulators[SimulatorType.SendDisconnect]; if (simulator.CheckSequence(fixMessage.Sequence)) { if (debug) { log.Debug("Ignoring message: " + fixMessage); } ProviderSimulator.SwitchBrokerState("disconnect", false); isConnectionLost = true; return; } if (simulateSendFailed && IsRecovered && random.Next(50) == 4) { if (debug) { log.Debug("Skipping send of sequence # " + fixMessage.Sequence + " to simulate lost message. " + fixMessage); } if (fixMessage.Type == "1") { isHeartbeatPending = TimeStamp.MaxValue; } if (debug) { log.Debug("Message type is: " + fixMessage.Type); } return; } var writePacket = fixSocket.MessageFactory.Create(); var message = fixMessage.ToString(); writePacket.DataOut.Write(message.ToCharArray()); writePacket.SendUtcTime = TimeStamp.UtcNow.Internal; if (debug) { log.Debug("Simulating FIX Message: " + fixMessage); } try { fixPacketQueue.Enqueue(writePacket, writePacket.SendUtcTime); } catch (QueueException ex) { if (ex.EntryType == EventType.Terminate) { log.Warn("fix packet queue returned queue exception " + ex.EntryType + ". Dropping message due to dispose."); Dispose(); } else { throw; } } simulator = simulators[SimulatorType.SendServerOffline]; if (IsRecovered && FixFactory != null && simulator.CheckSequence(fixMessage.Sequence)) { if (debug) { log.Debug("Skipping message: " + fixMessage); } ProviderSimulator.SwitchBrokerState("offline", false); ProviderSimulator.SetOrderServerOffline(); if (requestSessionStatus) { SendSessionStatus("3"); } else { log.Info("RequestSessionStatus is false so not sending order server offline message."); } } }
private bool ProcessMessage(MessageFIXT1_1 packetFIX) { if (isConnectionLost) { if (debug) { log.Debug("Ignoring message: " + packetFIX); } RemoveTickSync(packetFIX); return(true); } var simulator = simulators[SimulatorType.ReceiveDisconnect]; if (FixFactory != null && simulator.CheckSequence(packetFIX.Sequence)) { if (debug) { log.Debug("Ignoring message: " + packetFIX); } // Ignore this message. Pretend we never received it AND disconnect. // This will test the message recovery.) ProviderSimulator.SwitchBrokerState("disconnect", false); isConnectionLost = true; return(true); } if (simulateReceiveFailed && FixFactory != null && random.Next(50) == 1) { // Ignore this message. Pretend we never received it. // This will test the message recovery. if (debug) { log.Debug("Ignoring fix message sequence " + packetFIX.Sequence); } return(Resend(packetFIX)); } simulator = simulators[SimulatorType.ReceiveServerOffline]; if (IsRecovered && FixFactory != null && simulator.CheckSequence(packetFIX.Sequence)) { if (debug) { log.Debug("Skipping message: " + packetFIX); } ProviderSimulator.SwitchBrokerState("disconnect", false); ProviderSimulator.SetOrderServerOffline(); if (requestSessionStatus) { SendSessionStatus("3"); //offline } else { log.Info("RequestSessionStatus is false so not sending order server offline message."); } return(true); } simulator = simulators[SimulatorType.SystemOffline]; if (IsRecovered && FixFactory != null && simulator.CheckSequence(packetFIX.Sequence)) { SendSystemOffline(); return(true); } if (debug) { log.Debug("Processing message with " + packetFIX.Sequence + ". So updating remote sequence..."); } RemoteSequence = packetFIX.Sequence + 1; switch (packetFIX.MessageType) { case "G": case "D": simulator = simulators[SimulatorType.BlackHole]; break; case "F": simulator = simulators[SimulatorType.CancelBlackHole]; break; } if (FixFactory != null && simulator.CheckFrequency()) { if (debug) { log.Debug("Simulating order 'black hole' of 35=" + packetFIX.MessageType + " by incrementing sequence to " + RemoteSequence + " but ignoring message with sequence " + packetFIX.Sequence); } return(true); } ParseFIXMessage(_fixReadMessage); return(true); }