Example #1
0
        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));
        }
Example #2
0
 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;
		}
Example #5
0
			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 });
			}
Example #6
0
		/// <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();
		}
Example #7
0
		/// <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 });
		}
Example #13
0
		/// <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)
			});
		}
Example #14
0
        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);
                }
            }
        }
Example #15
0
		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;
		}
Example #16
0
 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;
 }
Example #17
0
 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;
 }
Example #18
0
 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;
Example #20
0
        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)
 {
 }
Example #23
0
 private IMarketDataStorage <TMessage> GetStorage <TMessage>(SecurityId securityId, object arg)
     where TMessage : Message
 {
     return((IMarketDataStorage <TMessage>)GetStorage(securityId, typeof(TMessage), arg));
 }
Example #24
0
        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);
                }
            }
        }
Example #25
0
        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);
            }
        }
Example #26
0
        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);
		}
Example #30
0
		/// <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);
			}
		}
Example #31
0
        /// <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";
        }
Example #32
0
		/// <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();
		}
Example #33
0
 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)
 {
 }
Example #34
0
 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)
 {
 }
Example #35
0
 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)
 {
 }
Example #36
0
 public QuoteBinarySerializer(SecurityId securityId, IExchangeInfoProvider exchangeInfoProvider)
     : base(securityId, 16 + 20 * 25, MarketDataVersions.Version55, exchangeInfoProvider)
 {
 }
Example #37
0
		/// <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 });
		}
Example #38
0
 /// <summary>
 /// Создать <see cref="TrendMarketDepthGenerator"/>.
 /// </summary>
 /// <param name="securityId">Идентификатор инструмента, для которого необходимо генерировать данные.</param>
 public TrendMarketDepthGenerator(SecurityId securityId)
     : base(securityId)
 {
     Interval = TimeSpan.FromMilliseconds(50);
 }
Example #39
0
        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));
		}
Example #42
0
 /// <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));
 }
Example #44
0
 private SecurityId GetSecurityId(SecurityId securityId)
 {
     return(InnerAdapter.IsSecurityRequired(DataType.OrderLog)
                         ? securityId
                         : default);
Example #45
0
		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)));
 }
Example #47
0
		/// <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;
 }
Example #49
0
		/// <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();
		}
Example #50
0
 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?>());
		}
Example #52
0
 private bool SecurityIdEqual(SecurityId securityId)
 {
     return(securityId.SecurityCode.CompareIgnoreCase(SecurityId.SecurityCode) && securityId.BoardCode.CompareIgnoreCase(SecurityId.BoardCode));
 }
Example #53
0
		/// <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)));
 }
Example #55
0
		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);
		}
Example #60
0
 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);
 }