/// <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); }
/// <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); }