← 戻る

Проблема с Coonectom

Добрый день, пытаюсь сесть на Вашу библиотеку. Смотрю примеры. Пример SampleSmart отлично коннектится и работает с моим демосчетом А пример SampleSmartSMA при нажатии на кнопку Connect выдает следующую ошибку

System.ComponentModel.Win32Exception (0x80004005): Отказано в доступе

в System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)

в System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)

в System.Diagnostics.Process.Kill()

в StockSharp.Smart.SmartTrader.KillSmartComProcess()

в StockSharp.Smart.SmartTrader.OnConnect()

В чем может быть дело?

このトピックは参考になりましたか?

トピックを共有

コメント (20)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

Alexander
Alexander

smartcom и samplesmartsma от одного юзера запущен, от админа? версию S# тоже указывайте

AlexBuzaev
AlexBuzaev 著者

Точно, спасибо Надо запускать от админитсратора

kingdom2
kingdom2

Добавьте пожалуйста в доку, что Гидру тоже для smartcom надо из под админа пускать.

Цифровой
Цифровой

Думал написать в отдельную тему, но раз уж эта "всплыла".

Меня интересует вопрос, зачем вообще нужно убивать процесс SmartCOM? Негативные последствия от этого предположительно такие:

  1. Как минимум это не позволяет к нему подключиться из двух разных программ. Например, если хочется возложить скачивание маркет-данных на Гидру, а торговать из другой используя тот же SmartCOM.

  2. У меня есть нехороший эффект: если в Гидре сначала нажать Старт, потом Стоп, а затем снова Старт при включенном источнике Smart, то второй раз Старт отвалится по таймауту. Есть предположение, что это связано как раз с убийством SmartCOM во втором Старте.

Вопрос - какая польза? Ведь она же должна быть :-)

Параметры запуска:

  • Гидра, скомпилированная под x86
  • Запуск с правами администратора
  • Windows 8 Release Preview x64, Windows 7 Ultimate x64

Есть также тест на C#, написанный на основе консольного примера для Smart вида: new SmartTrader, Connect, StartExport, Dispose, new SmartTrader, Connect... Скомпилирован под x86. На втором коннекте либо крэш от отсутствия прав, если VisualStudio запущена не под админом, либо бесконечное ожидание успешного коннекта.

Marco
Marco

Поддержу вопрос. Не знаю, связано ли это с убийством процесса SmartCOM, но определенно с реализацией подключения и переподключения в SmartTrader есть проблемы. Я тоже набросал тест, который умеет подключаться/отключаться, и содержит настройки переподключения при обрыве связи. При тестировании имеем:

  • После запуска тест подключается к шлюзу и получает сделки.
  • При отключении вручную и последующем подключении вручную (Disconnect()/Connect()), получение сделок успешно возобновляется.
  • При физическом отключении от сети и последующем физическом подключении SmartTrader переподключение выполняет, но получение сделок НЕ возобновляется. (В обработчике события Connected я переподписываюсь на сделки и перезапускаю экспорт.) Вообще при переподключении происходят странные вещи. Например событие Disconnected вызывается с большой задержкой либо вообще не вызывается. При этом Disconnected и Connected могут вызываться несколько раз, в процессе может возникнуть исключение "Программа выполнила недопустимую операцию и будет закрыта" и т.д.
  • При перезапуске сервиса SmartCOM в процессе работы теста, просто перестают вызываться все обработчики событий. Никаких попыток восстановить соединение не предпринимается.

Настройки переподключения у меня такие:


                        // настраиваем переподключение при обрыве связи для SmartCom  
                        trader.ReConnectionSettings.ReConnectingAttemptCount = -1;
                        trader.ReConnectionSettings.ConnectingAttemptCount = -1;
                        trader.ReConnectionSettings.IsReStartExport = false; // true - тоже пробовал.
                        trader.ReConnectionSettings.ExportTimeOutInterval = TimeSpan.FromSeconds(30);
                        trader.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);
                        trader.ReConnectionSettings.WorkingTime = Exchange.Rts.WorkingTime;
                        trader.ReConnectionSettings.ConnectionRestored += () =>
                        {
                            Console.WriteLine("Соединение восстановлено.");
                        };

