-
Notifications
You must be signed in to change notification settings - Fork 277
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SendCommand: Client is not connected Error #74
Comments
Добрый день. |
Похоже, ошибка происходит только тогда, когда идет обращение из разных потоков. Я запускаю один поток вначале для получения исторических данных. Затем запускаю таймер раз в 5 секунд для проверки заявок и позиций. Раз в минуту запускается поток обновления исторических данных. Когда каждый поток первый раз обращается к статичному свойству MtApiClient, то получаю ошибку. Попробую сделать тестовый код, который воспроизводит ошибку. Весь проект слишком сложный, да и не нужен он весь. |
Вообще-то нет смысла проверять состояние коннекта по таймеру. Для этого есть ивент ConnectionStateChanged который отлично подходить для этого и выдает нотификации, если состояние поменяется. Попробуйте использовать его. |
Это понятно. Интересует не состояние соединения, а новые заявки, которые появились за последние 5 секунд. Как я понимаю, в MT4 события постановки заявки/позиции нет. |
Все верно, таких событий нет. |
Продолжаю отладку. Перед тем как получаю ошибку, то вижу, что ((System.ServiceModel.ClientBase<MTApiService.IMtApi>)(MTApiClient.Client._proxy)).State переходит из статуса Open в статус Close. channel при этом существует. Вопрос становится таким: При каких обстоятельствах происходит разрыв соединения? Чтобы статус сменился с Open на Close нужно принудительно закрыть канал методом Close(); Пройдя по исходникам, я не нашел ситуаций принудительного разрыва соединения. |
Это очень странная ситуация, когда канал произвольно закрывается. Мне нужно исходники примера с данной проблемой, чтобы воспроизвести ее локально и попробовать определить ее характер. |
Возвращаясь к исходному коду:
Зачем выполняется проверка ISconnected? В каком случае может быть ситуация, когда прокси не подключен? Насчет кода. Если я упрощаю код и вывожу код из своего проекта, то он работает ОК. Поэтому, я постепенно усложняю тестовый вариант до тех пор, пока не поймаю ошибку. |
Проверка выполняется лишь с той целью, что пользователь может случайно сделать вызов функции API без подключения. При всегда правильном вызове функций это проверка немного избыточна. |
Добрый день! Извиняюсь за запоздалый ответ. Если работать с MTApi из нескольких потоков одновременно, то канал, действительно, закрывается через произвольное время. Пришлось решать задачу через управление потоками. Чтобы в текущий момент времени только 1 поток мог работать с MTApi. После этого, описанная мною ошибка, исчезла. Если появится снова, то отпишусь в этой ветке. Благодарю за MTApi! |
Все-таки, ошибка есть. Работаю в одном Task для получения котировок. Пример кода:
Я получаю эти данные в Task раз в 4 часа. Сначала при вызове
новый бар не получаю, но ошибки нет. Такое может быть, т.к. часы на компьютере и в терминале MT4 не синхронизированы. Часы на компьютере чуть спешат. Чтобы получить новый бар, через 10 секунд повторно делаю тот же самый вызов. Получаю: MtApi.MtConnectionException: Client is not connected. ---> System.ServiceModel.CommunicationException: Client is not connected. Ошибка происходит на разных компьютерах под Windows 10 со всеми установленными обновлениями. |
Буду пробовать воспроизвести эту проблему со своей стороны. Надеюсь получиться в скором времени ее пофиксить. |
Погонял код прошлую неделю. Если через интервалы от 1 минуты до 1 часа вызывать OrdersTotal и пр. методы работы с заявками, то все ОК.
Когда первый раз вызываю запрос Time/Open/High/Low/Close/Volume, то все также ОК
Вызовы идут из Task вот так: private readonly MTWrapper _mtWrapper = new MTWrapper(); // Обертка для связи с терминалом MT4 time = _mtWrapper.Time(Symbol, chartPeriod); После этих вызовов любой другой вызов через любое время ведет к ошибке: MtApi.MtConnectionException: Client is not connected. ---> System.ServiceModel.CommunicationException: Client is not connected. |
Вячеслав, мне отписался наш трейдер. У него возникает та же самая ошибка. Может, сделаем отладку, найдем ошибку и покончим с ней? |
Вячеслав, долго я возился с этой ошибкой, но, наконец-то ее разрешил. Решение неочевидное. MtApi.dll использует библиотеку Newtonsoft.Json.dll Причем, старую, 8-ой версии. Другие мои коннекторы, которые компилируются в ту же папку, что и MtApi.dll тоже используют Newtonsoft.Json.dll, но последней, 10-ой версии. При компиляции в папку сборки попадает 10-ая версия. MtApi.dll вызывает 8-ую версию, ей отвечает 10-ая, вот и ошибка. Что сделал. При компиляции MtApi.dll указал 10-ую версию, заодно повысил Framework с 4 на 4.5. После этого ошибка исчезла. Благодарю за труды! |
Hi @vdemydiuk , I am fighting with this error for last 2 days, any help would be greatly appriciated. Thanks. |
Сделал простую программу для тестов MtApi. После подключения раз в 5 секунд по таймеру получаю OrdersTotal(). Сначала все принимается корректно. Примерно через минуту работы получаю:
MtApi.MtConnectionException: Client is not connected. ---> System.ServiceModel.CommunicationException: Client is not connected.
в MTApiService.MtClient.SendCommand(Int32 commandType, ArrayList parameters, Dictionary
2 namedParams, Int32 expertHandle) в MtApi.MtApiClient.SendCommand[T](MtCommandType commandType, ArrayList commandParameters, Dictionary
2 namedParams)Начал искать причину ошибки.
Проверяется свойство IsConnected
private bool IsConnected => _proxy.State == CommunicationState.Opened;
_proxy класса MtApiProxy. Этот класс наследуется от DuplexClientBase. Тот наследуется от ClientBase. В нем реализовано свойство State:
The text was updated successfully, but these errors were encountered: