← Atrás

После восстановления соединения новые свечи не приходят

S#1.8.

ReConnectionManager соединение восстанавливает,но изменения не приходят. В SampleSMA свечи не будут изменяться. Возможно и другие данные по dde

-- Subscription settings:http://groups.google.com/group/stocksharp/subscribe?hl=ru

¿Le resultó útil este tema?

Compartir tema

Comentarios (16)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

Mikhail Sukhov
Mikhail Sukhov

А соединение терялось по какой причине?

Ilya Usenko
Ilya Usenko Autor

Перезапустил quik

Mikhail Sukhov
Mikhail Sukhov

Нужно экспорт ДДЕ запускать в этом случае.

Ilya Usenko
Ilya Usenko Autor

Что подразумевается под потерей соединения, если на разрыв связи(меню

  • разорвать соединение) в квике ConnectionError не вылетает. А вылетает только на закрытие квика. И смысл ReConnectionManager, если нужно нужно запускать экспорт дде? Не понимаю может чего я?
Mikhail Sukhov
Mikhail Sukhov

Да, знаю о баге. Пофиксил еще к выходу 1.8, но не выложил - не провел тестирования (как выяснилось - удачно получилось, потому что в следующем релизе появится Смарт, который уж совсем имеет другую логику, и пришлось бы переделывать). Фикс будет в следующей релизе, честное пионерское =)

Насчет ДДЕ. Давайте обсудим. Дело в том, что ДДЕ устроен другим образом. В связке через trans2quik.dll клиентом является робот. В случае ДД, клиентом является сервер. Если идти от того, что узнавать о умерших клиентах серверу, является плохим дизайном, то нужно пойти по другом подходу. Более того, через QuikTrader.Reconnect идет переподключение только по апи, а по ДДЕ нет. Как я уже описал здесь -

http://stockmarketdotnet.blogspot.com/2010/04/smartcom.htmlя в новой версии добавил ITrader.ConnectionTimeOut В случае QuikTrader, если по ДДЕ не приходит событие, он выбрасывает событие с ошибкой. Я думаю научить ReConnectionManager ловить это событие. А вот что делать дальше, пока не знаю. Все равно ReConnectionManager не умеет запускать ДДЕ.

Ilya Usenko
Ilya Usenko Autor

Доброе утро, Михаил! Считаю что ReConnectionManager не нужен. Мне например. Достаточно ловить исключение и выполнять всю последовательность действий, как при старте робота. Можно возложить это несложное дело на программиста.

Может двигаться в другом направлении. Запоминать состояние робота на момент сбоя. Но здесь тоже все непонятно. У всех разные данные, стратегии и т.д. Некоторый набор функций в S# 1.8 уже есть. Пока не пользовался.

Mikhail Sukhov
Mikhail Sukhov

По Вашему описанию уже все сделано (с учетом фикса в новой версии)... На самом деле, если не учитывать падение Квика (что у меня было разы), то ReConnectionManager работает нормально. Если Квик не падает, то и перезапускать ДДЕ не нужно. Даже если инет отключиться, Квик сам переподключится. А ДДЕ при это не останавливается и просто в первую секунду нового соединения разом все данные перетекут. Или не так?

Ilya Usenko
Ilya Usenko Autor

Все равно не понял смысла ReConnectionManager. Если квик падает, то ReConnectionManager просто ничего нее делает, кроме как Trader.Connect Если падает связь в работающем квике, то ReConnectionManager вообще ничего не делает. Квик сам восстанавливает соединение и льет данные.

Mikhail Sukhov
Mikhail Sukhov

Как я уже написал - фикс есть.

Сразу хочу уточнить. В ReConnectionManager я вкладывал логику не столько самовосстанавливающегося помощника к роботу, сколько уведомителя. Упал Квик или он перестал слать данные по ДДЕ - событие о тайм ауте. Прервалась связь - событие о разрыве соединения. Все эти событие более нужны не роботу, а человеку. Чтобы трейдер был оповещен как можно раньше (вряд ли робот может восстановить потерю интернета, здесь нужен человек, чтобы позвонить провайдеру). Не следить же 100% за роботом весь день - есть и другие задачи.

Garry
Garry

А почему не получается запустить DDE после закрытия и открытия квика? Делаю вот так: _reConnectionManager = new ReConnectionManager(this.Trader, TimeSpan.FromSeconds(10), new Range<TimeSpan>[0]); _reConnectionManager.ConnectionRestored += () => { MessageBox.Show("Соединение восстановлено"); //StopDde(); StartDde(); }; Вот такая ошибка в студии выдается при выполнении this.Trader.StartDde "Окно с заголовком 'инструменты' не было найдено." Если квик не закрывать то дде стартуется стопится сколько угодно раз.

вот процедуры private void StartDde() { _isDdeStarted = true; this.Trader.StartDde(new[] {Trader.SecuritiesTable,Trader.OrdersTable,Trader.StopOrdersTable,Trader.MTradesTable}); }

   private void StopDde()
    {
        this.Trader.StopDde(new[] { Trader.SecuritiesTable,

Trader.OrdersTable, Trader.StopOrdersTable, Trader.MyTradesTable }); _isDdeStarted = false; }

Mikhail Sukhov
Mikhail Sukhov

Версия 1.8?

Garry
Garry

Ну да! Только у меня WinForms а не WPF, ReConnectionManager и экземпляр QuikTrader создается при нажатии кнопки соединения. Может ли это как-нибудь влиять? Например, какие-нибудь проблеммы с синхронизацией или потоками? просто в GUI программировании новичек еще.

Mikhail Sukhov
Mikhail Sukhov

Проверил на своей текущей версии - все нормально. Но у меня уже 2.0... Можете привести полный текст ошибки?

Garry
Garry

Делаю так, жму подключение(создаются все объекты), после этого закрываю, открываю квик, ReConnectionManager пересоединяется выдается MessageBox.Show("Соединение восстановлено"); а вот на StartDde(); выдается исключение. Вот скопировал текст исключения в клипборд.

System.ArgumentException was unhandled by user code Message="Окно с заголовком 'инструменты' не было найдено.\r \nParameter name: caption" Source="Ecng.Trading.Quik" ParamName="caption" StackTrace: at Ecng.Trading.Quik.QuikTrader. (String ) at Ecng.Trading.Quik.QuikTrader. (DdeTable ) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement] (IEnumerable1 source, Func2 keySelector, Func2 elementSelector, IEqualityComparer1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement] (IEnumerable1 source, Func2 keySelector, Func2 elementSelector) at Ecng.Trading.Quik.QuikTrader. (IEnumerable1 , Action`2 ) at Ecng.Trading.Quik.QuikTrader.StartDde(DdeTable[] ddeTables) at WindowsFormsApplication1.Form1.StartDde() in E:\bcs\C#\my \WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 73 at WindowsFormsApplication1.Form1.<button1_Click>b__2() in E: \bcs\C#\my \WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 151 at Ecng.Common.DelegateHelper.SafeInvoke(Action handler) at Ecng.Trading.Algo.ReConnectionManager. () InnerException:

Mikhail Sukhov
Mikhail Sukhov

Да, действительно, взял 1.8 пример, переделал - на дает. Как workaround, в обработчике сделать Reconnect а затем уже StartDde();

Garry
Garry

Спасибо! Добавил reconnect все работает!