Собственно вопросы такие:

  • Есть ли возможность заставить SmartTrader/SmartCOM стабильно переподключаться при проблемах с каналом связи? Если проблема в моем коде, я готов оплатить техподдержку.
  • Если проблемы в SmartTrader, и у уважаемых авторов библиотеки нет времени/желания/возможности их исправлять, могу ли я получить доступ к проекту SmartTrader, чтобы внести необходимые исправления?
  • Или посоветуете забить на SmartCOM и перейти на Plaza?

P.S.: Тестовый проект - в аттаче. Там нужно поменять константы логина-пароля-портфеля. Прописан адрес основного сервера ITInvest. Если будете использовать тестовую систему - адрес нужно поменять.

Mikhail Sukhov
Mikhail Sukhov

Убивание процесса было сделано потому, что если он зависнет (а такое было в 2010, когда я через него торговал, сейчас возможно это не актуально), то к нему уже никак не переключиться.

Реконнект сейчас работает не очень стабильно. В планах его его переделать, но пока это далекие планы, так как нужно малому количеству юзеров. На Квике в последнее время тьфу-тьфу вроде все работает нормально, на Плазе так же, а это основная масса роботостроителей.

Что можно сделать сейчас.

  1. Можно сделать флаг для опционального убивания процесса СмартКом (что, кстати, возможно и сейчас, достаточно переопределить метод SmartTrader.OnConnect). На разрыв соединения это не повлияет, но первое подключение возможно станет быстрее и стабильнее.
  2. Можете оплатить доработку для экстренного фикса самостоятельно, или с кем-то, кому еще она нужна.
Цифровой
Цифровой

Mikhail Sukhov:

  1. Можно сделать флаг для опционального убивания процесса СмартКом (что, кстати, возможно и сейчас, достаточно переопределить метод SmartTrader.OnConnect). На разрыв соединения это не повлияет, но первое подключение возможно станет быстрее и стабильнее. Да, слона то в виде virtual я и не приметил... Спасибо, буду тестить!

Вопрос сразу, не отходя от кассы. Раз SmartCOM такой нестабильный, а я пока планирую связать с ним свои ближайшие торговые амбиции, можно ли получить исходный код связанный именно со SmartCOM и SmartTrader с тем, чтобы иметь лучшие возможности по поиску и исправлению ошибок? Взамен могу предложить идеи по улучшению SmartTrader, если они конечно будут :-)

Mikhail Sukhov
Mikhail Sukhov

Цифровой: Раз SmartCOM такой нестабильный, а я пока планирую связать с ним свои ближайшие торговые амбиции, можно ли получить исходный код связанный именно со SmartCOM и SmartTrader с тем, чтобы иметь лучшие возможности по поиску и исправлению ошибок? Взамен могу предложить идеи по улучшению SmartTrader, если они конечно будут :-)

Был уже один помощник, который так же говорил про СмартКом. Получил исходники, и больше мы его не видели.

Так что теперь только через время и кодеплекс. Время покажет надежность, кодеплекс - навык.😉

Marco
Marco

Михаил, спасибо за комментарий.

А сколько будет стоить фикс реконнекта для SmartTrader?

Хотя предположу, что стратегически более правильно будет свалить на плазу.

Mikhail Sukhov
Mikhail Sukhov

Marco: Михаил, спасибо за комментарий.

А сколько будет стоить фикс реконнекта для SmartTrader?

Хотя предположу, что стратегически более правильно будет свалить на плазу.

5-10... Не смотрел точно, как можно переделать. Просто видел в коде явные ошибки. Переподключения писалось очень давно, и тогда было другое мировоззрение на работу с потоками.

Плаза - это хорошо, но только для ФОРТС.

Marco
Marco

Михаил, спасибо. Цена сравнима со стоимостью подключения к плазе. Я подумаю.

Mikhail Sukhov
Mikhail Sukhov

Marco: Михаил, спасибо. Цена сравнима со стоимостью подключения к плазе. Я подумаю.

Подключайтесь через СтокШарп http://stocksharp.com/broker/ Бесплатное подключение к Плазе.😀

Marco
Marco

Mikhail Sukhov: Подключайтесь через СтокШарп http://stocksharp.com/broker/ Бесплатное подключение к Плазе.😀 Вы умеете вести переговоры. (c) 😀

Цифровой
Цифровой

Мудро

dvoris
dvoris
  1. Как минимум это не позволяет к нему подключиться из двух разных программ. Например, если хочется возложить скачивание маркет-данных на Гидру, а торговать из другой используя тот же SmartCOM.

Не получится, т.к. при втором подключении к службе SmartCOM первое дисконнектится.

Кроме этого, некоторое время назад в АйТи что-то подкрутили, и изредка случаются дисконнекты, если во время работы (с другой машины) происходит подключение с этого же, либо даже с дополнительного (!) логина, зарегистрированного на одного клиента. Чёткой системы не уловил, техподдержка АйТи ничем не помогла. Возможно, борьба с мультиподключениями или настройки безопасности, а точнее некорректная их реализация. Благо, мне сейчас не критично, но вообще, конечно, нужно разбираться с этим.

Убийство процесса лучше оставить, хотя зависаний службы не припомню, это надо сильно постараться, производя какие-то нестандартные действия. Но можно и отключить рестарт службы (переопределением метода SmartTrader.Connect), если хочется сделать реконнект быстрым. А, по-хорошему, в SmartTrader можно бы распознавать зависание SmartCOM (предлагаю подумать как именно).

В остальном проблем с реконнектом не замечал, лично у меня он работоспособный на 99.5%. Конечно, с некоторыми костылями вроде переподписывания на события и т.д. Вообще, это рекомендованное разработчиками SmartCOM поведение - отписаться и подписаться снова (CancelTicks+ListenTicks,CancelBidAsk+ListenQuotes и т.д.) Так что, возможно, эти "костыли", которые и не костыли, стоит прописать в SmartTrader.

P.S. Михаил, а кому давали исходники? Я готов потратить время и оттюнить реконнект в SmartTrader, т.к. сам его использую и имею опыт с API SmartCom. Тут и другие заинтересованные есть, вроде бы. Не пойму зачем в позу вставать - "сам делать не буду и вам не дам". По-моему, все мы тут обеими руками за развитие S#. Все - в смысле старожилы, конечно, а не все при/про-ходящие.

Геннадий Ванин (Gennady Vanin) Цифровой
andy_baka_
andy_baka_

Насколько я помню, это вполне возможно. Единственное, что для того, чтобы разрешить множественные подключения нужно звонить в АйТиИнвест и просить чтобы они сняли ограничение на количество конектов с одного адреса. По крайней мере, у меня работает два конекта и ничего не происходит - один SmartTrade, второй - из программы.

dvoris
dvoris

andy_baka_: Насколько я помню, это вполне возможно. Единственное, что для того, чтобы разрешить множественные подключения нужно звонить в АйТиИнвест и просить чтобы они сняли ограничение на количество конектов с одного адреса. По крайней мере, у меня работает два конекта и ничего не происходит - один SmartTrade, второй - из программы.

Естественно, ограничение по айпи выключено у брокера, не в этом дело. SmartTrade не использует службу SmartCOM и поэтому может одновременно работать с приложением, использующим SmartCOM.
Не смогут работать одновременно на одной машине именно два разных приложения, использующих SmartCOM. Для этого у нас StockSharp, который подключается к SmartCOM один, а уже на StockSharp можно навешивать модули с логикой.

Цифровой
Цифровой

Спасибо за ответы!

  1. Сейчас уже могу сказать, что есть ограничения на подключения. Т.е. даже если со второго компьютера пытаешься коннектиться с одним логином, то на первом коннект пропадает. Чтобы обойти это ограничение можно привязать к своей учетке еще один логин (вопрос без проблем решается через тех.поддержку).

  2. По поводу использования SmartCom в двух программах на одном компьютере - у меня так и не заработало (по крайней мере со StockSharp) и от концепции Hydra + "Программа Анализатор Регистратор Сделок" я отказался, так что у меня сейчас All-In-One пока со StockSharp.

  3. Проблема в том, как верно заметил dvoris, что SmartTrader от StockSharp действительно отпадает раза 3 в день. Идея, что это связано с подключением по второму логину - интересная, можно попробовать. Может быть проблемы с настройками переподключения. В документации сказано, что SmartCom дисконнектится после ожидания ответа на запрос в течение 2 секунд (можно увеличить). Может быть стоит увеличить таймаут. Может быть неправильно настроены попытки переподлючения или оно невключено.

  4. Начал баловаться непосредственно со SmartCom, т.е. писать свою обертку. С подключением заметил такую проблему: если на SmartCom вызвать Connect в программе, а потом эта программа завершится (например, аварийно), то коннекция выживет и не даст законнектится снова при повторном запуске программы (какая-то ошибка сокета). Но можно каждый раз при запуске программы пытаться делать Disconnect. Тогда коннекция-труп умрет и можно будет сделать новый Connect. Есть предположение, что тогда не придется убивать процесс SmartCom.

