public void Create(UserId userId, SecurityId securityId) { if (_state.Version != 0) throw new DomainError("User already has non-zero version"); Apply(new UserCreated(userId, securityId, DefaultLoginActivityThreshold)); }
public static IEnumerable<ISampleMessage> Create() { var security = new SecurityId(0); yield return (new CreateSecurityAggregate(security)); yield return (new AddSecurityPassword(security, "Rinat Abdullin", "*****@*****.**", "password")); yield return (new AddSecurityIdentity(security, "Rinat's Open ID", "http://abdullin.myopenid.org")); yield return (new AddSecurityKey(security, "some key")); }
IMarketDataStorageDrive IMarketDataDrive.GetStorageDrive(SecurityId securityId, Type dataType, object arg, StorageFormats format) { var drive = GetDrive(); var storageDrive = drive.GetStorageDrive(securityId, dataType, arg, format); if (drive == _remoteDrive) storageDrive = new CacheableMarketDataDrive(storageDrive, _cacheDrive.GetStorageDrive(securityId, dataType, arg, format)); return storageDrive; }
/// <summary> /// Initialize <see cref="MarketDepthGenerator"/>. /// </summary> /// <param name="securityId">The identifier of the instrument, for which data shall be generated.</param> protected MarketDepthGenerator(SecurityId securityId) : base(securityId) { UseTradeVolume = true; MinSpreadStepCount = 1; MaxSpreadStepCount = int.MaxValue; MaxBidsDepth = 10; MaxAsksDepth = 10; MaxGenerations = 20; }
private void ReplaceSecurityId(SecurityId securityId, Action<SecurityId> setSecurityId) { if (securityId.Native == null) return; SecurityId id; if (!_securityIds.TryGetValue(securityId.Native, out id)) return; setSecurityId(new SecurityId { SecurityCode = id.SecurityCode, BoardCode = id.BoardCode, Native = securityId.Native }); }
/// <summary> /// Создать <see cref="OrderLogGenerator"/>. /// </summary> /// <param name="securityId">Идентификатор инструмента, для которого необходимо генерировать данные.</param> /// <param name="tradeGenerator">Генератор тиковых сделок случайным методом.</param> public OrderLogGenerator(SecurityId securityId, TradeGenerator tradeGenerator) : base(securityId) { if (tradeGenerator == null) throw new ArgumentNullException("tradeGenerator"); //_lastOrderPrice = startPrice; TradeGenerator = tradeGenerator; IdGenerator = new IncrementalIdGenerator(); }
/// <summary> /// Создать <see cref="PositionChangeMessage"/>. /// </summary> /// <param name="adapter">Апаптер к торговой системе.</param> /// <param name="pfName">Название портфеля.</param> /// <param name="securityId">Идентификатор инструмента.</param> /// <returns>Сообщение об изменении позиции.</returns> public static PositionChangeMessage CreatePositionChangeMessage(this IMessageAdapter adapter, string pfName, SecurityId securityId) { if (adapter == null) throw new ArgumentNullException("adapter"); var time = adapter.CurrentTime; return new PositionChangeMessage { PortfolioName = pfName, SecurityId = securityId, LocalTime = time.LocalDateTime, ServerTime = time, }; }
private void ProcessSecurityLookup(SecurityLookupMessage lookupMsg) { var reply = _client.GetInstruments(); foreach (var info in reply.Items.Values) { var secId = new SecurityId { SecurityCode = info.Name.ToStockSharpCode(), BoardCode = _boardCode, }; // NOTE сейчас BTCE транслирует для данного тикера // кол-во знаков после запятой 3 и мин цена 0.0001 if (secId.SecurityCode.CompareIgnoreCase("ltc/eur")) info.MinPrice = 0.001; // NOTE сейчас BTCE транслирует для данного тикера // кол-во знаков после запятой 2, но цены содержат 5 знаков if (secId.SecurityCode.CompareIgnoreCase("btc/cnh")) info.DecimalDigits = 5; if (secId.SecurityCode.CompareIgnoreCase("btc/usd")) info.DecimalDigits = 5; SendOutMessage(new SecurityMessage { SecurityId = secId, Decimals = info.DecimalDigits, VolumeStep = (decimal)info.MinVolume, SecurityType = SecurityTypes.CryptoCurrency, OriginalTransactionId = lookupMsg.TransactionId, }); SendOutMessage(new Level1ChangeMessage { SecurityId = secId, ServerTime = reply.Timestamp.ApplyTimeZone(TimeHelper.Moscow) } .TryAdd(Level1Fields.MinPrice, (decimal)info.MinPrice) .TryAdd(Level1Fields.MaxPrice, (decimal)info.MaxPrice) .Add(Level1Fields.State, info.IsHidden ? SecurityStates.Stoped : SecurityStates.Trading)); } SendOutMessage(new SecurityLookupResultMessage { OriginalTransactionId = lookupMsg.TransactionId }); }
public ExecutionLogConverter(SecurityId securityId, SortedDictionary<decimal, RefPair<List<ExecutionMessage>, QuoteChange>> bids, SortedDictionary<decimal, RefPair<List<ExecutionMessage>, QuoteChange>> asks, MarketEmulatorSettings settings) { if (bids == null) throw new ArgumentNullException("bids"); if (asks == null) throw new ArgumentNullException("asks"); if (settings == null) throw new ArgumentNullException("settings"); _bids = bids; _asks = asks; _settings = settings; SecurityId = securityId; }
private void Ok_Click(object sender, RoutedEventArgs e) { var secId = new SecurityId(); //{ // SecurityCode = SecCode.Text, //}; if (!BoardName.Text.IsEmpty()) secId.BoardCode = BoardName.Text; if (!ContractId.Text.IsEmpty()) secId.Native = ContractId.Text.To<int>(); MainWindow.Instance.Trader.LookupSecurities(new SecurityLookupMessage { SecurityId = secId, Name = SecCode.Text, Currency = CurrencyTypes.USD, SecurityType = SecType.GetSelectedValue<SecurityTypes>() ?? default(SecurityTypes), TransactionId = MainWindow.Instance.Trader.TransactionIdGenerator.GetNextId(), }); DialogResult = true; }
public ExecutionLogConverter(SecurityId securityId, SortedDictionary<decimal, RefPair<List<ExecutionMessage>, QuoteChange>> bids, SortedDictionary<decimal, RefPair<List<ExecutionMessage>, QuoteChange>> asks, MarketEmulatorSettings settings, Func<DateTime, DateTimeOffset> getServerTime) { if (bids == null) throw new ArgumentNullException(nameof(bids)); if (asks == null) throw new ArgumentNullException(nameof(asks)); if (settings == null) throw new ArgumentNullException(nameof(settings)); if (getServerTime == null) throw new ArgumentNullException(nameof(getServerTime)); _bids = bids; _asks = asks; _settings = settings; _getServerTime = getServerTime; SecurityId = securityId; }
/// <summary>Коллбэк результата поиска инструментов.</summary> /// <param name="lookupTransId">Номер транзакции операции Lookup.</param> /// <param name="data">Список инструментов, удовлетворяющих условию поиска.</param> /// <param name="ex">Ошибка поиска.</param> private void ClientOnProductLookupResult(long lookupTransId, IEnumerable<ProductInfo> data, Exception ex) { if (ex != null) { SendOutError(new ETradeException(LocalizedStrings.Str3363, ex)); if (lookupTransId > 0) SendOutMessage(new SecurityLookupResultMessage { OriginalTransactionId = lookupTransId }); return; } foreach(var info in data.Where(info => info.securityType == "EQ")) { var secId = new SecurityId { SecurityCode = info.symbol, BoardCode = AssociatedBoardCode, }; var msg = new SecurityMessage { SecurityId = secId, Name = info.companyName, ShortName = info.companyName, SecurityType = SecurityTypes.Stock, PriceStep = 0.01m, Currency = CurrencyTypes.USD, }; SendOutMessage(msg); } if (lookupTransId > 0) SendOutMessage(new SecurityLookupResultMessage { OriginalTransactionId = lookupTransId }); }
/// <summary> /// Нужно ли обрабатывать маркет-данные. /// </summary> /// <param name="dataType">Тип маркет-данных.</param> /// <param name="securityId">Идентификатор инструмента.</param> /// <returns>Нужно ли обрабатывать маркет-данные.</returns> public bool NeedProcess(MarketDataTypes dataType, SecurityId securityId) { return _fixServer.HasSubscriptions(dataType, new SecurityId { SecurityCode = securityId.SecurityCode, BoardCode = GetBoardCode(securityId.BoardCode) }); }
public static void WriteVolume <T>(this BitArrayWriter writer, decimal volume, BinaryMetaInfo <T> info, SecurityId securityId) where T : BinaryMetaInfo <T> { if (info.Version < MarketDataVersions.Version44) { var intVolume = volume.Truncate(); if (intVolume == volume) // объем целочисленный { writer.Write(true); writer.WriteLong((long)intVolume); } else { writer.Write(false); throw new NotSupportedException(LocalizedStrings.Str1010Params.Put(volume)); } } else { var isAligned = (volume % info.VolumeStep) == 0; writer.Write(isAligned); if (isAligned) { writer.WriteLong((long)(volume / info.VolumeStep)); } else { if (info.FirstFractionalVolume == 0) { info.FirstFractionalVolume = info.LastFractionalVolume = volume; } info.LastFractionalVolume = writer.WriteDecimal(volume, info.LastFractionalVolume); } } }
private Security InitSecurity(SecurityId securityId) { var id = securityId.ToStringId(); var security = _entityRegistry.Securities.ReadById(id); if (security != null) return security; security = new Security { Id = id, ExtensionInfo = new Dictionary<object, object>(), Code = securityId.SecurityCode, Board = ExchangeBoard.GetOrCreateBoard(securityId.SecurityCode), Type = securityId.SecurityType, }; _entityRegistry.Securities.Save(security); _logManager.Application.AddInfoLog(LocalizedStrings.Str2871Params.Put(id)); return security; }
protected ConvertableStorage(StorageRegistry parent, Security security, SecurityId securityId, object arg, Func <TMessage, DateTimeOffset> getTime, Func <TMessage, SecurityId> getSecurity, Func <TMessage, TId> getId, IMarketDataSerializer <TMessage> serializer, IMarketDataStorageDrive drive) : base(security, securityId, arg, getTime, getSecurity, getId, serializer, drive) { _parent = parent; }
public TransactionStorage(Security security, SecurityId securityId, IMarketDataStorageDrive drive, IMarketDataSerializer <ExecutionMessage> serializer) : base(security, securityId, ExecutionTypes.Transaction, msg => msg.ServerTime, msg => msg.SecurityId, msg => msg.TransactionId, serializer, drive) { AppendOnlyNew = false; }
public CandleStorage(Security security, SecurityId securityId, object arg, IMarketDataStorageDrive drive, IMarketDataSerializer <TCandleMessage> serializer) : base(security, securityId, arg, drive, serializer) { }
private SecurityId GetSecurityId(SecurityId securityId) => IsSupportSubscriptionBySecurity ? securityId : default;
private void ProcessMessage <TMessage>(SecurityId securityId, TMessage message, bool throwIfSecIdEmpty, Func <TMessage, TMessage, TMessage> processSuspend) where TMessage : Message { var native = securityId.Native; if (native != null) { SecurityId?fullSecurityId; lock (_syncRoot) fullSecurityId = _securityIds.TryGetValue2(native); if (fullSecurityId == null) { lock (_syncRoot) { var tuple = _suspendedOutMessages.SafeAdd(securityId, key => RefTuple.Create((List <Message>)null, (Dictionary <MessageTypes, Message>)null)); var clone = message.Clone(); if (processSuspend == null) { if (tuple.First == null) { tuple.First = new List <Message>(); } tuple.First.Add(clone); } else { if (tuple.Second == null) { tuple.Second = new Dictionary <MessageTypes, Message>(); } var prev = tuple.Second.TryGetValue(clone.Type); tuple.Second[clone.Type] = prev == null ? clone : processSuspend((TMessage)prev, (TMessage)clone); } } return; } message.ReplaceSecurityId(fullSecurityId.Value); } else { var securityCode = securityId.SecurityCode; var boardCode = securityId.BoardCode; var isSecCodeEmpty = securityCode.IsEmpty(); if (isSecCodeEmpty && throwIfSecIdEmpty) { throw new InvalidOperationException(); } if (!isSecCodeEmpty && boardCode.IsEmpty()) { SecurityId?foundId = null; lock (_syncRoot) { foreach (var id in _securityIds.Values) { if (!id.SecurityCode.CompareIgnoreCase(securityCode)) { continue; } if (securityId.SecurityType != null && securityId.SecurityType != id.SecurityType) { continue; } foundId = id; } if (foundId == null) { var tuple = _suspendedOutMessages.SafeAdd(securityId, key => RefTuple.Create(new List <Message>(), (Dictionary <MessageTypes, Message>)null)); tuple.First.Add(message.Clone()); return; } } message.ReplaceSecurityId(foundId.Value); //// если указан код и тип инструмента, то пытаемся найти инструмент по ним //if (securityId.SecurityType != null) //{ //} //else // throw new ArgumentException(nameof(securityId), LocalizedStrings.Str682Params.Put(securityCode, securityId.SecurityType)); } } base.OnInnerAdapterNewOutMessage(message); }
/// <inheritdoc /> public abstract IEnumerable <DataType> GetAvailableDataTypes(SecurityId securityId, StorageFormats format);
/// <summary> /// Initializes a new instance of the <see cref="TickCsvSerializer"/>. /// </summary> /// <param name="securityId">Security ID.</param> /// <param name="encoding">Encoding.</param> public TickCsvSerializer(SecurityId securityId, Encoding encoding = null) : base(securityId, encoding) { }
private IMarketDataStorage <TMessage> GetStorage <TMessage>(SecurityId securityId, object arg) where TMessage : Message { return((IMarketDataStorage <TMessage>)GetStorage(securityId, typeof(TMessage), arg)); }
public static void WritePriceEx <T>(this BitArrayWriter writer, decimal price, BinaryMetaInfo <T> info, SecurityId securityId) where T : BinaryMetaInfo <T> { if (info.Version < MarketDataVersions.Version41) { writer.WritePrice(price, info.LastPrice, info, securityId); info.LastPrice = price; } else { var isAligned = (price % info.PriceStep) == 0; writer.Write(isAligned); if (isAligned) { if (info.FirstPrice == 0) { info.FirstPrice = info.LastPrice = price; } writer.WritePrice(price, info.LastPrice, info, securityId); info.LastPrice = price; } else { if (info.FirstNonSystemPrice == 0) { info.FirstNonSystemPrice = info.LastNonSystemPrice = price; } info.LastNonSystemPrice = writer.WriteDecimal(price, info.LastNonSystemPrice); } } }
public static void WritePrice <T>(this BitArrayWriter writer, decimal price, decimal prevPrice, MetaInfo <T> info, SecurityId securityId, bool useLong = false) where T : MetaInfo <T> { if ((price % info.PriceStep) != 0) { throw new ArgumentException(LocalizedStrings.Str1007Params.Put(info.PriceStep, securityId, price), "info"); } try { var stepCount = (long)((price - prevPrice) / info.PriceStep); // ОЛ может содержать заявки с произвольно большими ценами if (useLong) { writer.WriteLong(stepCount); } else { writer.WriteInt((int)stepCount); } } catch (OverflowException ex) { throw new ArgumentException(LocalizedStrings.Str1008Params.Put(price, prevPrice, info.PriceStep, useLong), ex); } }
public static TimeSpan GetTimeZone <TMetaInfo>(this BinaryMetaInfo <TMetaInfo> metaInfo, bool isUtc, SecurityId securityId) where TMetaInfo : BinaryMetaInfo <TMetaInfo> { if (isUtc) { return(metaInfo.ServerOffset); } var board = ExchangeBoard.GetBoard(securityId.BoardCode); return(board == null ? metaInfo.LocalOffset : board.Exchange.TimeZoneInfo.BaseUtcOffset); }
private void ReadMyTrade(IBSocket socket, ServerVersions version) { /* requestId */ if (version >= ServerVersions.V7) socket.ReadInt(); // http://www.interactivebrokers.com/en/software/api/apiguide/java/execution.htm var transactionId = socket.ReadInt(); //Handle the 2^31-1 == 0 bug if (transactionId == int.MaxValue) transactionId = 0; //Read Contract Fields var contractId = version >= ServerVersions.V5 ? socket.ReadInt() : -1; var secName = socket.ReadStr(); var type = socket.ReadSecurityType(); var expiryDate = socket.ReadExpiry(); var strike = socket.ReadDecimal(); var optionType = socket.ReadOptionType(); var multiplier = version >= ServerVersions.V9 ? socket.ReadMultiplier() : null; var boardCode = socket.ReadBoardCode(); var currency = socket.ReadCurrency(); var secCode = socket.ReadLocalCode(secName); var secClass = (version >= ServerVersions.V10) ? socket.ReadStr() : null; var tradeId = socket.ReadStr(); var time = socket.ReadDateTime("yyyyMMdd HH:mm:ss"); var portfolio = socket.ReadStr(); /* exchange */ socket.ReadStr(); var side = socket.ReadTradeSide(); var volume = socket.ReadDecimal(); var price = socket.ReadDecimal(); var permId = version >= ServerVersions.V2 ? socket.ReadInt() : (int?)null; var clientId = version >= ServerVersions.V3 ? socket.ReadInt() : (int?)null; var liquidation = version >= ServerVersions.V4 ? socket.ReadInt() : (int?)null; var cumulativeQuantity = version >= ServerVersions.V6 ? socket.ReadInt() : (int?)null; var averagePrice = version >= ServerVersions.V6 ? socket.ReadDecimal() : (decimal?)null; var orderRef = version >= ServerVersions.V8 ? socket.ReadStr() : null; var evRule = version >= ServerVersions.V9 ? socket.ReadStr() : null; var evMultiplier = version >= ServerVersions.V9 ? socket.ReadDecimal() : (decimal?)null; var secId = new SecurityId { SecurityCode = secCode, BoardCode = GetBoardCode(boardCode), InteractiveBrokers = contractId, }; SendOutMessage(new SecurityMessage { SecurityId = secId, Name = secName, SecurityType = type, ExpiryDate = expiryDate, Strike = strike, OptionType = optionType, Currency = currency, Multiplier = multiplier ?? 0, Class = secClass }); // заявка была создана руками if (transactionId == 0) return; _secIdByTradeIds[tradeId] = secId; var execMsg = new ExecutionMessage { ExecutionType = ExecutionTypes.Transaction, OriginalTransactionId = transactionId, TradeStringId = tradeId, OriginSide = side, TradePrice = price, TradeVolume = volume, PortfolioName = portfolio, ServerTime = time, SecurityId = secId, HasTradeInfo = true, }; if (permId != null) execMsg.SetPermId(permId.Value); if (clientId != null) execMsg.SetClientId(clientId.Value); if (liquidation != null) execMsg.SetLiquidation(liquidation.Value); if (cumulativeQuantity != null) execMsg.SetCumulativeQuantity(cumulativeQuantity.Value); if (averagePrice != null) execMsg.SetAveragePrice(averagePrice.Value); if (orderRef != null) execMsg.SetOrderRef(orderRef); if (evRule != null) execMsg.SetEvRule(evRule); if (evMultiplier != null) execMsg.SetEvMultiplier(evMultiplier.Value); SendOutMessage(execMsg); }
/// <summary> /// Получить путь к папке с маркет-данными для инструмента. /// </summary> /// <param name="securityId">Идентификатор инструмента.</param> /// <returns>Путь к папке с маркет-данными.</returns> public string GetSecurityPath(SecurityId securityId) { if (securityId.IsDefault()) throw new ArgumentNullException("securityId"); var id = securityId.SecurityCode + "@" + securityId.BoardCode; var folderName = id.SecurityIdToFolderName(); return UseAlphabeticPath ? IOPath.Combine(Path, id.Substring(0, 1), folderName) : IOPath.Combine(Path, folderName); }
private void ReadPortfolioPosition(IBSocket socket, ServerVersions version) { var contractId = version >= ServerVersions.V6 ? socket.ReadInt() : -1; var secName = socket.ReadStr(); var type = socket.ReadSecurityType(); var expiryDate = socket.ReadExpiry(); var strike = socket.ReadDecimal(); var optionType = socket.ReadOptionType(); var multiplier = version >= ServerVersions.V7 ? socket.ReadMultiplier() : null; var boardCode = version >= ServerVersions.V7 ? socket.ReadBoardCode() : null; var currency = socket.ReadCurrency(); var secCode = (version >= ServerVersions.V2) ? socket.ReadStr() : secName; var secClass = (version >= ServerVersions.V8) ? socket.ReadStr() : null; var position = socket.ReadDecimal(); var marketPrice = socket.ReadDecimal(); var marketValue = socket.ReadDecimal(); var averagePrice = 0m; var unrealizedPnL = 0m; var realizedPnL = 0m; if (version >= ServerVersions.V3) { averagePrice = socket.ReadDecimal(); unrealizedPnL = socket.ReadDecimal(); realizedPnL = socket.ReadDecimal(); } var portfolio = version >= ServerVersions.V4 ? socket.ReadStr() : null; if (version == ServerVersions.V6 && socket.ServerVersion == ServerVersions.V39) boardCode = socket.ReadBoardCode(); var secId = new SecurityId { SecurityCode = secCode, BoardCode = GetBoardCode(boardCode), InteractiveBrokers = contractId, }; SendOutMessage(new SecurityMessage { SecurityId = secId, Name = secName, SecurityType = type, ExpiryDate = expiryDate, Strike = strike, OptionType = optionType, Currency = currency, Multiplier = multiplier ?? 0, Class = secClass }); if (portfolio.IsEmpty()) return; SendOutMessage( this .CreatePositionChangeMessage(portfolio, secId) .Add(PositionChangeTypes.CurrentValue, position) .Add(PositionChangeTypes.CurrentPrice, marketPrice) .Add(PositionChangeTypes.AveragePrice, averagePrice) .Add(PositionChangeTypes.UnrealizedPnL, unrealizedPnL) .Add(PositionChangeTypes.RealizedPnL, realizedPnL)); // TODO //pos.SetMarketValue(marketValue); }
/// <summary> /// Создать построитель стакана из лога заявок. /// </summary> /// <param name="builder">Тип построителя.</param> /// <param name="securityId">Идентификатор инструмента.</param> /// <returns>Построитель стакана из лога заявок.</returns> public static IOrderLogMarketDepthBuilder CreateBuilder(this OrderLogBuilders builder, SecurityId securityId) { switch (builder) { case OrderLogBuilders.Plaza2: return new PlazaOrderLogMarketDepthBuilder(securityId); case OrderLogBuilders.ITCH: return new ItchOrderLogMarketDepthBuilder(securityId); default: throw new ArgumentOutOfRangeException(nameof(builder), builder, null); } }
/// <summary> /// Создать <see cref="LuaFixServer"/>. /// </summary> public LuaFixServer() { _requests.Close(); _securityClassInfo.FillDefault(); _fixServer = new FixServerEx((l, p) => { if (Login.IsEmpty() || (l.CompareIgnoreCase(Login) && p == Password)) { _prevLevel1.Clear(); return(Tuple.Create(TimeSpan.FromMilliseconds(100), FixClientRoles.Admin)); } return(null); }); _fixServer.NewOutMessage += message => { _fixServer.AddDebugLog("In. {0}", message); switch (message.Type) { case MessageTypes.CandlePnF: case MessageTypes.CandleRange: case MessageTypes.CandleRenko: case MessageTypes.CandleTick: case MessageTypes.CandleTimeFrame: case MessageTypes.CandleVolume: throw new NotSupportedException(); case MessageTypes.MarketData: { var mdMsg = (MarketDataMessage)message; ProcessMarketDataMessage(mdMsg); break; } case MessageTypes.SecurityLookup: { var secMsg = (SecurityLookupMessage)message; var securityId = new SecurityId { SecurityCode = secMsg.SecurityId.SecurityCode, BoardCode = !secMsg.SecurityId.BoardCode.IsEmpty() ? _securityClassInfo.GetSecurityClass(secMsg.SecurityId) : null }; _requests.Enqueue(new LuaRequest { MessageType = MessageTypes.SecurityLookup, TransactionId = secMsg.TransactionId, SecurityId = securityId, Value = secMsg.UnderlyingSecurityCode }); break; } case MessageTypes.OrderPairReplace: case MessageTypes.Portfolio: case MessageTypes.Position: throw new NotSupportedException(); case MessageTypes.PortfolioLookup: var pfMsg = (PortfolioLookupMessage)message; _requests.Enqueue(new LuaRequest { MessageType = MessageTypes.PortfolioLookup, TransactionId = pfMsg.TransactionId }); break; case MessageTypes.OrderStatus: var statusMsg = (OrderStatusMessage)message; _requests.Enqueue(new LuaRequest { MessageType = MessageTypes.OrderStatus, TransactionId = statusMsg.TransactionId }); break; case MessageTypes.OrderRegister: case MessageTypes.OrderReplace: case MessageTypes.OrderCancel: case MessageTypes.OrderGroupCancel: var orderMsg = (OrderMessage)message; ProcessOrderMessage(orderMsg); break; default: throw new ArgumentOutOfRangeException(); } }; _fixServer.TransactionSession.TimeZone = TimeHelper.Moscow; _fixServer.MarketDataSession.TimeZone = TimeHelper.Moscow; _logManager.Application = new QuikNativeApp(); _logManager.Sources.Add(_fixServer); LogFile = "StockSharp.QuikLua.log"; }
/// <summary> /// Initialize <see cref="TradeGenerator"/>. /// </summary> /// <param name="securityId">The identifier of the instrument, for which data shall be generated.</param> protected TradeGenerator(SecurityId securityId) : base(securityId) { IdGenerator = new IncrementalIdGenerator(); }
public TradeStorage(StorageRegistry parent, Security security, SecurityId securityId, IMarketDataStorageDrive drive, IMarketDataSerializer <ExecutionMessage> serializer) : base(parent, security, securityId, ExecutionTypes.Tick, trade => trade.ServerTime, trade => trade.SecurityId, trade => trade.ServerTime.StorageTruncate(serializer.TimePrecision), serializer, drive) { }
public PositionStorage(Security security, SecurityId securityId, IMarketDataStorageDrive drive, IMarketDataSerializer <PositionChangeMessage> serializer) : base(security, securityId, null, value => value.ServerTime, value => value.SecurityId, value => value.ServerTime.StorageTruncate(serializer.TimePrecision), serializer, drive) { }
public BoardStateStorage(StorageRegistry parent, Security security, SecurityId securityId, IMarketDataSerializer <BoardStateMessage> serializer, IMarketDataStorageDrive drive) : base(parent, security, securityId, null, m => m.ServerTime, m => default, m => null, serializer, drive) { }
public QuoteBinarySerializer(SecurityId securityId, IExchangeInfoProvider exchangeInfoProvider) : base(securityId, 16 + 20 * 25, MarketDataVersions.Version55, exchangeInfoProvider) { }
/// <summary> /// Initialize a new message <see cref="SecurityMessage"/> and pass it to the method <see cref="SendOutMessage"/>. /// </summary> /// <param name="securityId">Security ID.</param> protected void SendOutSecurityMessage(SecurityId securityId) { SendOutMessage(new SecurityMessage { SecurityId = securityId }); }
/// <summary> /// Создать <see cref="TrendMarketDepthGenerator"/>. /// </summary> /// <param name="securityId">Идентификатор инструмента, для которого необходимо генерировать данные.</param> public TrendMarketDepthGenerator(SecurityId securityId) : base(securityId) { Interval = TimeSpan.FromMilliseconds(50); }
private void ProcessSuspendedSecurityMessages(SecurityId securityId) { var noNativeId = securityId.Native == null ? (SecurityId?)null : securityId; if (noNativeId != null) { var t = noNativeId.Value; t.Native = null; noNativeId = t; } List <Message> msgs = null; lock (_syncRoot) { var tuple = _suspendedOutMessages.TryGetValue(securityId); if (tuple != null) { msgs = GetMessages(tuple); _suspendedOutMessages.Remove(securityId); } if (noNativeId != null) { tuple = _suspendedOutMessages.TryGetValue(noNativeId.Value); if (tuple != null) { if (msgs == null) { msgs = GetMessages(tuple); } else { msgs.AddRange(GetMessages(tuple)); } _suspendedOutMessages.Remove(noNativeId.Value); } } // find association by code and code + type var pair = _suspendedOutMessages .FirstOrDefault(p => p.Key.SecurityCode.CompareIgnoreCase(securityId.SecurityCode) && p.Key.BoardCode.IsEmpty() && (securityId.SecurityType == null || p.Key.SecurityType == securityId.SecurityType)); var value = pair.Value; if (value != null) { _suspendedOutMessages.Remove(pair.Key); if (msgs == null) { msgs = GetMessages(value); } else { msgs.AddRange(GetMessages(value)); } } var inMsgs = _suspendedInMessages.TryGetValue(securityId); if (inMsgs != null) { if (msgs == null) { msgs = inMsgs; } else { msgs.AddRange(inMsgs); } _suspendedInMessages.Remove(securityId); } if (noNativeId != null) { inMsgs = _suspendedInMessages.TryGetValue(noNativeId.Value); if (inMsgs != null) { if (msgs == null) { msgs = inMsgs; } else { msgs.AddRange(inMsgs); } _suspendedInMessages.Remove(noNativeId.Value); } } } if (msgs == null) { return; } // external code shouldn't receive native ids securityId.Native = null; foreach (var msg in msgs) { msg.ReplaceSecurityId(securityId); base.OnInnerAdapterNewOutMessage(msg); } }
/// <inheritdoc /> public abstract IMarketDataStorageDrive GetStorageDrive(SecurityId securityId, Type dataType, object arg, StorageFormats format);
/// <summary> /// Создать хранилище для <see cref="IMarketDataStorage"/>. /// </summary> /// <param name="securityId">Идентификатор инструмента.</param> /// <param name="dataType">Тип маркет-данных.</param> /// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="CandleMessage.Arg"/>.</param> /// <param name="format">Тип формата.</param> /// <returns>Хранилище для <see cref="IMarketDataStorage"/>.</returns> public override IMarketDataStorageDrive GetStorageDrive(SecurityId securityId, Type dataType, object arg, StorageFormats format) { if (securityId.IsDefault()) throw new ArgumentNullException("securityId"); return _drives.SafeAdd(Tuple.Create(securityId, dataType, arg, format), key => new LocalMarketDataStorageDrive(CreateFileName(dataType, arg), GetSecurityPath(securityId), format, this)); }
/// <summary> /// Create market depth builder. /// </summary> /// <param name="securityId">Security ID.</param> /// <returns>Order log to market depth builder.</returns> public override IOrderLogMarketDepthBuilder CreateOrderLogMarketDepthBuilder(SecurityId securityId) { return(OrderLogMarketDepthBuilders[securityId]); }
public void CreateSecurityAggregate(SecurityId securityId) { Apply(new SecurityAggregateCreated(securityId)); }
private SecurityId GetSecurityId(SecurityId securityId) { return(InnerAdapter.IsSecurityRequired(DataType.OrderLog) ? securityId : default);
private static Transaction SetOtherSecurity(this Transaction transaction, SecurityId securityId, IDictionary<string, RefPair<SecurityTypes, string>> securityClassInfo) { var secClass = securityClassInfo.GetSecurityClass(securityId); return transaction.SetOtherSecurity(securityId.SecurityCode, secClass); }
private Level1DepthBuilder GetBuilder(SecurityId securityId) { return(_level1DepthBuilders.SafeAdd(securityId, c => new Level1DepthBuilder(c))); }
/// <summary> /// Initializes a new instance of the <see cref="RandomWalkTradeGenerator"/>. /// </summary> /// <param name="securityId">The identifier of the instrument, for which data shall be generated.</param> public RandomWalkTradeGenerator(SecurityId securityId) : base(securityId) { Interval = TimeSpan.FromMilliseconds(50); }
public Level1DepthBuilder(SecurityId securityId) { _securityId = securityId; }
/// <summary> /// Create market depth builder. /// </summary> /// <param name="securityId">Security ID.</param> /// <returns>Order log to market depth builder.</returns> public virtual IOrderLogMarketDepthBuilder CreateOrderLogMarketDepthBuilder(SecurityId securityId) { throw new NotSupportedException(); }
public BookInfo(SecurityId securityId, ILogReceiver logs) => Builder = new OrderBookIncrementBuilder(securityId, logs);
private static Level1ChangeMessage ToLevel1(string str, SecurityId securityId) { var parts = str.SplitByComma(); return new Level1ChangeMessage { SecurityId = securityId, ServerTime = parts[0].ToDateTime("yyyy-MM-dd HH:mm:ss.fff").ApplyTimeZone(TimeHelper.Est), } .TryAdd(Level1Fields.LastTradeId, parts[6].IsEmpty() ? 0 : parts[6].To<long>()) .TryAdd(Level1Fields.LastTradePrice, parts[1].To<decimal?>()) .TryAdd(Level1Fields.LastTradeVolume, parts[2].To<decimal?>()) .TryAdd(Level1Fields.BestBidPrice, parts[4].To<decimal?>()) .TryAdd(Level1Fields.BestAskPrice, parts[5].To<decimal?>()); }
private bool SecurityIdEqual(SecurityId securityId) { return(securityId.SecurityCode.CompareIgnoreCase(SecurityId.SecurityCode) && securityId.BoardCode.CompareIgnoreCase(SecurityId.BoardCode)); }
/// <summary> /// Создать <see cref="LuaFixServer"/>. /// </summary> public LuaFixServer() { _requests.Close(); _securityClassInfo.FillDefault(); _fixServer = new FixServerEx((l, p) => { if (Login.IsEmpty() || (l.CompareIgnoreCase(Login) && p == Password)) { _prevLevel1.Clear(); return Tuple.Create(TimeSpan.FromMilliseconds(100), FixClientRoles.Admin); } return null; }); _fixServer.NewOutMessage += message => { _fixServer.AddDebugLog("In. {0}", message); switch (message.Type) { case MessageTypes.CandlePnF: case MessageTypes.CandleRange: case MessageTypes.CandleRenko: case MessageTypes.CandleTick: case MessageTypes.CandleTimeFrame: case MessageTypes.CandleVolume: throw new NotSupportedException(); case MessageTypes.MarketData: { var mdMsg = (MarketDataMessage)message; ProcessMarketDataMessage(mdMsg); break; } case MessageTypes.SecurityLookup: { var secMsg = (SecurityLookupMessage)message; var securityId = new SecurityId { SecurityCode = secMsg.SecurityId.SecurityCode, BoardCode = !secMsg.SecurityId.BoardCode.IsEmpty() ? _securityClassInfo.GetSecurityClass(secMsg.SecurityId) : null }; _requests.Enqueue(new LuaRequest { MessageType = MessageTypes.SecurityLookup, TransactionId = secMsg.TransactionId, SecurityId = securityId, Value = secMsg.UnderlyingSecurityCode }); break; } case MessageTypes.OrderPairReplace: case MessageTypes.Portfolio: case MessageTypes.Position: throw new NotSupportedException(); case MessageTypes.PortfolioLookup: var pfMsg = (PortfolioLookupMessage)message; _requests.Enqueue(new LuaRequest { MessageType = MessageTypes.PortfolioLookup, TransactionId = pfMsg.TransactionId }); break; case MessageTypes.OrderStatus: var statusMsg = (OrderStatusMessage)message; _requests.Enqueue(new LuaRequest { MessageType = MessageTypes.OrderStatus, TransactionId = statusMsg.TransactionId }); break; case MessageTypes.OrderRegister: case MessageTypes.OrderReplace: case MessageTypes.OrderCancel: case MessageTypes.OrderGroupCancel: var orderMsg = (OrderMessage)message; ProcessOrderMessage(orderMsg); break; default: throw new ArgumentOutOfRangeException(); } }; _fixServer.TransactionSession.TimeZone = TimeHelper.Moscow; _logManager.Application = new QuikNativeApp(); _logManager.Sources.Add(_fixServer); LogFile = "StockSharp.QuikLua.log"; }
/// <summary> /// Update filter with new subscription. /// </summary> /// <param name="securityId">Security ID.</param> /// <param name="dataType">Data type info.</param> /// <returns>If subscription was just created, return <see langword="true" />, otherwise <see langword="false" />.</returns> public bool Subscribe(SecurityId securityId, DataType dataType) { return(_subscriptions.TryAdd(Tuple.Create(securityId, dataType))); }
private void ReplaceSecurityId(SecurityId securityId, Action<SecurityId> setSecurityId) { if (setSecurityId == null) throw new ArgumentNullException(nameof(setSecurityId)); ReplaceBoardCode(securityId.BoardCode, boardCode => setSecurityId(new SecurityId { SecurityCode = securityId.SecurityCode, BoardCode = boardCode })); }
/// <summary> /// Update filter with remove a subscription. /// </summary> /// <param name="securityId">Security ID.</param> /// <param name="dataType">Data type info.</param> /// <returns>If subscription was just removed, return <see langword="true" />, otherwise <see langword="false" />.</returns> public bool UnSubscribe(SecurityId securityId, DataType dataType) { return(_subscriptions.Remove(Tuple.Create(securityId, dataType))); }
private void ReadPosition(IBSocket socket, ServerVersions version) { var account = socket.ReadStr(); var contractId = socket.ReadInt(); var secName = socket.ReadStr(); var type = socket.ReadSecurityType(); var expiryDate = socket.ReadExpiry(); var strike = socket.ReadDecimal(); var optionType = socket.ReadOptionType(); var multiplier = socket.ReadMultiplier(); var boardCode = socket.ReadBoardCode(); var currency = socket.ReadCurrency(); var secCode = socket.ReadLocalCode(secName); var secClass = (version >= ServerVersions.V2) ? socket.ReadStr() : null; var pos = socket.ReadDecimal(); var avgCost = 0m; if (version >= ServerVersions.V3) avgCost = socket.ReadDecimal(); var secId = new SecurityId { SecurityCode = secCode, BoardCode = GetBoardCode(boardCode), InteractiveBrokers = contractId, }; SendOutMessage(new SecurityMessage { SecurityId = secId, Name = secName, SecurityType = type, ExpiryDate = expiryDate, Strike = strike, OptionType = optionType, Currency = currency, Multiplier = multiplier ?? 0, Class = secClass }); SendOutMessage(this .CreatePositionChangeMessage(account, secId) .Add(PositionChangeTypes.CurrentValue, pos) .Add(PositionChangeTypes.AveragePrice, avgCost)); }
private bool CanStore <TMessage>(SecurityId securityId, object arg = null) where TMessage : Message { return(CanStore(securityId, typeof(TMessage), arg)); }
private void ReadOpenOrder(IBSocket socket, ServerVersions version) { var transactionId = socket.ReadInt(); var contractId = version >= ServerVersions.V17 ? socket.ReadInt() : -1; var secCode = socket.ReadStr(); var type = socket.ReadSecurityType(); var expiryDate = socket.ReadExpiry(); var strike = socket.ReadDecimal(); var optionType = socket.ReadOptionType(); var multiplier = version >= ServerVersions.V32 ? socket.ReadMultiplier() : null; var boardCode = socket.ReadBoardCode(); var currency = socket.ReadCurrency(); secCode = version >= ServerVersions.V2 ? socket.ReadLocalCode(secCode) : null; var secClass = (version >= ServerVersions.V32) ? socket.ReadStr() : null; var ibCon = new IBOrderCondition(); // read order fields var direction = socket.ReadOrderSide(); var volume = socket.ReadDecimal(); OrderTypes orderType; IBOrderCondition.ExtendedOrderTypes? extendedType; socket.ReadOrderType(out orderType, out extendedType); ibCon.ExtendedType = extendedType; var price = socket.ReadDecimal(); ibCon.StopPrice = socket.ReadDecimal(); var expiration = socket.ReadStr(); ibCon.Oca.Group = socket.ReadStr(); var portfolio = socket.ReadStr(); ibCon.IsOpenOrClose = socket.ReadStr() == "O"; ibCon.Origin = (IBOrderCondition.OrderOrigins)socket.ReadInt(); var comment = socket.ReadStr(); var clientId = version >= ServerVersions.V3 ? socket.ReadInt() : (int?)null; int? permId = null; if (version >= ServerVersions.V4) { permId = socket.ReadInt(); if (version < ServerVersions.V18) { // will never happen /* order.m_ignoreRth = */ socket.ReadBool(); } else ibCon.OutsideRth = socket.ReadBool(); ibCon.Hidden = socket.ReadBool(); ibCon.SmartRouting.DiscretionaryAmount = socket.ReadDecimal(); } if (version >= ServerVersions.V5) ibCon.GoodAfterTime = socket.ReadNullDateTime(IBSocketHelper.TimeFormat); if (version >= ServerVersions.V6) { // skip deprecated sharesAllocation field socket.ReadStr(); } if (version >= ServerVersions.V7) { ibCon.FinancialAdvisor.Group = socket.ReadStr(); ibCon.FinancialAdvisor.Allocation = socket.ReadFinancialAdvisor(); ibCon.FinancialAdvisor.Percentage = socket.ReadStr(); ibCon.FinancialAdvisor.Profile = socket.ReadStr(); } var orderExpiryDate = version >= ServerVersions.V8 ? socket.ReadNullDateTime(IBSocketHelper.TimeFormat) : null; var visibleVolume = volume; if (version >= ServerVersions.V9) { ibCon.Agent = socket.ReadAgent(); ibCon.PercentOffset = socket.ReadDecimal(); ibCon.Clearing.SettlingFirm = socket.ReadStr(); ibCon.ShortSale.Slot = (IBOrderCondition.ShortSaleSlots)socket.ReadInt(); ibCon.ShortSale.Location = socket.ReadStr(); if (socket.ServerVersion == ServerVersions.V51) socket.ReadInt(); //exempt code else if (version >= ServerVersions.V23) ibCon.ShortSale.ExemptCode = socket.ReadInt(); ibCon.AuctionStrategy = (IBOrderCondition.AuctionStrategies)socket.ReadInt(); ibCon.StartingPrice = socket.ReadDecimal(); ibCon.StockRefPrice = socket.ReadDecimal(); ibCon.Delta = socket.ReadDecimal(); ibCon.StockRangeLower = socket.ReadDecimal(); ibCon.StockRangeUpper = socket.ReadDecimal(); visibleVolume = socket.ReadInt(); if (version < ServerVersions.V18) { // will never happen /* order.m_rthOnly = */ socket.ReadBool(); } ibCon.BlockOrder = socket.ReadBool(); ibCon.SweepToFill = socket.ReadBool(); ibCon.AllOrNone = socket.ReadBool(); ibCon.MinVolume = socket.ReadInt(); ibCon.Oca.Type = (IBOrderCondition.OcaTypes)socket.ReadInt(); ibCon.SmartRouting.ETradeOnly = socket.ReadBool(); ibCon.SmartRouting.FirmQuoteOnly = socket.ReadBool(); ibCon.SmartRouting.NbboPriceCap = socket.ReadDecimal(); } if (version >= ServerVersions.V10) { ibCon.ParentId = socket.ReadInt(); ibCon.TriggerMethod = (IBOrderCondition.TriggerMethods)socket.ReadInt(); } if (version >= ServerVersions.V11) { ibCon.Volatility.Volatility = socket.ReadDecimal(); ibCon.Volatility.VolatilityTimeFrame = socket.ReadVolatilityType(); if (version == ServerVersions.V11) { if (!socket.ReadBool()) ibCon.Volatility.ExtendedOrderType = IBOrderCondition.ExtendedOrderTypes.Empty; else ibCon.Volatility.OrderType = OrderTypes.Market; } else { OrderTypes volOrdertype; IBOrderCondition.ExtendedOrderTypes? volExtendedType; socket.ReadOrderType(out volOrdertype, out volExtendedType); ibCon.Volatility.OrderType = volOrdertype; ibCon.Volatility.ExtendedOrderType = volExtendedType; ibCon.Volatility.StopPrice = socket.ReadDecimal(); if (volExtendedType != IBOrderCondition.ExtendedOrderTypes.Empty) { if (version >= ServerVersions.V27) { ibCon.Volatility.ConId = socket.ReadInt(); ibCon.Volatility.SettlingFirm = socket.ReadStr(); var portfolioName = socket.ReadStr(); if (!portfolioName.IsEmpty()) ibCon.Volatility.ClearingPortfolio = portfolioName; ibCon.Volatility.ClearingIntent = socket.ReadStr(); } if (version >= ServerVersions.V31) { var isOpenOrCloseStr = socket.ReadStr(); ibCon.Volatility.ShortSale.IsOpenOrClose = isOpenOrCloseStr == "?" ? (bool?)null : isOpenOrCloseStr.To<int>() == 1; ibCon.Volatility.IsShortSale = socket.ReadBool(); ibCon.Volatility.ShortSale.Slot = (IBOrderCondition.ShortSaleSlots)socket.ReadInt(); ibCon.Volatility.ShortSale.Location = socket.ReadStr(); } } } ibCon.Volatility.ContinuousUpdate = socket.ReadBool(); if (socket.ServerVersion == ServerVersions.V26) { ibCon.StockRangeLower = socket.ReadDecimal(); ibCon.StockRangeUpper = socket.ReadDecimal(); } ibCon.Volatility.IsAverageBestPrice = socket.ReadBool(); } if (version >= ServerVersions.V13) ibCon.TrailStopPrice = socket.ReadDecimal(); if (version >= ServerVersions.V30) ibCon.TrailStopVolumePercentage = socket.ReadNullDecimal(); if (version >= ServerVersions.V14) { ibCon.Combo.BasisPoints = socket.ReadDecimal(); ibCon.Combo.BasisPointsType = socket.ReadInt(); ibCon.Combo.LegsDescription = socket.ReadStr(); } if (version >= ServerVersions.V29) { var comboLegsCount = socket.ReadInt(); if (comboLegsCount > 0) { //contract.m_comboLegs = new Vector(comboLegsCount); for (var i = 0; i < comboLegsCount; ++i) { //int conId = socket.ReadInt(); //int ratio = socket.ReadInt(); //String action = socket.ReadStr(); //String exchange = socket.ReadStr(); //int openClose = socket.ReadInt(); //int shortSaleSlot = socket.ReadInt(); //String designatedLocation = socket.ReadStr(); //int exemptCode = socket.ReadInt(); //ComboLeg comboLeg = new ComboLeg(conId, ratio, action, exchange, openClose, // shortSaleSlot, designatedLocation, exemptCode); //contract.m_comboLegs.add(comboLeg); } } var orderComboLegsCount = socket.ReadInt(); if (orderComboLegsCount > 0) { //order.m_orderComboLegs = new Vector(orderComboLegsCount); for (var i = 0; i < orderComboLegsCount; ++i) { //var comboPrice = socket.ReadNullDecimal(); //OrderComboLeg orderComboLeg = new OrderComboLeg(comboPrice); //order.m_orderComboLegs.add(orderComboLeg); } } } if (version >= ServerVersions.V26) { var smartComboRoutingParamsCount = socket.ReadInt(); if (smartComboRoutingParamsCount > 0) { var @params = new List<Tuple<string, string>>(); for (var i = 0; i < smartComboRoutingParamsCount; ++i) @params.Add(Tuple.Create(socket.ReadStr(), socket.ReadStr())); ibCon.SmartRouting.ComboParams = @params; } } if (version >= ServerVersions.V15) { if (version >= ServerVersions.V20) { ibCon.Scale.InitLevelSize = socket.ReadNullInt(); ibCon.Scale.SubsLevelSize = socket.ReadNullInt(); } else { /* int notSuppScaleNumComponents = */ socket.ReadNullInt(); ibCon.Scale.InitLevelSize = socket.ReadNullInt(); } ibCon.Scale.PriceIncrement = socket.ReadNullDecimal(); } if (version >= ServerVersions.V28 && ibCon.Scale.PriceIncrement > 0) { ibCon.Scale.PriceAdjustValue = socket.ReadNullDecimal(); ibCon.Scale.PriceAdjustInterval = socket.ReadInt(); ibCon.Scale.ProfitOffset = socket.ReadNullDecimal(); ibCon.Scale.AutoReset = socket.ReadBool(); ibCon.Scale.InitPosition = socket.ReadNullInt(); ibCon.Scale.InitFillQty = socket.ReadNullInt(); ibCon.Scale.RandomPercent = socket.ReadBool(); } if (version >= ServerVersions.V24) socket.ReadHedge(ibCon); if (version >= ServerVersions.V25) ibCon.SmartRouting.OptOutSmartRouting = socket.ReadBool(); if (version >= ServerVersions.V19) { var portfolioName = socket.ReadStr(); if (!portfolioName.IsEmpty()) ibCon.Clearing.ClearingPortfolio = portfolioName; ibCon.Clearing.Intent = socket.ReadIntent(); } if (version >= ServerVersions.V22) ibCon.SmartRouting.NotHeld = socket.ReadBool(); if (version >= ServerVersions.V20) { if (socket.ReadBool()) { //UnderlyingComponent underComp = new UnderlyingComponent(); //underComp.ContractId = socket.ReadInt(); //underComp.Delta = socket.ReadDecimal(); //underComp.Price = socket.ReadDecimal(); //contract.UnderlyingComponent = underComp; } } if (version >= ServerVersions.V21) { ibCon.Algo.Strategy = socket.ReadStr(); if (!ibCon.Algo.Strategy.IsEmpty()) { var algoParamsCount = socket.ReadInt(); if (algoParamsCount > 0) { var algoParams = new List<Tuple<string, string>>(); for (var i = 0; i < algoParamsCount; i++) algoParams.Add(Tuple.Create(socket.ReadStr(), socket.ReadStr())); ibCon.Algo.Params = algoParams; } } } //OrderState orderState = new OrderState(); OrderStatus? status = null; if (version >= ServerVersions.V16) { socket.ReadStr(); //order.WhatIf = !(string.IsNullOrEmpty(rstr) || rstr == "0"); status = socket.ReadOrderStatus(); //orderState.InitMargin = socket.ReadStr(); //orderState.MaintMargin = socket.ReadStr(); //orderState.EquityWithLoan = socket.ReadStr(); //orderState.IbCommission = socket.ReadNullDecimal(); //orderState.MinCommission = socket.ReadNullDecimal(); //orderState.MaxCommission = socket.ReadNullDecimal(); //orderState.CommissionCurrency = socket.ReadStr(); //orderState.WarningText = socket.ReadStr(); } var secId = new SecurityId { SecurityCode = secCode, BoardCode = GetBoardCode(boardCode), InteractiveBrokers = contractId, }; SendOutMessage(new SecurityMessage { SecurityId = secId, ExpiryDate = expiryDate, Strike = strike, OptionType = optionType, Class = secClass, SecurityType = type, Currency = currency, Multiplier = multiplier ?? 0, }); var orderMsg = new ExecutionMessage { ExecutionType = ExecutionTypes.Transaction, SecurityId = secId, OriginalTransactionId = transactionId, OrderType = orderType, Side = direction, OrderVolume = volume, OrderPrice = price, Condition = ibCon, ExpiryDate = orderExpiryDate, VisibleVolume = visibleVolume, PortfolioName = portfolio, Comment = comment, OrderStatus = status, OrderState = status?.ToOrderState(), HasOrderInfo = true, }; if (orderMsg.OrderState == OrderStates.Active || orderMsg.OrderState == OrderStates.Done) orderMsg.OrderId = transactionId; switch (expiration) { case "DAY": orderMsg.TimeInForce = TimeInForce.PutInQueue; break; case "GTC": //orderMsg.ExpiryDate = DateTimeOffset.MaxValue; break; case "IOC": orderMsg.TimeInForce = TimeInForce.CancelBalance; break; case "FOK": orderMsg.TimeInForce = TimeInForce.MatchOrCancel; break; case "GTD": break; case "OPG": ibCon.IsMarketOnOpen = true; break; default: throw new InvalidOperationException(LocalizedStrings.Str2515Params.Put(expiration)); } if (clientId != null) orderMsg.SetClientId(clientId.Value); if (permId != null) orderMsg.SetPermId(permId.Value); SendOutMessage(orderMsg); }
protected CandleMessageStorage(Security security, SecurityId securityId, object arg, IMarketDataStorageDrive drive, IMarketDataSerializer <TCandleMessage> serializer) : base(security, securityId, arg, candle => candle.OpenTime, candle => candle.SecurityId, candle => candle.OpenTime.StorageTruncate(serializer.TimePrecision), serializer, drive) { _serializer = new CandleSerializer(Serializer); }