private void RealTimeCandlesClick(object sender, RoutedEventArgs e)
        {
            foreach (var security in SecurityPicker.SelectedSecurities)
            {
                var series = new CandleSeries(typeof(TimeFrameCandle), security, InteractiveBrokersTimeFrames.Second5);

                if (_realTimeCandles.Keys.Any(s => s.Security == security))
                {
                    Trader.UnSubscribeCandles(series);
                    _realTimeCandles.GetAndRemove(series).Close();

                    RealTimeCandles.IsChecked = false;
                }
                else
                {
                    var wnd = new CandlesWindow
                    {
                        Title = security.Id + LocalizedStrings.Str2973
                    };
                    _realTimeCandles.Add(series, wnd);
                    Trader.SubscribeCandles(series);
                    wnd.Show();

                    RealTimeCandles.IsChecked = true;
                }
            }
        }
Beispiel #2
0
        private void RealTimeCandlesClick(object sender, RoutedEventArgs e)
        {
            var series = new CandleSeries(typeof(TimeFrameCandle), SelectedSecurity, IBTimeFrames.Second5);

            if (RealTimeCandles.IsChecked == true)
            {
                var wnd = new CandlesWindow {
                    Title = SelectedSecurity.Id + LocalizedStrings.Str2973
                };
                _сandles.Add(series, wnd);
                Trader.SubscribeCandles(series, DateTimeOffset.MinValue, DateTimeOffset.MaxValue);
                wnd.Show();
            }
            else
            {
                Trader.UnSubscribeCandles(series);
                _сandles.GetAndRemove(series).Close();
            }
        }
        /// <summary>
        /// Отправить сообщение.
        /// </summary>
        /// <param name="message">Сообщение.</param>
        protected override void OnSendInMessage(Message message)
        {
            switch (message.Type)
            {
            case MessageTypes.Reset:
            {
                _depths.Clear();
                _secIdByTradeIds.Clear();

                if (_socket != null)
                {
                    try
                    {
                        _socket.Dispose();
                    }
                    catch (Exception ex)
                    {
                        SendOutError(ex);
                    }

                    _socket = null;
                }

                SendOutMessage(new ResetMessage());

                break;
            }

            case MessageTypes.Connect:
            {
                if (_socket != null)
                {
                    throw new InvalidOperationException(LocalizedStrings.Str1619);
                }

                _socket = new IBSocket {
                    Parent = this
                };
                _socket.ProcessResponse += OnProcessResponse;
                _socket.Connect(Address);

                _socket.Send((int)_clientVersion);

                _socket.ServerVersion = (ServerVersions)_socket.ReadInt();

                if (_socket.ServerVersion >= ServerVersions.V20)
                {
                    var str = _socket.ReadStr();
                    ConnectedTime = str.Substring(0, str.LastIndexOf(' ')).ToDateTime("yyyyMMdd HH:mm:ss");
                }

                if (_socket.ServerVersion < _minimumServerVersion)
                {
                    throw new InvalidOperationException(LocalizedStrings.Str2513Params
                                                        .Put((int)_socket.ServerVersion, (int)_minimumServerVersion));
                }

                if (_socket.ServerVersion >= ServerVersions.V3)
                {
                    if (_socket.ServerVersion >= ServerVersions.V70)
                    {
                        if (!ExtraAuth)
                        {
                            _socket.Send((int)RequestMessages.StartApi);
                            _socket.Send((int)ServerVersions.V1);
                            _socket.Send(ClientId);
                        }
                    }
                    else
                    {
                        _socket.Send(ClientId);
                    }
                }

                _socket.StartListening(error => SendOutMessage(new ConnectMessage {
                        Error = error
                    }));

                SendOutMessage(new ConnectMessage());

                // отправляется автоматически
                //RequestIds(1);

                SetServerLogLevel();
                SetMarketDataType();

                RequestCurrentTime();

                break;
            }

            case MessageTypes.Disconnect:
            {
                if (_socket == null)
                {
                    throw new InvalidOperationException(LocalizedStrings.Str1856);
                }

                UnSubscribePosition();
                UnSubscribeAccountSummary(_pfRequests.GetAndRemove("ALL"));

                _socket.Dispose();
                _socket = null;

                SendOutMessage(new DisconnectMessage());

                break;
            }

            case MessageTypes.OrderRegister:
            {
                RegisterOrder((OrderRegisterMessage)message);
                break;
            }

            case MessageTypes.OrderCancel:
            {
                var cancelMsg = (OrderCancelMessage)message;
                ProcessRequest(RequestMessages.CancelOrder, 0, ServerVersions.V1, socket => socket.Send((int)cancelMsg.OrderTransactionId));
                break;
            }

            case MessageTypes.OrderGroupCancel:
            {
                RequestGlobalCancel();
                break;
            }

            case MessageTypes.SecurityLookup:
            {
                RequestSecurityInfo((SecurityLookupMessage)message);
                break;
            }

            case MessageTypes.MarketData:
            {
                ProcessMarketDataMessage((MarketDataMessage)message);
                break;
            }

            case MessageTypes.PortfolioLookup:
            {
                var pfMsg = (PortfolioLookupMessage)message;

                // отправляется автоматически
                //RequestPortfolios();

                SubscribePosition();

                _pfRequests.Add("ALL", pfMsg.TransactionId);
                SubscribeAccountSummary(pfMsg.TransactionId, "ALL", Enumerator.GetValues <AccountSummaryTag>());

                break;
            }

            case MessageTypes.Portfolio:
            {
                var pfMsg = (PortfolioMessage)message;
                SubscribePortfolio(pfMsg.PortfolioName, pfMsg.IsSubscribe);
                break;
            }

            case MessageTypes.OrderStatus:
            {
                var orderMsg = (OrderStatusMessage)message;

                RequestOpenOrders();
                RequestAllOpenOrders();
                //RequestAutoOpenOrders(ClientId == 0);
                ReqeustMyTrades(orderMsg.TransactionId, new MyTradeFilter());

                break;
            }
            }
        }
