Ошибка 4401 как сбросить без перезагрузки терминала? - страница 2

 
Alexey Kozitsyn:
Про Bars() не я придумал

К сожалению, слова Славы не появились в документации. На тот момент и сейчас, наверное, это так. Но не факт, что будет продолжаться и далее. Ведь в документации об этом ни слова. А вот в Примечании к CopyRates недвусмысленно написано:

При запросе данных из индикатора, если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, то функция сразу же вернет -1, но при этом сам процесс загрузки/построения будет инициирован.

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


Почему бы не опираться на документированную информацию, если приходится выбирать между словами разработчика и документацией?
 
Ihor Herasko:
Юрий, это не ошибка. Это нормальная работа терминала. Алексей правильно сказал, что функция OnInit - не место для ожидания подкачки данных с сервера. Все это делается в OnTick или OnTimer. Да и отображать графические объекты в OnInit также не обязательно. Ведь они после этого могут быть кем-то уничтожены. А потому их снова нужно будет отображать в OnTick. Следовательно, OnInit для этих целей не подходит (если в OnTick все равно нужно проверять наличие объектов и заново их отображать при необходимости). Выход один - после запроса данных через CopyRates (не Bars, т. к. bars не инициирует подкачку данных) и получения отрицательного результата нужно уходить на ожидание окончания подкачки данных.

Игорь, смотрите, я запускаю советник, допустим история не подкачалась (или что-то ещё случилось) в пределах OnInit() и я получил ошибку 4401. После этого любое количество запусков советника приводит к этой же ошибке.

Дальше я пересбрасываю терминал и запускаю тот же советник - ошибка отсутствует - история синхронизирована в пределах OnInit(). И многократный запуск советника её не вызывает. В одинаковых условиях - разный результат.

Кроме того 4401 - это не просто несинхронные данные, фактически это отсутствие доступа к данным терминала. Я в одном случае такой доступ получаю, а в другом нет. При одинаковых исходных условиях. И это лечится только перезагрузкой.

 
Yury Kirillov:

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

У меня эта ошибка возникает постоянно на многих биржевых инструментах - просто сыплет в журнал. Данные получаю через CopyXXX()-функции.

И получаю данные в OnTick(), и каждые две минуты обращаюсь к нужным символам. Но ошибка есть всегда.

Уже просто руки опускаются в борьбе с ней...

 
Ihor Herasko:

К сожалению, слова Славы не появились в документации. На тот момент и сейчас, наверное, это так. Но не факт, что будет продолжаться и далее. Ведь в документации об этом ни слова. А вот в Примечании к CopyRates недвусмысленно написано:

При запросе данных из индикатора, если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, то функция сразу же вернет -1, но при этом сам процесс загрузки/построения будет инициирован.

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



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


Дело в том, что возвращается не просто малое количество данных, а никакое - данные недоступны до пересброса. Трудно назвать это нормальной работой терминала.

 
Ihor Herasko:

К сожалению, слова Славы не появились в документации. На тот момент и сейчас, наверное, это так. Но не факт, что будет продолжаться и далее. Ведь в документации об этом ни слова. А вот в Примечании к CopyRates недвусмысленно написано:

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

Опираться на документированную информацию, и говорить, что:

bars не инициирует подкачку данных

когда Вы точно этого не знаете - вообще разные вещи. И Вы здесь не правы.

 
Alexey Kozitsyn:

Опираться на документированную информацию, и говорить, что:

когда Вы точно этого не знаете - вообще разные вещи. И Вы здесь не правы.


ОК. Я неправ

 
Artyom Trishkin:

У меня эта ошибка возникает постоянно на многих биржевых инструментах - просто сыплет в журнал. Данные получаю через CopyXXX()-функции.

И получаю данные в OnTick(), и каждые две минуты обращаюсь к нужным символам. Но ошибка есть всегда.

Уже просто руки опускаются в борьбе с ней...

Артем, а почему ее не обрабатывать без сообщения пользователю? Мне она тоже глаза мозолила - отключил принт и все. Если нет данных/синхронизации, зачем переживать об этом, можно же просто подождать корректных данных.
 
Alexey Kozitsyn:
Артем, а почему ее не обрабатывать без сообщения пользователю? Мне она тоже глаза мозолила - отключил принт и все. Если нет данных/синхронизации, зачем переживать об этом, можно же просто подождать корректных данных.

В цикле по всем символам на сервере нужно получить данные по двум тф каждого символа и принять решение. Данных нет, и программа висит напрочь в ожидании данных, пока они не появятся все. И, как ни странно, их почти всегда каких-то нет. Были, а потом - раз, и уже нету... То есть ошибка на символе, то её нету, а потом опять есть. Обращение к данным организовано раз в две минуты. И всё равно...

 

никогда не жду скопируются или нет данные, послал команду, скопировало сколько надо идем дальше, не скопировало, сбрасываем флаг последнего доступа и на следующем тике проверяем можно ли скопировать данные.

с уважением.

P.S.  а ожидание чего то от копирования, да мало ли какие проблемы могут быть в терминале и почему он не скопировал. других, вменяемых возможностей, я не нашел, только так. копирую только недостающие данные.

 
Artyom Trishkin:

Обращение к данным организовано раз в две минуты. И всё равно...

Попробуйте поддерживать актуальность данных через Bars() или CopyRates() раз в минуту. 
Причина обращения: