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

 
Andrey Kisselyov:

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

с уважением.

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


Доброй ночи, Андрей! Как вы определите сколько чего скопировалось, если обращение к данным терминала всегда выдаёт ошибку?

CF      0       17:37:19.818    TstData (EURUSD,M1)     SERIES_TERMINAL_FIRSTDATE Error=4401 Symbol=EURUSD Date=1970.01.01 00:00:00

Считывайте, дочитывайте, перечитывайте, с задержкой в секунду или пять, раз в минуту или в две, через Bars или CopyRates или CopyClose - но если SERIES_TERMINAL_FIRSTDATE даёт ошибку, что вы с этим делать будете? Так никто и не понял, что это трудно воспроизводимая, но фатальная ошибка. И танцы с бубнами не помогают, 4401 всё равно остаётся. То есть существует некоторое состояние терминала, при котором ошибку 4401 программно сбросить невозможно любыми попытками чтения данных. Начало поста хоть прочитайте...

 
Yury Kirillov:

Доброй ночи, Андрей! Как вы определите сколько чего скопировалось, если обращение к данным терминала всегда выдаёт ошибку?

Считывайте, дочитывайте, перечитывайте, с задержкой в секунду или пять, раз в минуту или в две, через Bars или CopyRates или CopyClose - но если SERIES_TERMINAL_FIRSTDATE даёт ошибку, что вы с этим делать будете? Так никто и не понял, что это трудно воспроизводимая, но фатальная ошибка. И танцы с бубнами не помогают, 4401 всё равно остаётся. То есть существует некоторое состояние терминала, при котором ошибку 4401 программно сбросить невозможно любыми попытками чтения данных. Начало поста хоть прочитайте...

Юрий, а Вы попробовали Ваш код запустить в OnTick()/OnCalculate()/OnTimer() - ошибка не исчезает?

 
Yury Kirillov:

Доброй ночи, Андрей! Как вы определите сколько чего скопировалось, если обращение к данным терминала всегда выдаёт ошибку?

Считывайте, дочитывайте, перечитывайте, с задержкой в секунду или пять, раз в минуту или в две, через Bars или CopyRates или CopyClose - но если SERIES_TERMINAL_FIRSTDATE даёт ошибку, что вы с этим делать будете? Так никто и не понял, что это трудно воспроизводимая, но фатальная ошибка. И танцы с бубнами не помогают, 4401 всё равно остаётся. То есть существует некоторое состояние терминала, при котором ошибку 4401 программно сбросить невозможно любыми попытками чтения данных. Начало поста хоть прочитайте...

я не знаю как вы организовываете доступ к историческим данным по нужному вам ТФ, но я копирую все данные командами CopyOpen() и другими из той же серии. почитайте возвращаемое значение данной команды.

с уважением.

P.S.  а если у вас нет скопированных данных, то смысла в работе советника дальше нет, на выход.

P.S.P.S. да и еще, никогда не копирую данные в OnInit() легче и надежнее проверять данные когда советник уже начал работать.
как мне сказали в СД цитата:
" Индикатор работает в потоке символа. Поэтому, пока индикатор не инициализирован, его не помещают в пул индикаторов соответствующего символа"
конец цитаты.

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

проблем с историей в мт5 нет, я их не нашел, есть не желание прочитать и посмотреть "а как это реализовано в мт5" у программистов.

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

проблем с историей в мт5 нет, я их не нашел, есть не желание прочитать и посмотреть "а как это реализовано в мт5" у программистов.

с уважением.

Сделал так:

for(int i=0;i<SymbolsTotal(true);i++)
     {
         for(int i_1=0;i_1<ArrayRange(tf,0);i_1++)
         {
               string sym = SymbolName(i,true);
              int cost_init = Bars(sym,(ENUM_TIMEFRAMES)tf[i_1],TimeCurrent()-2592000,TimeCurrent());
              CopyClose(sym,(ENUM_TIMEFRAMES)tf[i_1],(TimeCurrent()-2592000),TimeCurrent()-60,close_array);
              iClose(sym,(ENUM_TIMEFRAMES)tf[i_1],cost_init);
              long init_bars = SeriesInfoInteger(sym,PERIOD_M1,SERIES_BARS_COUNT);
         }
         }

Перебираю все нужные тф на всех нужных символах. В onInit. Цель: инициировать подгрузку истории.С запасом использую и Bars и CopyClose. В надежде, что хоть одна инициирует подгрузку.

УПД. Добавил iClose. По совету отсюда: https://www.mql5.com/ru/forum/279476#comment_8694891

Инициализация замедлилась, но результат тот же.

В onCalculate снова пытаюсь скопировать таймсерии:

int cost =Bars(sym,f_tf,time_dest,time_current-60);//на всякий случай убавил минуту, чтобы несформированный бар не //захватывало
if (cost<10) Print("bars ",cost,", ", _LastError,", Cимвол:",sym); ResetLastError();return(0);
            Print("bars ",cost,", ", _LastError,", Cимвол:",sym); ResetLastError();
            int y = CopyRates(sym,f_tf,time_dest,cost,rates);
           Print("copy rates",y,", ", _LastError,", Cимвол:",sym);ResetLastError();
           if(y<10) {Print("ret:",y); return(0);           }

Бесконечная ошибка 4401. Втч на символе и тф, на котором работает индикатор

Насколько корректно работает тестер стратегий при депозите не в USD?
Насколько корректно работает тестер стратегий при депозите не в USD?
  • 2018.09.16
  • www.mql5.com
Есть ряд Российских брокеров с депозитом в рублях, у многих других брокеров можно открывать депозиты в EUR, AUD и прочих валютах...
Причина обращения: