private OrderWorking GenerateOrderWorkingEvent(ExecutionReport message) { var orderId = this.GetOrderId(message); var orderIdBroker = new OrderIdBroker(message.GetField(Tags.OrderID)); var symbol = this.GetSymbol(message.GetField(Tags.Symbol)); var orderSide = FxcmMessageHelper.GetOrderSide(message.GetField(Tags.Side)); var orderType = FxcmMessageHelper.GetOrderType(message.GetField(Tags.OrdType)); var quantity = Quantity.Create(message.GetDecimal(Tags.OrderQty)); var price = FxcmMessageHelper.GetOrderPrice(orderType, message); var timeInForce = FxcmMessageHelper.GetTimeInForce(message.GetField(Tags.TimeInForce)); var expireTime = FxcmMessageHelper.GetExpireTime(message); var workingTime = FxcmMessageHelper.ParseTimestamp(message.GetField(Tags.TransactTime)); return(new OrderWorking( this.accountId, orderId, orderIdBroker, symbol, orderSide, orderType, quantity, price, timeInForce, expireTime, workingTime, this.NewGuid(), this.TimeNow())); }
private OrderPartiallyFilled GenerateOrderPartiallyFilledEvent(ExecutionReport message) { var orderId = this.GetOrderId(message); var executionId = new ExecutionId(message.GetField(Tags.ExecID)); var positionIdBroker = new PositionIdBroker(message.GetField(FxcmTags.PosID)); var symbol = this.GetSymbol(message.GetField(Tags.Symbol)); var orderSide = FxcmMessageHelper.GetOrderSide(message.GetField(Tags.Side)); var filledQuantity = Quantity.Create(message.GetDecimal(Tags.CumQty)); var averagePrice = Price.Create(message.GetDecimal(Tags.AvgPx)); var quoteCurrency = this.GetQuoteCurrency(symbol, message.GetField(Tags.Currency)); var leavesQuantity = Quantity.Create(message.GetInt(Tags.LeavesQty)); var executionTime = FxcmMessageHelper.ParseTimestamp(message.GetField(Tags.TransactTime)); return(new OrderPartiallyFilled( this.accountId, orderId, executionId, positionIdBroker, symbol, orderSide, filledQuantity, leavesQuantity, averagePrice, quoteCurrency, executionTime, this.NewGuid(), this.TimeNow())); }
public void OnMessage(MarketDataSnapshotFullRefresh message) { Debug.NotNull(this.dataGateway, nameof(this.dataGateway)); message.GetGroup(1, this.mdBidGroup); message.GetGroup(2, this.mdAskGroup); var tick = new QuoteTick( this.GetSymbol(message.GetField(Tags.Symbol)), Price.Create(this.mdBidGroup.GetDecimal(Tags.MDEntryPx)), Price.Create(this.mdAskGroup.GetDecimal(Tags.MDEntryPx)), Quantity.One(), Quantity.One(), this.tickTimestampProvider()); this.dataGateway?.OnData(tick); }
private OrderModified GenerateOrderModifiedEvent(ExecutionReport message) { var orderId = this.GetOrderId(message); var orderIdBroker = new OrderIdBroker(message.GetField(Tags.OrderID)); var orderType = FxcmMessageHelper.GetOrderType(message.GetField(Tags.OrdType)); var quantity = message.IsSetField(Tags.LeavesQty) ? Quantity.Create(message.GetDecimal(Tags.LeavesQty)) : Quantity.Create(message.GetDecimal(Tags.OrderQty)); var price = FxcmMessageHelper.GetOrderPrice(orderType, message); var modifiedTime = FxcmMessageHelper.ParseTimestamp(message.GetField(Tags.TransactTime)); return(new OrderModified( this.accountId, orderId, orderIdBroker, quantity, price, modifiedTime, this.NewGuid(), this.TimeNow())); }
public void OnMessage(SecurityList message) { Debug.NotNull(this.dataGateway, nameof(this.dataGateway)); var responseId = message.GetField(Tags.SecurityResponseID); var result = FxcmMessageHelper.GetSecurityRequestResult(message.SecurityRequestResult); this.Logger.LogDebug(LogId.Network, $"{Received}{Fix} {nameof(SecurityList)}(ResponseId={responseId}, Result={result})."); var instruments = new List <Instrument>(); var groupCount = int.Parse(message.NoRelatedSym.ToString()); var group = new SecurityList.NoRelatedSymGroup(); for (var i = 1; i <= groupCount; i++) { message.GetGroup(i, group); var symbol = this.GetSymbol(group.GetField(Tags.Symbol)); var securityType = FxcmMessageHelper.GetSecurityType(group.GetField(FxcmTags.ProductID)); var tickPrecision = group.GetInt(FxcmTags.SymPrecision); var tickSize = group.GetDecimal(FxcmTags.SymPointSize) * 0.1m; // Field 9002 returns 'point' size (* 0.1m to get tick size) var roundLot = group.GetInt(Tags.RoundLot); var minStopDistanceEntry = group.GetInt(FxcmTags.CondDistEntryStop); var minLimitDistanceEntry = group.GetInt(FxcmTags.CondDistEntryLimit); var minStopDistance = group.GetInt(FxcmTags.CondDistStop); var minLimitDistance = group.GetInt(FxcmTags.CondDistLimit); var minTradeSize = group.GetInt(FxcmTags.MinQuantity); var maxTradeSize = group.GetInt(FxcmTags.MaxQuantity); var rolloverInterestBuy = group.GetDecimal(FxcmTags.SymInterestBuy); var rolloverInterestSell = group.GetDecimal(FxcmTags.SymInterestSell); if (securityType == SecurityType.Forex) { var forexInstrument = new ForexInstrument( symbol, tickPrecision, 0, minStopDistanceEntry, minLimitDistanceEntry, minStopDistance, minLimitDistance, Price.Create(tickSize, tickPrecision), Quantity.Create(roundLot), Quantity.Create(minTradeSize), Quantity.Create(maxTradeSize), rolloverInterestBuy, rolloverInterestSell, this.TimeNow()); instruments.Add(forexInstrument); } else { var instrument = new Instrument( symbol, group.GetField(Tags.Currency).ToEnum <Nautilus.DomainModel.Enums.Currency>(), securityType, tickPrecision, 0, minStopDistanceEntry, minLimitDistanceEntry, minStopDistance, minLimitDistance, Price.Create(tickSize, tickPrecision), Quantity.Create(roundLot), Quantity.Create(minTradeSize), Quantity.Create(maxTradeSize), rolloverInterestBuy, rolloverInterestSell, this.TimeNow()); instruments.Add(instrument); } } this.dataGateway?.OnData(instruments); }
/// <summary> /// Returns a new <see cref="Quantity"/> as the result of the given <see cref="Quantity"/> /// subtracted from this <see cref="Quantity"/> (cannot return a <see cref="Quantity"/> /// with a negative value). /// </summary> /// <param name="other">The other quantity.</param> /// <returns>A <see cref="Quantity"/>.</returns> public Quantity Sub(Quantity other) { Debug.True(other.Value <= this.Value, nameof(other)); return(new Quantity(this.Value - other.Value, Math.Max(this.Precision, other.Precision))); }
/// <summary> /// Returns a new <see cref="Quantity"/> as the result of the sum of this <see cref="Quantity"/> /// and the given <see cref="Quantity"/>. /// </summary> /// <param name="other">The other quantity.</param> /// <returns>A <see cref="Quantity"/>.</returns> public Quantity Add(Quantity other) { return(new Quantity(this.Value + other.Value, Math.Max(this.Precision, other.Precision))); }