Exemplo n.º 1
0
        /// <summary>
        /// Creates and returns a new <see cref="NewOrderSingle"/> FIX message.
        /// </summary>
        /// <param name="accountNumber">The account number.</param>
        /// <param name="order">The order to submit.</param>
        /// <param name="positionIdBroker">The optional broker position identifier.</param>
        /// <param name="timeNow">The time now.</param>
        /// <returns>The FIX message.</returns>
        public static NewOrderSingle Create(
            AccountNumber accountNumber,
            Order order,
            PositionIdBroker?positionIdBroker,
            ZonedDateTime timeNow)
        {
            Debug.NotDefault(timeNow, nameof(timeNow));

            var message = new NewOrderSingle();

            message.SetField(new ClOrdID(order.Id.Value));
            message.SetField(new Account(accountNumber.Value));
            message.SetField(new Symbol(order.Symbol.Code));
            message.SetField(FxcmMessageHelper.GetFixOrderSide(order.OrderSide));
            message.SetField(FxcmMessageHelper.GetFixOrderType(order.OrderType));
            message.SetField(FxcmMessageHelper.GetFixTimeInForce(order.TimeInForce));
            message.SetField(new OrderQty(order.Quantity.Value));
            message.SetField(new TransactTime(timeNow.ToDateTimeUtc()));

            if (!(positionIdBroker is null))
            {
                message.SetField(new StringField(FxcmTags.PosID, positionIdBroker.Value));
            }

            if (order.ExpireTime.HasValue)
            {
                var expireTime = FxcmMessageHelper.ToExpireTimeFormat(order.ExpireTime.Value);
                message.SetField(new StringField(126, expireTime));
            }

            // Add price
            if (order.Price?.Value != null)
            {
                switch (order.OrderType)
                {
                case OrderType.Limit:
                    message.SetField(new Price(order.Price.Value));
                    break;

                case OrderType.Stop:
                    message.SetField(new StopPx(order.Price.Value));
                    break;

                case OrderType.StopLimit:
                    message.SetField(new StopPx(order.Price.Value));
                    break;

                case OrderType.Market:
                case OrderType.Undefined:
                    goto default;

                default:
                    throw ExceptionFactory.InvalidSwitchArgument(order.OrderType, nameof(order.OrderType));
                }
            }

            return(message);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Creates and returns a new <see cref="OrderCancelRequest"/> FIX message.
        /// </summary>
        /// <param name="order">The order.</param>
        /// <param name="transactionTime">The transaction time.</param>
        /// <returns>The FIX message.</returns>
        public static OrderCancelRequest Create(
            Order order,
            ZonedDateTime transactionTime)
        {
            Debug.NotDefault(transactionTime, nameof(transactionTime));

            var message = new OrderCancelRequest();

            message.SetField(new OrigClOrdID(order.Id.Value));
            message.SetField(new OrderID(order.IdBroker?.Value));
            message.SetField(new ClOrdID(order.Id.Value));
            message.SetField(new Symbol(order.Symbol.Code));
            message.SetField(new Quantity(order.Quantity.Value));
            message.SetField(FxcmMessageHelper.GetFixOrderSide(order.OrderSide));
            message.SetField(new TransactTime(transactionTime.ToDateTimeUtc()));

            return(message);
        }
        /// <summary>
        /// Creates and returns a new <see cref="OrderCancelReplaceRequest"/> FIX message.
        /// </summary>
        /// <param name="order">The order.</param>
        /// <param name="modifiedQuantity">The quantity to modify the order to.</param>
        /// <param name="modifiedPrice">The price to modify the order to.</param>
        /// <param name="transactionTime">The transaction time.</param>
        /// <returns>The FIX message.</returns>
        public static OrderCancelReplaceRequest Create(
            Order order,
            decimal modifiedQuantity,
            decimal modifiedPrice,
            ZonedDateTime transactionTime)
        {
            Debug.NotDefault(transactionTime, nameof(transactionTime));

            var message = new OrderCancelReplaceRequest();

            message.SetField(new OrigClOrdID(order.Id.Value));
            message.SetField(new OrderID(order.IdBroker?.Value));
            message.SetField(new ClOrdID(order.Id.Value));
            message.SetField(new Symbol(order.Symbol.Code));
            message.SetField(new Quantity(modifiedQuantity));
            message.SetField(FxcmMessageHelper.GetFixOrderSide(order.OrderSide));
            message.SetField(new TransactTime(transactionTime.ToDateTimeUtc()));
            message.SetField(FxcmMessageHelper.GetFixOrderType(order.OrderType));

            // Set the order price depending on order type.
            switch (order.OrderType)
            {
            case OrderType.Limit:
                message.SetField(new Price(modifiedPrice));
                break;

            case OrderType.StopLimit:
                message.SetField(new StopPx(modifiedPrice));
                break;

            case OrderType.Stop:
                message.SetField(new StopPx(modifiedPrice));
                break;

            case OrderType.Market:
            case OrderType.Undefined:
                goto default;

            default:
                throw ExceptionFactory.InvalidSwitchArgument(order.OrderType, nameof(order.OrderType));
            }

            return(message);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Creates and returns a new <see cref="NewOrderList"/> FIX message with contingency orders.
        /// </summary>
        /// <param name="symbolCode">The brokers symbol.</param>
        /// <param name="accountNumber">The account number.</param>
        /// <param name="bracketOrder">The bracket order.</param>
        /// <param name="timeNow">The time now.</param>
        /// <returns>The FIX message.</returns>
        public static NewOrderList CreateWithStopLoss(
            string symbolCode,
            AccountNumber accountNumber,
            BracketOrder bracketOrder,
            ZonedDateTime timeNow)
        {
            Debug.NotEmptyOrWhiteSpace(symbolCode, nameof(symbolCode));
            Debug.NotDefault(timeNow, nameof(timeNow));

            var message = new NewOrderList();

            message.SetField(new ListID(timeNow.TickOfDay.ToString()));
            message.SetField(new TotNoOrders(2));
            message.SetField(new ContingencyType(101));
            message.SetField(new NoOrders(2));
            message.SetField(new BidType(3));
            message.SetField(new TransactTime(timeNow.ToDateTimeUtc()));

            // Order 1
            var entry  = bracketOrder.Entry;
            var order1 = new NewOrderList.NoOrdersGroup();

            order1.SetField(new ClOrdID(entry.Id.Value));
            order1.SetField(new ListSeqNo(0));
            order1.SetField(new ClOrdLinkID("1"));
            order1.SetField(new Account(accountNumber.Value));
            order1.SetField(new Symbol(symbolCode));
            order1.SetField(FxcmMessageHelper.GetFixOrderSide(entry.OrderSide));
            order1.SetField(FxcmMessageHelper.GetFixOrderType(entry.OrderType));
            order1.SetField(FxcmMessageHelper.GetFixTimeInForce(entry.TimeInForce));
            order1.SetField(new OrderQty(entry.Quantity.Value));

            // Add price
            if (entry.Price?.Value != null)
            {
                switch (entry.OrderType)
                {
                case OrderType.Limit:
                    order1.SetField(new Price(entry.Price.Value));
                    break;

                case OrderType.Stop:
                    order1.SetField(new StopPx(entry.Price.Value));
                    break;

                case OrderType.StopLimit:
                    order1.SetField(new StopPx(entry.Price.Value));
                    break;

                case OrderType.Market:
                case OrderType.Undefined:
                    goto default;

                default:
                    throw ExceptionFactory.InvalidSwitchArgument(entry.OrderType, nameof(entry.OrderType));
                }
            }

            // Optional tags
            if (entry.ExpireTime.HasValue)
            {
                var expireTime = FxcmMessageHelper.ToExpireTimeFormat(entry.ExpireTime.Value);
                order1.SetField(new StringField(126, expireTime));
            }

            // Order 2 -----------------------------------------------------------------------------
            var stopLoss = bracketOrder.StopLoss;
            var order2   = new NewOrderList.NoOrdersGroup();

            order2.SetField(new ClOrdID(stopLoss.Id.Value));
            order2.SetField(new ListSeqNo(1));
            order2.SetField(new ClOrdLinkID("2"));
            order2.SetField(new Account(accountNumber.Value));
            order2.SetField(new Symbol(symbolCode));
            order2.SetField(FxcmMessageHelper.GetFixOrderSide(stopLoss.OrderSide));
            order2.SetField(new OrdType(OrdType.STOP));
            order2.SetField(FxcmMessageHelper.GetFixTimeInForce(stopLoss.TimeInForce));
            order2.SetField(new OrderQty(stopLoss.Quantity.Value));

            // Stop-loss orders should always have a stop price
            if (stopLoss.Price?.Value != null)
            {
                order2.SetField(new StopPx(stopLoss.Price.Value));
            }

            message.AddGroup(order1);
            message.AddGroup(order2);

            return(message);
        }