Пример #1
0
        protected override void OnMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            if (!IsInitialised)
            {
                return;
            }
            DateTime   niffleTimeStamp = DateTime.FromBinary(e.Message.TimeStamp);
            RoutingKey routingKey      = new RoutingKey(e.EventArgs.RoutingKey);
            string     source          = routingKey.GetSource();
            string     action          = routingKey.GetAction();
            string     _event          = routingKey.GetEvent();

            //Service messages received will be notify
            if (e.Message.Type == Niffle.Types.Type.Service)
            {
                if (e.Message.Service != null)
                {
                    if (e.Message.Service.Success)
                    {
                        ReportExecution(source, action, _event, Utils.FormatDateTimeWithSeparators(niffleTimeStamp));

                        //If Strategy ended then report.
                        if (source == nameof(OnTerminateTime))
                        {
                            Report();
                            //Reset();
                        }
                    }
                }
            }

            //Position message will be for Position Opened or Closed
            if (e.Message.Type == Niffle.Types.Type.Position)
            {
                if (e.Message.Position != null)
                {
                    if (routingKey.GetEventAsEnum() == Event.ONPOSITIONCLOSED)
                    {
                        if (e.Message.Position.StateChange == Messaging.Protobuf.Position.Types.StateChange.Closed)
                        {
                            ReportPositionClosed(e.Message.Position);
                        }
                    }

                    if (routingKey.GetEventAsEnum() == Event.ONPOSITIONOPENED)
                    {
                        if (e.Message.Position.StateChange == Messaging.Protobuf.Position.Types.StateChange.Opened)
                        {
                            ReportPositionOpened(e.Message.Position);
                        }
                    }

                    if (routingKey.GetEventAsEnum() == Event.ONPOSITIONMODIFIED)
                    {
                        if (e.Message.Position.StateChange == Messaging.Protobuf.Position.Types.StateChange.Modified)
                        {
                            ReportPositionModified(e.Message.Position, Utils.FormatDateTimeWithSeparators(niffleTimeStamp));
                        }
                    }
                }
            }

            //Orders messages will be for Orders Placed, Cancelled or Modified
            if (e.Message.Type == Niffle.Types.Type.Order)
            {
                if (e.Message.Order != null)
                {
                    if (routingKey.GetEventAsEnum() == Event.ONORDERPLACED)
                    {
                        if (e.Message.Order.StateChange == Messaging.Protobuf.Order.Types.StateChange.Filled)
                        {
                            ReportOrderPlaced(e.Message.Order);
                        }
                    }

                    if (routingKey.GetEventAsEnum() == Event.ONORDERCANCELLED)
                    {
                        if (e.Message.Order.StateChange == Messaging.Protobuf.Order.Types.StateChange.Canceled)
                        {
                            ReportOrderCancelled(e.Message.Order, Utils.FormatDateTimeWithSeparators(niffleTimeStamp));
                        }
                    }

                    //Need to work out how to determine if order has been modified
                    if (routingKey.GetEventAsEnum() == Event.ONORDERMODIFIED)
                    {
                        if (e.Message.Order.StateChange == Messaging.Protobuf.Order.Types.StateChange.Filled)
                        {
                            ReportOrderModified(e.Message.Order, Utils.FormatDateTimeWithSeparators(niffleTimeStamp));
                        }
                    }
                }
            }

            //Error messages
            if (e.Message.Type == Niffle.Types.Type.Error)
            {
                if (e.Message.Error != null)
                {
                    ReportError(source, e.Message.Error, Utils.FormatDateTimeWithSeparators(niffleTimeStamp));
                }
            }
        }