Mikhail Sukhov
Mikhail Sukhov

Цифровой: и от концепции Hydra + "Программа Анализатор Регистратор Сделок" я отказался, так что у меня сейчас All-In-One пока со StockSharp.

Вот именно поэтому и я решил организовать проект http://stocksharp.com/forum/3166/RoutingServer/

СмартКом по идее сам является таким вот роутером, но почему-то в него не заложена изначально функциональность множества одновременных подключений. Плюс подвисшие коннекты от одного робота не дают возможность подключаться другому.

В свое время ИТ инвест уже убивал смартком, и инициировал новый АПИ. Даже как-то присылал нам описание. Но время прошло, а его так и нет, и судя по всему даже никто толком и не использовал. Мое мнение такое, что сейчас уже смысла нет что либо писать под смартком. Они наконец-то выпустили СмартИкс и надеюсь теперь дойдут руки до переделок АПИ. Лучше конечно убить СмартКом напрочь, чем мучать и себя и юзеров.

Aleksey24
Aleksey24

Периодически вылетает ошибка при подключении, может кто подскажет в чем проблема Происходит следующее:

Все запускаю от Админестратора. Установлена SmartCOM 2.2.116.1020 от 14.02.2012 Экспериментировал с подключением библиотек S# (версия 4.1.5, версия 4.1.8, сборка 23281) Служба SmartCom2 отключена (тип запуска - вручную). В столбце (тип запуска) - пусто. Сначала запускаю TestConnect_2_2 с сайта ITinvest. 1. Клик "Create" запускает службу SmartCom2. 2. Клик "Connect" Connected со SmartCom. При этом (с постоянно запущенной службой SmartCom2) нажимая "Disconnect" и "Connect" по очереди много раз не создается никаких ошибок. 3. В итоге отключаю TestConnect_2_2, но оставляю службу SmartCom2 запущенной. Запускаю SampelSmartCandels (пример от S#) -> появляется ошибка

***System.ComponentModel.Win32Exception (0x80004005): Отказано в доступе

в System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)

в System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)

в System.Diagnostics.Process.Kill()

в StockSharp.Smart.SmartTrader.KillSmartComProcess()

в StockSharp.Smart.SmartTrader.OnConnect()***

после клика на ОК кнопка Export разблокируется и приходят инструменты и т.д. 4. Закрыв приложение SampelSmartCandels и запустив его заново -> выскакивает та же самая ошибка, но уже без подключения, без экспорта.. Служба SmartCom2 включена. 5. Запуская приложение SampelSmartCandels постоянно возникает ошибка, и появление экспорта происходит циклично через подключение. 6. Если отключить службу SmartCom2 и запустить приложение SampelSmartCandels -> запускается без сбоев первый раз, после закрытия приложения служба SmartCom2 остается запущенной. И соответственно при запуске приложения снова появляется ошибка. После этого (с запущенной службой SmartCom2) TestConnect_2_2 запускается и работает без ошибок. Буду искать дальше ошибку, но все таки было бы хорошо если кто то поборол такую ошибку и тут чирканул решение

НАШЕЛ ПРИЧИНУ, может кому поможет в дальнейшем: При повторном запуске от Админа примера SampleSmartCandles появлялась ошибка 800400...15 (точный номер уже непомню). Причина ошибки в установке .NET Framework 4 и 4.5. Устанавливаются в первый раз на комп. нормально без ошибок (что и сбивает с толку 🤨 ). После обновления NET Framework через центр обновлений Windows все ошибки исчезли. Все запускается и работает!!!! 😀

Axell