Beispiel #4
0
        /// <summary>
        /// Отправить сообщение.
        /// </summary>
        /// <param name="message">Сообщение.</param>
        protected override void OnSendInMessage(Message message)
        {
            switch (message.Type)
            {
            case MessageTypes.Connect:
            {
                _depths.Clear();
                _secIdByTradeIds.Clear();

                if (SessionHolder.Session == null)
                {
                    var socket = new IBSocket {
                        Parent = SessionHolder
                    };

                    socket.Connect(SessionHolder.Address);

                    socket.Send((int)_clientVersion);

                    socket.ServerVersion = (ServerVersions)socket.ReadInt();

                    if (socket.ServerVersion >= ServerVersions.V20)
                    {
                        var str = socket.ReadStr();
                        SessionHolder.ConnectedTime = str.Substring(0, str.LastIndexOf(' ')).ToDateTime("yyyyMMdd HH:mm:ss");
                    }

                    if (socket.ServerVersion < _minimumServerVersion)
                    {
                        throw new InvalidOperationException(LocalizedStrings.Str2513Params
                                                            .Put((int)socket.ServerVersion, (int)_minimumServerVersion));
                    }

                    if (socket.ServerVersion >= ServerVersions.V3)
                    {
                        if (socket.ServerVersion >= ServerVersions.V70)
                        {
                            if (!SessionHolder.ExtraAuth)
                            {
                                socket.Send((int)RequestMessages.StartApi);
                                socket.Send((int)ServerVersions.V1);
                                socket.Send(SessionHolder.ClientId);
                            }
                        }
                        else
                        {
                            socket.Send(SessionHolder.ClientId);
                        }
                    }

                    socket.StartListening(error => SendOutMessage(new ConnectMessage {
                            Error = error
                        }));

                    _isSessionOwner = true;

                    SessionHolder.Session = socket;
                }

                SendOutMessage(new ConnectMessage());

                if (_isSessionOwner)
                {
                    // отправляется автоматически
                    //RequestIds(1);

                    SetServerLogLevel();
                    SetMarketDataType();

                    RequestCurrentTime();
                }

                switch (Type)
                {
                case MessageAdapterTypes.Transaction:
                    SendInMessage(new PortfolioLookupMessage {
                            TransactionId = TransactionIdGenerator.GetNextId()
                        });
                    SendInMessage(new OrderStatusMessage {
                            TransactionId = TransactionIdGenerator.GetNextId()
                        });
                    break;

                case MessageAdapterTypes.MarketData:
                    //RequestScannerParameters();
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                break;
            }

            case MessageTypes.Disconnect:
            {
                switch (Type)
                {
                case MessageAdapterTypes.Transaction:
                    UnSubscribePosition();
                    UnSubscribeAccountSummary(_pfRequests.GetAndRemove("ALL"));
                    break;

                case MessageAdapterTypes.MarketData:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                if (_isSessionOwner)
                {
                    SessionHolder.Session.Dispose();
                    SessionHolder.Session = null;
                    _isSessionOwner       = false;
                }

                SendOutMessage(new DisconnectMessage());

                break;
            }

            case MessageTypes.OrderRegister:
            {
                RegisterOrder((OrderRegisterMessage)message);
                break;
            }

            case MessageTypes.OrderCancel:
            {
                var cancelMsg = (OrderCancelMessage)message;
                ProcessRequest(RequestMessages.CancelOrder, 0, ServerVersions.V1, socket => socket.Send((int)cancelMsg.OrderTransactionId));
                break;
            }

            case MessageTypes.OrderGroupCancel:
            {
                RequestGlobalCancel();
                break;
            }

            case MessageTypes.SecurityLookup:
            {
                RequestSecurityInfo((SecurityLookupMessage)message);
                break;
            }

            case MessageTypes.MarketData:
            {
                var mdMsg = (MarketDataMessage)message;

                switch (mdMsg.DataType)
                {
                case MarketDataTypes.Level1:
                {
                    var key = Tuple.Create(mdMsg.DataType, mdMsg.SecurityId, (object)null);

                    if (mdMsg.IsSubscribe)
                    {
                        _requestIds.Add(key, mdMsg.TransactionId);
                        SubscribeMarketData(mdMsg, SessionHolder.Fields, false, false);
                    }
                    else
                    {
                        UnSubscribeMarketData(_requestIds[key]);
                    }

                    break;
                }

                case MarketDataTypes.MarketDepth:
                {
                    var key = Tuple.Create(mdMsg.DataType, mdMsg.SecurityId, (object)null);

                    if (mdMsg.IsSubscribe)
                    {
                        _requestIds.Add(key, mdMsg.TransactionId);
                        SubscribeMarketDepth(mdMsg);
                    }
                    else
                    {
                        UnSubscriveMarketDepth(_requestIds[key]);
                    }

                    break;
                }

                case MarketDataTypes.Trades:
                    break;

                case MarketDataTypes.News:
                {
                    if (mdMsg.IsSubscribe)
                    {
                        SubscribeNewsBulletins(true);
                    }
                    else
                    {
                        UnSubscribeNewsBulletins();
                    }

                    break;
                }

                case MarketDataTypes.CandleTimeFrame:
                {
                    var key = Tuple.Create(mdMsg.DataType, mdMsg.SecurityId, (object)Tuple.Create(mdMsg.Arg, mdMsg.To == DateTimeOffset.MaxValue));

                    if (mdMsg.IsSubscribe)
                    {
                        _requestIds.Add(key, mdMsg.TransactionId);

                        if (mdMsg.To == DateTimeOffset.MaxValue)
                        {
                            SubscribeRealTimeCandles(mdMsg);
                        }
                        else
                        {
                            SubscribeHistoricalCandles(mdMsg, CandleDataTypes.Trades);
                        }
                    }
                    else
                    {
                        var requestId = _requestIds[key];

                        if (mdMsg.To == DateTimeOffset.MaxValue)
                        {
                            UnSubscribeRealTimeCandles(mdMsg, requestId);
                        }
                        else
                        {
                            ProcessRequest(RequestMessages.UnSubscribeHistoricalData, 0, ServerVersions.V1,
                                           socket => socket.Send(requestId));
                        }
                    }

                    break;
                }

                case ExtendedMarketDataTypes.Scanner:
                {
                    var scannerMsg = (ScannerMarketDataMessage)mdMsg;

                    var key = Tuple.Create(mdMsg.DataType, mdMsg.SecurityId, (object)scannerMsg.Filter);

                    if (mdMsg.IsSubscribe)
                    {
                        _requestIds.Add(key, mdMsg.TransactionId);
                        SubscribeScanner(scannerMsg);
                    }
                    else
                    {
                        UnSubscribeScanner(_requestIds[key]);
                    }

                    break;
                }

                case ExtendedMarketDataTypes.FundamentalReport:
                {
                    var reportMsg = (FundamentalReportMarketDataMessage)mdMsg;

                    var key = Tuple.Create(mdMsg.DataType, mdMsg.SecurityId, (object)reportMsg.Report);

                    if (reportMsg.IsSubscribe)
                    {
                        _requestIds.Add(key, mdMsg.TransactionId);
                        SubscribeFundamentalReport(reportMsg);
                    }
                    else
                    {
                        UnSubscribeFundamentalReport(_requestIds[key]);
                    }

                    break;
                }

                case ExtendedMarketDataTypes.OptionCalc:
                {
                    var optionMsg = (OptionCalcMarketDataMessage)mdMsg;

                    var key = Tuple.Create(mdMsg.DataType, mdMsg.SecurityId, (object)Tuple.Create(optionMsg.OptionPrice, optionMsg.ImpliedVolatility, optionMsg.AssetPrice));

                    if (optionMsg.IsSubscribe)
                    {
                        _requestIds.Add(key, mdMsg.TransactionId);

                        SubscribeCalculateOptionPrice(optionMsg);
                        SubscribeCalculateImpliedVolatility(optionMsg);
                    }
                    else
                    {
                        var requestId = _requestIds[key];

                        UnSubscribeCalculateOptionPrice(requestId);
                        UnSubscribeCalculateImpliedVolatility(requestId);
                    }

                    break;
                }

                default:
                    throw new ArgumentOutOfRangeException("message", mdMsg.DataType, LocalizedStrings.Str1618);
                }

                var reply = (MarketDataMessage)mdMsg.Clone();
                reply.OriginalTransactionId = mdMsg.OriginalTransactionId;
                SendOutMessage(reply);

                break;
            }

            case MessageTypes.PortfolioLookup:
            {
                var pfMsg = (PortfolioLookupMessage)message;

                // отправляется автоматически
                //RequestPortfolios();

                SubscribePosition();

                _pfRequests.Add("ALL", pfMsg.TransactionId);
                SubscribeAccountSummary(pfMsg.TransactionId, "ALL", Enumerator.GetValues <AccountSummaryTag>());

                break;
            }

            case MessageTypes.Portfolio:
            {
                var pfMsg = (PortfolioMessage)message;
                SubscribePortfolio(pfMsg.PortfolioName, pfMsg.IsSubscribe);
                break;
            }

            case MessageTypes.OrderStatus:
            {
                var orderMsg = (OrderStatusMessage)message;

                RequestOpenOrders();
                RequestAllOpenOrders();
                //RequestAutoOpenOrders(ClientId == 0);
                ReqeustMyTrades(orderMsg.TransactionId, new MyTradeFilter());

                break;
            }
            }
        }