Пример #2
0
        protected override void OnMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            if (!IsInitialised)
            {
                return;
            }
            DateTime   niffleTimeStamp = DateTime.FromBinary(e.Message.Timestamp);
            RoutingKey routingKey      = new RoutingKey(e.EventArgs.RoutingKey);
            string     source          = routingKey.GetSource();
            string     action          = routingKey.GetAction();
            string     _event          = routingKey.GetEvent();

            //Service messages received will be notify
            if (e.Message.Type == Niffle.Types.Type.Service)
            {
                if (e.Message.Service != null)
                {
                    if (e.Message.Service.Success)
                    {
                        ReportExecution(source, action, _event, Utils.FormatDateTimeWithSeparators(niffleTimeStamp));
                    }
                }
            }

            //Positions messages will be for Position Opened, Closed or Modified.
            if (e.Message.Type == Niffle.Types.Type.Positions)
            {
                if (e.Message.Positions != null)
                {
                    Messaging.Protobuf.Positions positions = e.Message.Positions;
                    for (int count = 0; count < positions.Count; count++)
                    {
                        if (routingKey.GetEventAsEnum() == Event.ONPOSITIONCLOSED)
                        {
                            if (positions.Position[count].StateChange == Messaging.Protobuf.Position.Types.StateChange.Closed)
                            {
                                ReportPositionClosed(positions.Position[count]);
                            }
                        }

                        if (routingKey.GetEventAsEnum() == Event.ONPOSITIONOPENED)
                        {
                            if (positions.Position[count].StateChange == Messaging.Protobuf.Position.Types.StateChange.Opened)
                            {
                                ReportPositionOpened(positions.Position[count]);
                            }
                        }

                        if (routingKey.GetEventAsEnum() == Event.ONPOSITIONMODIFIED)
                        {
                            if (positions.Position[count].StateChange == Messaging.Protobuf.Position.Types.StateChange.Modified)
                            {
                                ReportPositionModified(positions.Position[count], Utils.FormatDateTimeWithSeparators(niffleTimeStamp));
                            }
                        }
                    }
                }
            }

            //Orders messages will be for Orders Placed, Cancelled or Modified
            if (e.Message.Type == Niffle.Types.Type.Orders)
            {
                if (e.Message.Orders != null)
                {
                    Messaging.Protobuf.Orders orders = e.Message.Orders;
                    for (int count = 0; count < orders.Count; count++)
                    {
                        if (routingKey.GetEventAsEnum() == Event.ONORDERPLACED)
                        {
                            if (orders.Order[count].StateChange == Messaging.Protobuf.Order.Types.StateChange.Placed)
                            {
                                ReportOrderPlaced(orders.Order[count]);
                            }
                        }

                        if (routingKey.GetEventAsEnum() == Event.ONORDERCANCELLED)
                        {
                            if (orders.Order[count].StateChange == Messaging.Protobuf.Order.Types.StateChange.Cancelled)
                            {
                                ReportOrderCancelled(orders.Order[count], Utils.FormatDateTimeWithSeparators(niffleTimeStamp));
                            }
                        }

                        if (routingKey.GetEventAsEnum() == Event.ONORDERMODIFIED)
                        {
                            if (orders.Order[count].StateChange == Messaging.Protobuf.Order.Types.StateChange.Modified)
                            {
                                ReportOrderModified(orders.Order[count], Utils.FormatDateTimeWithSeparators(niffleTimeStamp));
                            }
                        }
                    }
                }
            }

            //Error messages
            if (e.Message.Type == Niffle.Types.Type.Orders)
            {
                if (e.Message.Error != null)
                {
                    ReportError(source, e.Message.Error, Utils.FormatDateTimeWithSeparators(niffleTimeStamp));
                }
            }
        }
Пример #3
0
        protected override void OnMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            DateTime   niffleTimeStamp = DateTime.FromBinary(e.Message.TimeStamp);
            RoutingKey routingKey      = new RoutingKey(e.EventArgs.RoutingKey);
            string     action          = routingKey.GetAction();
            string     _event          = routingKey.GetEvent();
            Trade      trade           = e.Message.Trade;

            switch (routingKey.GetActionAsEnum())
            {
            case Messaging.RabbitMQ.Action.TRADEMANAGEMENT:
                //Save the trade to execute against the Linked Trade label
                StateManager.UpdateStateLinkedTradeAsync(trade.LinkedTradeLabel, trade.Order.Label, trade);
                break;
            }

            // Need to have another transforming service if FIX service only publishes raw messages
            // Need to have a service that listens for routing key FIXServiceName.*.*
            // This service will then have to unpack the FIX API message and construct the appropriate msg and routing key

            switch (routingKey.GetEventAsEnum())
            {
            case Messaging.RabbitMQ.Event.ONPOSITIONCLOSED:
                switch (e.Message.Trade.Order.StateChange)
                {
                case Order.Types.StateChange.Filled:         //The stateChange should be used to set the routing key and not needed here.
                    //Check if this is a linked trade
                    if (trade.IsLinkedTrade)
                    {
                        //Save the state of the filled linked trade
                        StateManager.UpdateStateLinkedTradeAsync(trade.LinkedTradeLabel, trade.Order.Label, trade);

                        //Find all other linked trades and cancel them
                        StateManager.FindAllLinkedTradesExcludingAsync(trade.LinkedTradeLabel, trade.Order.Label, CancelTradeOperation);
                    }
                    //This is a masker trade therefore place any linked SL and TP trades
                    else
                    {
                        //Find all linked trades and excute them
                        StateManager.FindAllLinkedTradesAsync(trade.LinkedTradeLabel, trade.Order.PosMaintRptID, ExecuteTradeOperation);
                    }
                    break;

                case Order.Types.StateChange.Canceled:
                    //If this is a masker trade then cancel any linked SL and TP trades
                    if (!trade.IsLinkedTrade)
                    {
                        //Find all linked trades and cancel them
                        StateManager.FindAllLinkedTradesAsync(trade.LinkedTradeLabel, trade.Order.PosMaintRptID, CancelTradeOperation);
                    }
                    break;
                }

                //Order filled
                if (e.Message.Trade.Order.StateChange == Order.Types.StateChange.Filled)
                {
                }
                break;

            default:
                return;
            }
            ;
        }