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; } } }
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; } } }
/// <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; } } }