Тестирование функции IsConnected()

 

Цель: Сформировать у себя правильное понимание работы функции IsConnected().

Я раньше ошибочно полагал, что, если функция IsConnected() показывает отсутствие связи с торговым сервером, то эксперт не может нормально работать. И на этом ошибочном постулате я строил некоторые свои советники. Несколько раз я ловил их на том, что они были остановлены по причине отсутствия связи с торговым сервером, наличие которой проверялось функцией IsConnected(). Недоумение вызывало то, что видимых причин для остановки не было. Тики поступали, индикаторы показывали актуальные данные, индикатор связи в правом нижнем углу терминала показывал наличие связи. Сначала появилось предположение, что тики могут прорываться в терминал даже в том случае, когда функция IsConnected() показывает отсутствие связи с торговым сервером. Для проверки я написал тестовый советник e-TestIsConnected.mq4 и повесил его на свой реальный счёт. Советник работает в замкнутом цикле, прервать который может либо обрыв связи с торговым сервером, либо остановка эксперта кнопкой Советники на панели инструментов. При восстановлении связи или при разрешении работы советника он продолжает работать. Все возможные ходы советника протоколируются. Предлагаю на осмысление результат работы советника:

...
2008.01.28 20:12:31 Связь ОК...
2008.01.28 20:12:35 ОТСУТСТВУЕТ связь с торговым сервером
2008.01.28 20:13:36 Начало функции start()
2008.01.28 20:13:36 Связь ОК...
...
2008.01.28 20:42:19 ОТСУТСТВУЕТ связь с торговым сервером
2008.01.28 20:42:20 Начало функции start()
2008.01.28 20:42:20 ОТСУТСТВУЕТ связь с торговым сервером
2008.01.28 20:42:22 Начало функции start()
2008.01.28 20:42:22 ОТСУТСТВУЕТ связь с торговым сервером
2008.01.28 20:42:23 Начало функции start()
...
2008.01.28 23:56:13 Начало функции start()
2008.01.28 23:56:13 ОТСУТСТВУЕТ связь с торговым сервером
2008.01.28 23:56:33 Начало функции start()
2008.01.28 23:56:33 ОТСУТСТВУЕТ связь с торговым сервером
2008.01.28 23:57:26 Выполнена функция deinit()
2008.01.28 23:57:40 Советник будет запущен следующим тиком
2008.01.28 23:57:40 Выполнена функция init()
2008.01.28 23:57:50 Начало функции start()
2008.01.28 23:57:50 Связь ОК...
2008.01.28 23:57:54 Связь ОК...
2008.01.28 23:57:59 Связь ОК...

В аттаче советник и сокращённый протокол. Из протокола удалены многочисленные строки типа:

2008.01.28 23:57:59 Связь ОК...

Свои умозаключения дам немного позже. Интересно, насколько они совпадут с... другими :-)

Файлы:
test.zip  10 kb
 
Возможно, что в случае долгой паузы между тиками (необходимо вычислить это время - TimeDone) сбрасывается флаг наличия связи. После очередного прихода тика на время TimeDone флаг наличия связи устанавливается. То есть при плотности тиков, умещающихся в TimeDone, флаг наличия связи не сбрасывается и "связь есть".

Все это так - мысли вслух. Чтобы точнее что-то сказать надо будет у себя потестить, отследить закономерности.
 
Здравствуйте!
Запустил на реале. За 4,5 часа не было ни одной ошибки. Файл с результатом теста прицепил.
Ежели чего потестить или погонять, проверить надо, с удовольствием помогу. Неделю, две - сколько нужно!
Файлы:
test_2.zip  12 kb
 

Утром перед уходом на работу запустил. 1 обрыв связи + в конце какой то странный перерыв 17 мин. в 19:45 и никаких сообщений. Из файла ничего не убирал.


Нашол причину. В этот момент просто смотрел этот файл. Доступ на запись был закрыть. Вот из сообщение лога

19:45:12 e-TestIsConnected: cannot open file C:\Program Files\MetaTrader - Alpari\experts\files\test. csv

Файлы:
test_3.zip  35 kb
 
Prival:

Утром перед уходом на работу запустил. 1 обрыв связи + в конце какой то странный перерыв 17 мин. в 19:45 и никаких сообщений. Из файла ничего не убирал.


Нашол причину. В этот момент просто смотрел этот файл. Доступ на запись был закрыть. Вот из сообщение лога

19:45:12 e-TestIsConnected: cannot open file C:\Program Files\MetaTrader - Alpari\experts\files\test. csv

Чтобы информация не терялась при открытии файла для просмотра, надо записывать в текстовой файл и открывать его WordPad-ом:

extern string FileName   = "test.txt";

Вообще, есть смысл записывать в файл только изменения состояния связи, а не каждые 4 секунды.

 
За 14 часов работы на реале (IB) только один факт отсутствия связи.
Файлы:
test_4.zip  38 kb
 

Глюк о котором пишет KimV однозначно есть .Вот что писал вчера мой эксперт в журнале

2008.01.30 22:31:28    sovRAZD2 EURUSD,M5: Не удалось купить 1.4866
2008.01.30 22:31:28    sovRAZD2 EURUSD,M5: OrderSendReliable V1_0_0:error: IsConnected() == false

хотя котировки бегут и связь по значку есть. Но эту проблему можно решить через программу AutoMate я её использую для контроля доступа в интернет т.к. у меня он не сказать что хороший хотя и ADSL

 

Благодарю всех, оказывающих содействие...

