Ошибка 4401

 

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

ERR_HISTORY_NOT_FOUND

4401

Запрашиваемая история не найдена

По сути, история у меня есть, а доступа к ней нет.

Функции получения данных из таймсерий такие как эта:

datetime barOpenTime(int shift,                                       // Индекс бара, время открытия которого требуется определить
                     ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export {    // ТФ, на котором будет происходить поиск открытия баров функцией CopyTime()
//---
  datetime barOpenTime[1];
//---
  return ((CopyTime(_Symbol, tf, shift, 1, barOpenTime) != -1) ? barOpenTime[0] : WRONG_VALUE);
}

Я, конечно, понимаю, что в реал-тайме может не быть котировки последней, но, что бы котировок не было исторических, причём, не очень давних, а за начало 2017 года, это удивляет. Ещё недавно тестировал сову с 2015г. и всё чётко, а здесь с 2017г по той же паре GBPJPY уже ошибка получения исторических данных. С чем это вообще связано?

Откуда берётся эта шибка при наличии истории и как с ней бороться?

 
Viktar Dzemikhau:

Я уже не первый месяц используюсь функции, которые возвращают данные из таймсерий. Не было никаких косяков в этом плане. Сегодня наткнулся на эту ошибку:
...
Откуда берётся эта шибка при наличии истории и как с ней бороться?

А если так?

iTime(NULL, TimeFrame, shift);
 
Vitaly Muzichenko:

А если так?

В 5-ке?

 
Viktar Dzemikhau:

В 5-ке?

Конечно!

 
Vitaly Muzichenko:

Конечно!

Хм. Интересно. Эти функции i* добавили на днях что-ли? раньше их точно не было когда я писал библиотеку. Может из-за этого и косяк сейчас?

 
Viktar Dzemikhau:

Хм. Интересно. Эти функции i* добавили на днях что-ли? раньше их точно не было когда я писал библиотеку. Может из-за этого и косяк сейчас?

Меня всегда удивляют экспертописатели, которые не следят за новостями платформы для которой пишут, обновляют билды и не смотрят анонсы(

 
Vitaly Muzichenko:

Меня всегда удивляют экспертописатели, которые не следят за новостями платформы для которой пишут, обновляют билды и не смотрят анонсы(

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

Не всегда есть время наблюдать за анонсами. Сейчас сильно загружен. Мониторю только ветки ксательно разработки.

 
Viktar Dzemikhau:

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

Не всегда есть время наблюдать за анонсами. Сейчас сильно загружен. Мониторю только ветки ксательно разработки.

Ясно, но разрабы делают мир лучше, и это не может не радовать)

Следите изредка за новостями, там есть полезные вещи, которых иногда не хватает.

Удачи!

 
Vitaly Muzichenko:

Ясно, но разрабы делают мир лучше, и это не может не радовать)

Следите изредка за новостями, там есть полезные вещи, которых иногда не хватает.

Удачи!

Спасибо)) Разгребусь и буду следить. По поводу того, что "разработички делают мир лучше".. Я бы хотел, что бы это было так, но, на данный момент, это не так. Кроме наличия возможности отладки кода на истории, кнопка которого в 4-ке не активна, в 5-ке нет ничего полезного.

По поводу этой ошибки 4401.. После замены функций получающих данные из таймсерии ничего не изменилось. Хотя.. Я проснулся т.к. вчера уже был явный перегруз. Подошёл к том месту, где вчера был косяк отладчиком и.. там его уже нет! С чего вдруг его нет.. если код не менялся вопрос.. Зато ошибка это появилась где-то в другом месте и как её ловить я пока что не понял. Там же вся история пересчитывается первый раз. Прнтовать всё, есс-но не вариант.

В 4-ке есть такой код:

ENUM_TREND_DIR getTrend(ZZProperty& stZZProperty, int barIndex) {
  // Новая свеча выше предыдущей
  if (iHigh(NULL, i_TF, barIndex) > iHigh(NULL, i_TF, barIndex + 1)) {
      return TREND_DIR_UPWARD;
  }

  // Новая свеча ниже предыдущей 
  if (iLow(NULL, i_TF, barIndex) < iLow(NULL, i_TF, barIndex + 1)) {
      return TREND_DIR_DOWNWARD;
  }
  return TREND_DIR_NONE;
}

В 5-ке подобное уже так не напишешь. Вот где искать пользу от разработчиков вопрос..

Если кому интересно почему так не напишешь? Объясню. Любая из функций, в данном случае, iHigh, iLow и тд может вернуть, как оказалось косяк в виде ошибки 4401 и того, по крайне мере в индикаторах уже не отрисовывается ничего вообще. Я проверил, если, грубо говоря, что бы не заморачиваться и не искать, где косяк и проверить мысли влепить в самом начале функции OnCalculate() строку:

ResetLastError();

Код начинает работать корректно, но скорость становится невыносимо низкая. Каждй бар мусолится по минуте где-то на не высоких ТФ. Но сбросом ошибком я проверим, что если есть ошибка:

- Не рисуется кривая зиг-зага (в моём случае)

Так как узнать где может возникнуть эта ошибка не вариант, придётся везде, где происходить обращение к таймсериям проверять ошибку 4401 и код будет в разы больше. Такого в 4-ке точно не было и всё там работаешь без этого отлично. Вот сравните предыдущий вариант кода и, такой примерно:

ENUM_TREND_DIR getTrend(ZZProperty& stZZProperty, int barIndex) {
//---
  // Новая свеча выше предыдущей
  barHighCur = iHigh(_Symbol, i_tf, barIndex);
  barHighPrior = iHigh(_Symbol, i_tf, barIndex + 1);
  if (barHighCur > 0 && barHighPrior > 0)
    if (barHighCur > barHighPrior)
      return TREND_DIR_UPWARD;

  // Новая свеча ниже предыдущей 
  barLowCur = iLow(_Symbol, i_tf, barIndex);
  barLowPrior = iLow(_Symbol, i_tf, barIndex + 1);
  if ( barLowCur > 0 && barLowPrior > 0)
    if (barLowCur(barIndex, i_tf) < barLowPrior)
      return TREND_DIR_DOWNWARD;
//---
  return TREND_DIR_NONE;
}

Жёлтые строки это проверка на то, что дынные из таймсерии получены. Дальше нужно будет в этой функции или в вызывающей проверять дополнительно на ошибку. Хотя, функция служит для поределения тренда (в примитивном виде), а получается, что там нужно всё перепроверять. Хотя, истроия есть. И последний бар я проверял, с него данные берутся. Значит с других тоже дод\лжны браться.

Неужели всё там заморачиваются и добавляют доп. проверки как я показал выше? Ведь без них не узнаешь, получены данные или нет..

 

Пытался я разобраться как происходит подкачка истории в MT5, но не вышло. Как ее ограничить (расширить)? Но никто не знает. Я понимаю что сейчас налетят и будут говорить, что история запрашивается по мере обращения к определенным функциям - но для меня, как для программиста, это не ответ. Должно быть все четко. Почему бы не создать функции вида:


bool LoadHistory (datetime from)                // гарантированная загрузка истории в OnInit 
bool isHistoryExists (datetime dt)              // проверка доступности истории на определенную дату
void setHistoryLimit (datetime from)            // установка ограничение подкачки истории 

или что подобное


https://www.mql5.com/ru/forum/279499


Подгрузка истории в MT5
Подгрузка истории в MT5
  • 2018.09.17
  • www.mql5.com
Доброе утро. У меня идет торговля на множестве валютных пар (около 20). Периодически VPS начинает ругаться о недостатке свободного места на диске...
 
Uladzimir Kirychenka:

Пытался я разобраться как происходит подкачка истории в MT5, но не вышло. Как ее ограничить (расширить)? Но никто не знает. Я понимаю что сейчас налетят и будут говорить, что история запрашивается по мере обращения к определенным функциям - но для меня, как для программиста, это не ответ. Должно быть все четко. Почему бы не создать функции вида:


или что подобное

vois setHistoryLimit (datetime from)            // установка ограничение подкачки истории 

https://www.mql5.com/ru/forum/279499


Who is "vois"?

:-)

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