Ejemplo n.º 1
0
        private void OnLoad()
        {
            try
            {
                var loadDate = StartDate;

                var messageTypes = new[] { MessageTypes.Time, ExtendedMessageTypes.Clearing };

                while (loadDate.Date <= StopDate.Date && !_disconnecting)
                {
                    if (Boards.Any(b => b.IsTradeDate(loadDate, true)))
                    {
                        this.AddInfoLog("Loading {0} Events: {1}", loadDate.Date, LoadedMessageCount);

                        var enumerator = BasketStorage.Load(loadDate.Date);

                        // хранилище за указанную дату содержит только время и клиринг
                        var noData = !enumerator.DataTypes.Except(messageTypes).Any();

                        if (noData)
                        {
                            SendOutMessages(loadDate, GetSimpleTimeLine(loadDate).GetEnumerator());
                        }
                        else
                        {
                            SendOutMessages(loadDate, enumerator);
                        }
                    }

                    loadDate = loadDate.Date.AddDays(1);
                }

                SendOutMessage(new LastMessage {
                    LocalTime = StopDate.LocalDateTime
                });
            }
            catch (Exception ex)
            {
                SendOutError(ex);
                SendOutMessage(new LastMessage {
                    IsError = true
                });
            }

            if (_disconnecting)
            {
                SendOutMessage(new DisconnectMessage());
            }

            _disconnecting = false;

            if (_loadingThread == null)
            {
                SendOutMessage(new ResetMessage());
            }

            _loadingThread = null;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Send next outgoing message.
        /// </summary>
        /// <returns><see langword="true" />, if message was sent, otherwise, <see langword="false" />.</returns>
        public bool SendOutMessage()
        {
            if (!_isStarted || _isSuspended)
            {
                return(false);
            }

            if (!BasketStorage.MoveNext())
            {
                return(false);
            }

            var msg = BasketStorage.Current;

            SendOutMessage(msg);

            return(true);
        }
Ejemplo n.º 3
0
        private void OnLoad()
        {
            try
            {
                var loadDate = StartDate;

                var messageTypes = new[] { MessageTypes.Time, ExtendedMessageTypes.Clearing };

                BasketStorage.InnerStorages.Add(new InMemoryMarketDataStorage <TimeMessage>(null, null, GetTimeLine));

                while (loadDate.Date <= StopDate.Date && !_disconnecting)
                {
                    if (Boards.Any(b => b.IsTradeDate(loadDate, true)))
                    {
                        this.AddInfoLog("Loading {0} Events: {1}", loadDate.Date, LoadedMessageCount);

                        using (var enumerator = BasketStorage.Load(loadDate.UtcDateTime.Date))
                        {
                            // storage for the specified date contains only time messages and clearing events
                            var noData = !enumerator.DataTypes.Except(messageTypes).Any();

                            if (noData)
                            {
                                SendOutMessages(loadDate, GetSimpleTimeLine(loadDate).GetEnumerator());
                            }
                            else
                            {
                                SendOutMessages(loadDate, enumerator);
                            }
                        }
                    }

                    loadDate = loadDate.Date.AddDays(1).ApplyTimeZone(loadDate.Offset);
                }

                SendOutMessage(new LastMessage {
                    LocalTime = StopDate.LocalDateTime
                });
            }
            catch (Exception ex)
            {
                SendOutError(ex);
                SendOutMessage(new LastMessage {
                    IsError = true
                });
            }

            if (_disconnecting)
            {
                SendOutMessage(new DisconnectMessage());
            }

            _disconnecting = false;

            if (_loadingThread == null)
            {
                SendOutMessage(new ResetMessage());
            }

            _loadingThread = null;
            BasketStorage.InnerStorages.Clear();
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Release resources.
        /// </summary>
        protected override void DisposeManaged()
        {
            BasketStorage.Dispose();

            base.DisposeManaged();
        }
Ejemplo n.º 5
0
        private void ProcessMarketDataMessage(MarketDataMessage message)
        {
            var securityId = message.SecurityId;
            var security   = SecurityProvider.LookupById(securityId.ToStringId());

            if (security == null)
            {
                RaiseMarketDataMessage(message, new InvalidOperationException(LocalizedStrings.Str704Params.Put(securityId)));
                return;
            }

            if (StorageRegistry == null)
            {
                RaiseMarketDataMessage(message, new InvalidOperationException(LocalizedStrings.Str1117Params.Put(message.DataType, securityId)));
                return;
            }

            var history = message as HistorySourceMessage;

            Exception error = null;

            switch (message.DataType)
            {
            case MarketDataTypes.Level1:
            {
                if (message.IsSubscribe)
                {
                    if (history == null)
                    {
                        BasketStorage.AddStorage(StorageRegistry.GetLevel1MessageStorage(security, Drive, StorageFormat));

                        BasketStorage.AddStorage(new InMemoryMarketDataStorage <ClearingMessage>(security, null, date => new[]
                            {
                                new ClearingMessage
                                {
                                    LocalTime        = date.Date + security.Board.ExpiryTime,
                                    SecurityId       = securityId,
                                    ClearMarketDepth = true
                                }
                            }));
                    }
                    else
                    {
                        BasketStorage.AddStorage(new InMemoryMarketDataStorage <Level1ChangeMessage>(security, null, history.GetMessages));
                    }
                }
                else
                {
                    BasketStorage.RemoveStorage <IMarketDataStorage <Level1ChangeMessage> >(security, MessageTypes.Level1Change, null);
                    BasketStorage.RemoveStorage <InMemoryMarketDataStorage <ClearingMessage> >(security, ExtendedMessageTypes.Clearing, null);
                }

                break;
            }

            case MarketDataTypes.MarketDepth:
            {
                if (message.IsSubscribe)
                {
                    BasketStorage.AddStorage(history == null
                                                        ? StorageRegistry.GetQuoteMessageStorage(security, Drive, StorageFormat)
                                                        : new InMemoryMarketDataStorage <QuoteChangeMessage>(security, null, history.GetMessages));
                }
                else
                {
                    BasketStorage.RemoveStorage <IMarketDataStorage <QuoteChangeMessage> >(security, MessageTypes.QuoteChange, null);
                }

                break;
            }

            case MarketDataTypes.Trades:
            {
                if (message.IsSubscribe)
                {
                    BasketStorage.AddStorage(history == null
                                                        ? StorageRegistry.GetTickMessageStorage(security, Drive, StorageFormat)
                                                        : new InMemoryMarketDataStorage <ExecutionMessage>(security, null, history.GetMessages));
                }
                else
                {
                    BasketStorage.RemoveStorage <IMarketDataStorage <ExecutionMessage> >(security, MessageTypes.Execution, ExecutionTypes.Tick);
                }

                break;
            }

            case MarketDataTypes.OrderLog:
            {
                if (message.IsSubscribe)
                {
                    BasketStorage.AddStorage(history == null
                                                        ? StorageRegistry.GetOrderLogMessageStorage(security, Drive, StorageFormat)
                                                        : new InMemoryMarketDataStorage <ExecutionMessage>(security, null, history.GetMessages));
                }
                else
                {
                    BasketStorage.RemoveStorage <IMarketDataStorage <ExecutionMessage> >(security, MessageTypes.Execution, ExecutionTypes.OrderLog);
                }

                break;
            }

            case MarketDataTypes.CandleTimeFrame:
            case MarketDataTypes.CandleTick:
            case MarketDataTypes.CandleVolume:
            case MarketDataTypes.CandleRange:
            case MarketDataTypes.CandlePnF:
            case MarketDataTypes.CandleRenko:
            {
                var msgType = message.DataType.ToCandleMessageType();

                if (message.IsSubscribe)
                {
                    var candleType = message.DataType.ToCandleMessage();

                    BasketStorage.AddStorage(history == null
                                                        ? StorageRegistry.GetCandleMessageStorage(candleType, security, message.Arg, Drive, StorageFormat)
                                                        : new InMemoryMarketDataStorage <CandleMessage>(security, message.Arg, history.GetMessages, candleType));
                }
                else
                {
                    BasketStorage.RemoveStorage <IMarketDataStorage <CandleMessage> >(security, msgType, message.Arg);
                }

                break;
            }

            default:
                error = new InvalidOperationException(LocalizedStrings.Str1118Params.Put(message.DataType));
                break;
            }

            RaiseMarketDataMessage(message, error);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Send message.
        /// </summary>
        /// <param name="message">Message.</param>
        protected override void OnSendInMessage(Message message)
        {
            switch (message.Type)
            {
            case MessageTypes.Reset:
            {
                _isSuspended = false;
                _currentTime = default(DateTimeOffset);
                BasketStorage.Reset();

                LoadedMessageCount = 0;

                if (!_isStarted)
                {
                    SendOutMessage(new ResetMessage());
                }

                break;
            }

            case MessageTypes.Connect:
            {
                if (_isStarted)
                {
                    throw new InvalidOperationException(LocalizedStrings.Str1116);
                }

                SendOutMessage(new ConnectMessage {
                        LocalTime = StartDate
                    });
                return;
            }

            case MessageTypes.Disconnect:
            {
                _isSuspended = false;

                if (_isStarted)
                {
                    SendOutMessage(new LastMessage {
                            LocalTime = StopDate
                        });
                }

                SendOutMessage(new DisconnectMessage {
                        LocalTime = StopDate
                    });
                //SendOutMessage(new ResetMessage());

                BasketStorage.Reset();
                _isStarted = false;
                return;
            }

            case MessageTypes.SecurityLookup:
            {
                var lookupMsg = (SecurityLookupMessage)message;

                var securities = lookupMsg.SecurityId.IsDefault()
                                                        ? SecurityProvider.LookupAll()
                                                        : SecurityProvider.Lookup(lookupMsg.ToSecurity());

                securities.ForEach(security =>
                    {
                        SendOutMessage(security.Board.ToMessage());

                        var secMsg = security.ToMessage();
                        secMsg.OriginalTransactionId = lookupMsg.TransactionId;
                        SendOutMessage(secMsg);

                        //SendOutMessage(new Level1ChangeMessage { SecurityId = security.ToSecurityId() }
                        //	.Add(Level1Fields.StepPrice, security.StepPrice)
                        //	.Add(Level1Fields.MinPrice, security.MinPrice)
                        //	.Add(Level1Fields.MaxPrice, security.MaxPrice)
                        //	.Add(Level1Fields.MarginBuy, security.MarginBuy)
                        //	.Add(Level1Fields.MarginSell, security.MarginSell));
                    });

                SendOutMessage(new SecurityLookupResultMessage {
                        OriginalTransactionId = lookupMsg.TransactionId
                    });

                return;
            }

            case MessageTypes.MarketData:
            case ExtendedMessageTypes.HistorySource:
                ProcessMarketDataMessage((MarketDataMessage)message);
                return;

            case ExtendedMessageTypes.EmulationState:
                var stateMsg    = (EmulationStateMessage)message;
                var isSuspended = false;

                switch (stateMsg.State)
                {
                case EmulationStates.Starting:
                {
                    if (_isStarted)
                    {
                        _isSuspended = false;
                    }
                    else
                    {
                        _isStarted = true;
                    }

                    break;
                }

                case EmulationStates.Suspending:
                {
                    _isSuspended = true;
                    isSuspended  = true;
                    break;
                }

                case EmulationStates.Stopping:
                {
                    _isSuspended = false;
                    break;
                }
                }

                SendOutMessage(message);

                if (isSuspended)
                {
                    SendOutMessage(new EmulationStateMessage {
                        State = EmulationStates.Suspended
                    });
                }

                return;
            }

            //SendOutMessage(message);
        }