public Message MakeMessage(MarketOrder order, ProviderSession sessionInfo) { var senderId = GetSenderID(sessionInfo); if (string.IsNullOrEmpty(senderId)) { LoggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Debug, MsgMagicNoSender, 1000 * 60 * 15, "MakeMessage: код отправителя для [{0}] не найден", sessionInfo.SessionName); return null; } var symbol = TickerCodeDictionary.Instance.GetTickerNameFormatted(order.brokerOrder.Ticker); if (!ConvertToProviderSymbolNaming(ref symbol)) return null; //var isInstantOrder = order.EnabledAbsoluteSlippage.HasValue ? order.EnabledAbsoluteSlippage > 0 : false; var msg = FixMessage.FixVersion == FixVersion.Fix42 ? (Message) new QuickFix42.NewOrderSingle( new ClOrdID(order.brokerOrder.RequestId.ToString()), new HandlInst(FixMessageConstant.VALUE_HANDLE_INST_AUTO_NOINTERVENT[0]), new Symbol(symbol), new Side((order.brokerOrder.Side > 0 ? FixMessageConstant.VALUE_SIDE_BUY : FixMessageConstant.VALUE_SIDE_SELL)[0]), new TransactTime(DateTime.Now.ToUniversalTime(), ShowMillisecond), new OrdType(FixMessageConstant.VALUE_ORDTYPE_MARKET[0])) : FixMessage.FixVersion == FixVersion.Fix43 ? (Message) new QuickFix43.NewOrderSingle( new ClOrdID(order.brokerOrder.RequestId.ToString()), new HandlInst(FixMessageConstant.VALUE_HANDLE_INST_AUTO_NOINTERVENT[0]), new Side((order.brokerOrder.Side > 0 ? FixMessageConstant.VALUE_SIDE_BUY : FixMessageConstant.VALUE_SIDE_SELL)[0]), new TransactTime(DateTime.Now.ToUniversalTime(), ShowMillisecond), new OrdType(FixMessageConstant.VALUE_ORDTYPE_MARKET[0])) : new QuickFix44.NewOrderSingle( new ClOrdID(order.brokerOrder.RequestId.ToString()), new Side((order.brokerOrder.Side > 0 ? FixMessageConstant.VALUE_SIDE_BUY : FixMessageConstant.VALUE_SIDE_SELL)[0]), new TransactTime(DateTime.Now.ToUniversalTime(), ShowMillisecond), new OrdType(FixMessageConstant.VALUE_ORDTYPE_MARKET[0])); msg.setField(new Symbol(symbol)); msg.setField(new OrderQty(order.brokerOrder.Volume)); // !! пока торгуемый "продукт" вбит гвоздями var product = FixMessageConstant.VALUE_PRODUCT_CURRENCY.ToInt(); msg.setField(new Product(product)); if (!omitAccount) msg.setField(new Account(sessionInfo.HedgingAccount)); if (order.brokerOrder.OrderPricing == OrderPricing.Instant && order.brokerOrder.RequestedPrice.HasValue) if (order.brokerOrder.RequestedPrice.Value > 0) msg.setField(new Price((double)order.brokerOrder.RequestedPrice)); msg.setField(new TimeInForce(FixMessageConstant.VALUE_TIME_IN_FORCE_FILL_OR_KILL[0])); // !! ExecInst - на TradingFloor - да бог его знает // msg.setField(new ExecInst(FixMessageConstant.)); // msg.setField(new FutSettDate(DateTime.Now.ToUniversalTime().ToString("yyyyMMdd"))); // !! onBehalfID не заполняется // msg.getHeader().setField(new OnBehalfOfCompID(onBehalfId)); // сформировать заголовок msg.getHeader().setField(new SenderCompID(senderId)); msg.getHeader().setField(new TargetCompID(sessionInfo.SessionName)); // !! формируется непосредственно при отправке // msg.getHeader().setField(new SendingTime(DateTime.Now.ToUniversalTime(), false)); return msg; }
private string GetSenderID(ProviderSession sessionInfo) { var targetID = sessionInfo.SessionName; return !string.IsNullOrEmpty(sessionInfo.SenderCompId) ? sessionInfo.SenderCompId : senderIdByTargetId.ContainsKey(targetID) ? senderIdByTargetId[targetID] : senderIdByTargetId.ContainsKey("") ? senderIdByTargetId[""] : string.Empty; }