Beispiel #1
0
        private void FIXRequestSessionStatus(MessageFIX4_4 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;
        }
 private void PositionUpdate(FIXContext context, MessageFIX4_4 packet)
 {
     if (packet.MessageType == "AO")
     {
         isPositionUpdateComplete = true;
         if (debug)
         {
             log.Debug("PositionUpdate Complete.");
         }
         TryEndRecovery();
     }
     else
     {
         double     position = packet.LongQuantity + packet.ShortQuantity;
         SymbolInfo symbolInfo;
         try {
             symbolInfo = Factory.Symbol.LookupSymbol(packet.Symbol);
         } catch (Exception ex) {
             log.Error("Error looking up " + packet.Symbol + ": " + ex.Message);
             return;
         }
         if (debug)
         {
             log.Debug("PositionUpdate: " + symbolInfo + "=" + position);
         }
         symbolPositionMap[symbolInfo.BinaryIdentifier] = position;
     }
 }
Beispiel #3
0
        private CreateOrChangeOrder ConstructCancelOrder(MessageFIX4_4 packet, string clientOrderId)
        {
            if (string.IsNullOrEmpty(clientOrderId))
            {
                var message = "Client order id was null or empty. FIX Message is: " + packet;
                log.Error(message);
                throw new ApplicationException(message);
            }
            var  symbol    = Factory.Symbol.LookupSymbol(packet.Symbol);
            var  side      = OrderSide.Buy;
            var  type      = OrderType.None;
            var  logicalId = 0;
            long clientId;

            if (!long.TryParse(clientOrderId, out clientId))
            {
                log.Error("original client order id " + clientOrderId +
                          " cannot be converted to long: " + packet);
                clientId = 0;
            }
            var utcCreateTime = new TimeStamp(packet.TimeStamp);
            var physicalOrder = Factory.Utility.PhysicalOrder(
                OrderAction.Cancel, OrderState.Active, symbol, side, type, OrderFlags.None,
                0D, 0, logicalId, 0, clientId, null, utcCreateTime);

            if (debug)
            {
                log.Debug("Received physical Order: " + physicalOrder);
            }
            return(physicalOrder);
        }
        private void CloseWithError(FIXContext context, MessageFIX4_4 packetIn, string textMessage)
        {
            Message   message    = context.LocalSocket.MessageFactory.Create();
            var       fixFactory = new FIXFactory4_4(1, fixSender, packetIn.Sender);
            var       fixMsg     = (FIXMessage4_4)fixFactory.Create();
            TimeStamp timeStamp  = TimeStamp.UtcNow;

            fixMsg.SetAccount(packetIn.Account);
            fixMsg.SetText(textMessage);
            fixMsg.AddHeader("j");
            string errorMessage = fixMsg.ToString();

            message.DataOut.Write(errorMessage.ToCharArray());
            long end = Factory.Parallel.TickCount + 2000;

            if (debug)
            {
                log.Debug("Writing Error Message: " + textMessage);
            }
            while (!context.LocalSocket.TrySendMessage(message))
            {
                if (Factory.Parallel.TickCount > end)
                {
                    throw new ApplicationException("Timeout while sending an order.");
                }
                Factory.Parallel.Yield();
            }
            throw new FilterException();
        }
Beispiel #5
0
        private void FIXCreateOrder(MessageFIX4_4 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 SymbolInfo GetSymbolInfo(FIXContext context, MessageFIX4_4 packet)
        {
            SymbolInfo symbolInfo = null;

            try {
                symbolInfo = Factory.Symbol.LookupSymbol(packet.Symbol);
            } catch (ApplicationException ex) {
                log.Error("Error looking up " + packet.Symbol + ": " + ex.Message);
            }
            return(symbolInfo);
        }
Beispiel #7
0
        private void FIXOrderList(MessageFIX4_4 packet)
        {
            var mbtMsg = (FIXMessage4_4)FixFactory.Create();

            mbtMsg.SetText("END");
            mbtMsg.AddHeader("8");
            if (debug)
            {
                log.Debug("Sending end of order list: " + mbtMsg);
            }
            SendMessage(mbtMsg);
        }
Beispiel #8
0
        private void FIXPositionList(MessageFIX4_4 packet)
        {
            var mbtMsg = (FIXMessage4_4)FixFactory.Create();

            mbtMsg.SetText("DONE");
            mbtMsg.AddHeader("AO");
            if (debug)
            {
                log.Debug("Sending end of position list: " + mbtMsg);
            }
            SendMessage(mbtMsg);
        }
 private void ExecutionReport(FIXContext context, MessageFIX4_4 packetFIX)
 {
     if (packetFIX.Text == "END")
     {
         isOrderUpdateComplete = true;
         if (debug)
         {
             log.Debug("ExecutionReport Complete.");
         }
         TryEndRecovery();
     }
 }
Beispiel #10
0
 private void PositionUpdate(MessageFIX4_4 packetFIX)
 {
     if (packetFIX.MessageType == "AO")
     {
         if (debug)
         {
             log.Debug("PositionUpdate Complete.");
         }
         TryEndRecovery();
     }
     else
     {
         var        position = packetFIX.LongQuantity + packetFIX.ShortQuantity;
         SymbolInfo symbolInfo;
         try
         {
             symbolInfo = Factory.Symbol.LookupSymbol(packetFIX.Symbol);
         }
         catch (ApplicationException ex)
         {
             log.Error("Error looking up " + packetFIX.Symbol + ": " + ex.Message);
             return;
         }
         SymbolInfo symbol;
         try
         {
             symbol = Factory.Symbol.LookupSymbol(packetFIX.Symbol);
         }
         catch
         {
             log.Info("PositionUpdate. But " + packetFIX.Symbol + " was not found in symbol dictionary.");
             return;
         }
         SymbolAlgorithm algorithm;
         if (TryGetAlgorithm(symbol.BinaryIdentifier, out algorithm))
         {
             if (debug)
             {
                 log.Debug("PositionUpdate for " + symbolInfo + ": MBT actual =" + position + ", TZ actual=" + algorithm.OrderAlgorithm.ActualPosition);
             }
         }
         else
         {
             log.Info("PositionUpdate for " + symbolInfo + ": MBT actual =" + position + " but symbol was not requested. Ignoring.");
         }
     }
 }
 private void AssertPositionMaximum(FIXContext context, MessageFIX4_4 packet)
 {
     if (isRecovered)
     {
         var quantity   = GetOrderQuantity(context, packet);
         var symbolInfo = GetSymbolInfo(context, packet);
         if (symbolInfo != null)
         {
             var position = GetPosition(symbolInfo);
             position += quantity;
             var maxPositionSize = symbolInfo.MaxPositionSize;
             var positionSize    = Math.Abs(position);
             if (positionSize > maxPositionSize)
             {
                 CloseWithError(context, packet, "Position size " + positionSize + " for " + symbolInfo + " was greater than MaxPositionSize of " + maxPositionSize + " in Message sequence #" + packet.Sequence);
             }
         }
     }
 }
        private int GetOrderQuantity(FIXContext context, MessageFIX4_4 packet)
        {
            var quantity = packet.OrderQuantity;

            switch (packet.Side)
            {
            case "1":
                break;

            case "2":
            case "5":
                quantity *= -1;
                break;

            default:
                CloseWithError(context, packet, "Unknown order side " + packet.Side + " in fix message. Unable to perform pre-trade verification.");
                break;
            }
            return(quantity);
        }
 private void AssertOrderMaximum(FIXContext context, MessageFIX4_4 packet)
 {
     if (isRecovered)
     {
         var quantity   = GetOrderQuantity(context, packet);
         var symbolInfo = GetSymbolInfo(context, packet);
         if (symbolInfo != null)
         {
             var position = GetPosition(symbolInfo);
             if (Math.Sign(quantity) != Math.Sign(position))
             {
                 quantity += (int)position;
             }
             var maxOrderSize = symbolInfo.MaxOrderSize;
             if (Math.Abs(quantity) > maxOrderSize)
             {
                 CloseWithError(context, packet, "Order size " + quantity + " for " + symbolInfo + " was greater than MaxOrderSize of " + maxOrderSize + " in Message sequence #" + packet.Sequence);
             }
         }
     }
 }
Beispiel #14
0
        private void FIXChangeOrder(MessageFIX4_4 packet)
        {
            var symbol = Factory.Symbol.LookupSymbol(packet.Symbol);
            var order  = ConstructOrder(packet, packet.ClientOrderId);

            if (!ProviderSimulator.IsOrderServerOnline)
            {
                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())
            {
                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);
        }
Beispiel #15
0
        private void FIXCancelOrder(MessageFIX4_4 packet)
        {
            var symbol = Factory.Symbol.LookupSymbol(packet.Symbol);

            if (!ProviderSimulator.IsOrderServerOnline)
            {
                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())
            {
                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;
        }
Beispiel #16
0
        public unsafe void ConnectToFIX()
        {
            string addrStr = "216.52.236.112";
            ushort port    = 5679;
            // Forex
//			string password = "******";
//			string userName = "******";
            // Equity
            string password = "******";
            string userName = "******";

            using (var filter = new FIXPretradeFilter(addrStr, port))
                using (Socket socket = Factory.Provider.Socket("TestSocket", "127.0.0.1", filter.LocalPort))
                {
                    socket.MessageFactory = new MessageFactoryFix44();
                    socket.SetBlocking(true);
                    socket.Connect();
                    socket.SetBlocking(false);

                    Message message      = socket.MessageFactory.Create();
                    string  hashPassword = MBTQuotesProvider.Hash(password);

                    var fixFactory = new FIXFactory4_4(1, userName, destination);
                    var mbtMsg     = (FIXMessage4_4)fixFactory.Create();
                    mbtMsg.SetEncryption(0);
                    mbtMsg.SetHeartBeatInterval(30);
                    mbtMsg.ResetSequence();
                    mbtMsg.SetEncoding("554_H1");
                    mbtMsg.SetPassword(password);
                    mbtMsg.AddHeader("A");

                    string login = mbtMsg.ToString();
                    message.DataOut.Write(login.ToCharArray());
                    log.Info("Login message: \n" + message);
                    while (!socket.TrySendMessage(message))
                    {
                        Factory.Parallel.Yield();
                    }

                    long end = Factory.Parallel.TickCount + 5000;
                    while (!socket.TryGetMessage(out message))
                    {
                        if (Factory.Parallel.TickCount > end)
                        {
                            Assert.Fail("Login Timed Out.");
                        }
                        Factory.Parallel.Yield();
                    }
                    MessageFIX4_4 packetFIX = (MessageFIX4_4)message;

//				packetFIX.ReadMessage();
                    Assert.AreEqual("FIX.4.4", packetFIX.Version);
                    Assert.AreEqual("A", packetFIX.MessageType);
                    Assert.AreEqual("MBT", packetFIX.Sender);
                    Assert.AreEqual(userName, packetFIX.Target);
                    Assert.AreEqual(1, packetFIX.Sequence);
                    Assert.NotNull(packetFIX.TimeStamp);
                    Assert.AreEqual("0", packetFIX.Encryption);
                    Assert.AreEqual(30, packetFIX.HeartBeatInterval);
                    socket.MessageFactory.Release(message);
                }
        }
Beispiel #17
0
        private CreateOrChangeOrder ConstructOrder(MessageFIX4_4 packet, string clientOrderId)
        {
            if (string.IsNullOrEmpty(clientOrderId))
            {
                var message = "Client order id was null or empty. FIX Message is: " + packet;
                log.Error(message);
                throw new ApplicationException(message);
            }
            var symbol = Factory.Symbol.LookupSymbol(packet.Symbol);
            var side   = OrderSide.Buy;

            switch (packet.Side)
            {
            case "1":
                side = OrderSide.Buy;
                break;

            case "2":
                side = OrderSide.Sell;
                break;

            case "5":
                side = OrderSide.SellShort;
                break;
            }
            var type = OrderType.BuyLimit;

            switch (packet.OrderType)
            {
            case "1":
                if (side == OrderSide.Buy)
                {
                    type = OrderType.BuyMarket;
                }
                else
                {
                    type = OrderType.SellMarket;
                }
                break;

            case "2":
                if (side == OrderSide.Buy)
                {
                    type = OrderType.BuyLimit;
                }
                else
                {
                    type = OrderType.SellLimit;
                }
                break;

            case "3":
                if (side == OrderSide.Buy)
                {
                    type = OrderType.BuyStop;
                }
                else
                {
                    type = OrderType.SellStop;
                }
                break;
            }
            long clientId;
            var  logicalId = 0;

            if (!long.TryParse(clientOrderId, out clientId))
            {
                log.Error("original client order id " + clientOrderId +
                          " cannot be converted to long: " + packet);
                clientId = 0;
            }
            var utcCreateTime = new TimeStamp(packet.TimeStamp);
            var physicalOrder = Factory.Utility.PhysicalOrder(
                OrderAction.Create, OrderState.Active, symbol, side, type, OrderFlags.None,
                packet.Price, packet.OrderQuantity, logicalId, 0, clientId, null, utcCreateTime);

            if (debug)
            {
                log.Debug("Received physical Order: " + physicalOrder);
            }
            return(physicalOrder);
        }