Я тестирование веду с даты разработки советника, то есть с 23-го января сего года. Советник работает круглосуточно на реальном счёте. Три-четыре раза в сутки я просматриваю файл test.csv. Если не нахожу сообщений, аналогичных тем, что я привёл в первом посте данной темы, то удаляю файл. Советник создаёт новый файл и продолжает накапливать сообщения до следующего просмотра.

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

2008.01.31 14:39:46 Связь ОК...
2008.01.31 14:39:49 ОТСУТСТВУЕТ связь с торговым сервером
2008.01.31 14:52:45 Начало функции start()
2008.01.31 14:52:45 Связь ОК...
Интерпретирую я это следующим образом.
В 14:39:46 cвязь в порядке, которая нарушилась через 3 секунды. Советник замирает на неполные три минуты. В 14:52:45 приходит тик, запускающий функцию start(). Об этом свидетельствует запись "Начало функции start()". Далее советник проверяет значение, возвращаемое функцией IsConnected() и по результату выводит сообщение "Связь ОК...".
 

Сегодня ночью я повторно словил ситуацию, из-за которой завёл разговор в этой теме. Итак, сначала факты, а потом обещанные комментарии.

Вот сильно урезанное содержимое файла, сформированного советником e-TestIsConnected:

2008.02.01 01:54:18 Связь ОК...
2008.02.01 01:54:22 Связь ОК...
2008.02.01 01:54:26 ОТСУТСТВУЕТ связь с торговым сервером
2008.02.01 01:54:26 Начало функции start()
2008.02.01 01:54:26 ОТСУТСТВУЕТ связь с торговым сервером
2008.02.01 01:54:27 Начало функции start()
2008.02.01 01:54:27 ОТСУТСТВУЕТ связь с торговым сервером
...

2008.02.01 05:10:24 Начало функции start()
2008.02.01 05:10:24 ОТСУТСТВУЕТ связь с торговым сервером
2008.02.01 05:10:28 Начало функции start()
2008.02.01 05:10:28 ОТСУТСТВУЕТ связь с торговым сервером
2008.02.01 05:13:10 Начало функции start()
2008.02.01 05:13:10 Связь ОК...
2008.02.01 05:13:14 ОТСУТСТВУЕТ связь с торговым сервером
2008.02.01 05:13:36 Начало функции start()
2008.02.01 05:13:36 Связь ОК...
2008.02.01 05:13:40 Связь ОК...
2008.02.01 05:13:44 Связь ОК...

Более полная версия файла (вырезаны начало и конец, середина оставлена полностью) в аттаче.

Анализ файла показывает, что до 01:54:22 включительно функция IsConnected() возвращала TRUE. В 01:54:26 по каким-то причинам произошёл обрыв связи. Функция IsConnected() вернула значение FALSE и советник записал в файл сообщение "ОТСУТСТВУЕТ связь с торговым сервером". После записи этого сообщения управление было передано терминалу оператором return. Советник завершил свою работу. Однако, в 01:54:26, то есть сразу же после завершения работы советника, не смотря на отсутствие связи с торговым сервером, в терминал "прорывается" тик, запускающий функцию start() советника, что подтверждает запись в файле "2008.02.01 01:54:26 Начало функции start()". Отсутствие связи с торговым сервером подтверждается следующей записью "2008. 02.01 01:54:26 ОТСУТСТВУЕТ связь с торговым сервером". В 01:54:27 приходит новый тик. Он запускает советник, работа которого снова прерывается по причине отсутствия связи с торговым сервером. В 01:54:29 очередной тик, в 01:54:42 следующий, в 01:54:43 ещё тик и так далее в течение более чем четырёх часов, вплоть до 05:13:36, когда связь восстановилась и советник продолжил свою нормальную работу. Если открыть файл test2.csv в текстовом редакторе, то видно, что строки "ОТСУТСТВУЕТ связь с торговым сервером" и "Начало функции start()" сменяют друг друга очень продолжительное время и очень много раз. И это происходит не с той периодичностью, с которой должен был бы работать советник 3,7 секунды. Очень похоже, что функция start() запускается именно тиками, интервалы между которыми прыгают от 0 до нескольких десятков секунд.

Возникают вопросы:

1. Почему тики проходят в терминал и запускают советник при отсутствии связи с торговым сервером?
2. Почему функция IsConnected() показывает отсутствие связи с торговым сервером в тот момент, когда тики спокойно проходят в терминал и запускают функцию start() советника?

Файлы:
test2.zip  6 kb
 

Выкладываю еще 1 файл. Запускал на реальном счете Gold 5 мин. Но вот что странно нет ни одного перерыва в связи, а как только начинаю собирать тики. Обязательно есть разрывы. Сейчас попробую сделать следующее. Параллельно запущу сборщик тиков и твою прогу. Принудительно буду разрывать связь, позже вечером выложу оба файла. Может сравнение и анализ этих двух файлов чем то поможет.

Сборщик тиков прилагаю.

Файлы:
ticksave.mq4  10 kb
test.zip  60 kb
 

У меня сегодня это явление проявилось в полной мере после выхода новостей из США когода "пляски" начались причем сразу у двух брокеров смею предположить что возможно в ситуации неопределённости сами брокеры ограничивают торговлю или слишком у них много запросов на торговлю и сервера не справляются.А когда все успокоилось всё ОК. У меня эксперт на 5 минутках сейчас думаю все таки как минимум 15 минутки нужно анализировать .

Причина обращения: