Ошибка 4004 в тестере стратегий?

 

При попытке тестирования автономно без проблем работающего советника в тестере стратегий при попытке выполнения функции CopyTicks() при инициализации выдается ошибка 4004  ERR_NOT_ENOUGH_MEMORY

По информации Диспетчера задач текущая загрузка памяти  56%.

Из советника убрал все (файл проба), он пустой, ничего в нем нет кроме  CopyTicks. Ошибка не уходит.

Прошу подсказать в чем дело? спасибо.

Файлы:
Proba.mq5  5 kb
 

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

P. S. Попробуйте перенести ticks_array в локальные переменные функции вместо объявления ее на глобальном уровне. 

 
Ihor Herasko #:

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

P. S. Попробуйте перенести ticks_array в локальные переменные функции вместо объявления ее на глобальном уровне. 

символ EURUSD, интервал 2022.12.05 - 2022.12.06, отчет прикрепил

Файлы:
20221208.log  7 kb
 
Leonids Drics #:

символ EURUSD, интервал 2022.12.05 - 2022.12.06, отчет прикрепил

У вас "every tick generating"

Какие тики вы хотите получить в OnInit при ежетиковой (не "все тики на основе реальных тиков") генерации?

Вы уверены, что не запрашиваете тики от "начала времён"?

Представленные исходник и журнал не соответствуют друг другу

Print(__LINE__," error ",GetLastError());

находится в 26 строке, а не в 35

CS      0       09:56:41.748    Core 1  2022.12.05 00:00:00   35 error 4004
CS      0       09:56:41.748    Core 1  2022.12.05 00:00:01   35 error 4004
CS      0       09:56:41.748    Core 1  2022.12.05 00:00:02   35 error 4004
CS      0       09:56:41.748    Core 1  2022.12.05 00:00:03   35 error 4004
CS      0       09:56:41.748    Core 1  2022.12.05 00:00:04   35 error 4004
 
Slava #:

У вас "every tick generating"

Какие тики вы хотите получить в OnInit при ежетиковой (не "все тики на основе реальных тиков") генерации?

Вы уверены, что не запрашиваете тики от "начала времён"?

Представленные исходник и журнал не соответствуют друг другу

находится в 26 строке, а не в 35

Я запрашиваю тики за 5 минут до последнего тика.

Беру последний тик: SymbolInfoTick(Symbol(),last_tick)

Sc=5 минут от него в миллисекундах это from=(last_tick.time-60*Sc)*1000;//copy ticks from time

Вне тестера, при автономной работе это вот прямо сейчас total_ticks=684 тика, а в тестере -1 и ошибка 4004

да, действительно, журнал не соответствует, сорри. Прикрепил соответствующий. Смотрите последний прогон ( в конце файла)

Файлы:
20221208.log  14 kb
 
Leonids Drics #:

Я запрашиваю тики за 5 минут до последнего тика.

Беру последний тик: SymbolInfoTick(Symbol(),last_tick)

Sc=5 минут от него в миллисекундах это from=(last_tick.time-60*Sc)*1000;//copy ticks from time

Вне тестера, при автономной работе это вот прямо сейчас total_ticks=684 тика, а в тестере -1 и ошибка 4004

да, действительно, журнал не соответствует, сорри. Прикрепил соответствующий.

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

Есть описание в документации https://www.mql5.com/ru/docs/runtime/testing#real_ticks

И вы не сказали, что получаете в результате вызова SymbolInfoTick. Впрочем, вы никак не анализируете полученные данные

Документация по MQL5: Программы MQL5 / Тестирование торговых стратегий
Документация по MQL5: Программы MQL5 / Тестирование торговых стратегий
  • www.mql5.com
Тестирование торговых стратегий - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Slava #:

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

Есть описание в документации https://www.mql5.com/ru/docs/runtime/testing#real_ticks

И вы не сказали, что получаете в результате вызова SymbolInfoTick. Впрочем, вы никак не анализируете полученные данные

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

if(SymbolInfoTick(Symbol(),last_tick)){//вызов и анализ функции КопиТикс} else {//сообщение об ошибке}.

Если бы никаких тиков не было, то и на КопиТикс не вышли бы. Данный сов (Proba) я специально подготовил, чтобы вопрос задать. В реальном советнике, который я пытаюсь оттестировать в тестере, КопиТикс стоит в ОнТике(), и в нем тоже автономно КопиТикс работает, а в тестере выдает 4004 В справочнике про КопиТикс говорится:

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

Вы же видите, я делаю 5 попыток, все как в справочнике, все идеально работает автономно, но не в тестере.

 
Leonids Drics #:

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

if(SymbolInfoTick(Symbol(),last_tick)){//вызов и анализ функции КопиТикс} else {//сообщение об ошибке}.

Если бы никаких тиков не было, то и на КопиТикс не вышли бы. Данный сов (Proba) я специально подготовил, чтобы вопрос задать. В реальном советнике, который я пытаюсь оттестировать в тестере, КопиТикс стоит в ОнТике(), и в нем тоже автономно КопиТикс работает, а в тестере выдает 4004 В справочнике про КопиТикс говорится:

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

Вы же видите, я делаю 5 попыток, все как в справочнике, все идеально работает автономно, но не в тестере.

if(SymbolInfoTick(Symbol(),last_tick)) - это не анализ результатов, а анализ того, что функция отработала. Что пришло в last_tick, вы не знаете. Вы точно уверены, что в last_tick.time не ноль?

Я вам давал ссылку на документацию про тестирование. Прочитайте всё без пропуска. Тестирование очень сильно отличается от реальной работы.

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

 
Slava #:

if(SymbolInfoTick(Symbol(),last_tick)) - это не анализ результатов, а анализ того, что функция отработала. Что пришло в last_tick, вы не знаете. Вы точно уверены, что в last_tick.time не ноль?

Я вам давал ссылку на документацию про тестирование. Прочитайте всё без пропуска. Тестирование очень сильно отличается от реальной работы.

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

Прочитал без пропуска, идей не появилось. 

Но Вашу мысль понял. Убедимся не ноль ли там, и что from за 5 минут до last_tick. Печатаем время TimeCurrent/last_tick/from:

Автономно все ОК с первого прохода:

2022.12.08 16:20:24.660 Proba (EURUSD,M1) current/last_tick.time/from 2022.12.08 16:19:58 /2022.12.08 16:19:58 /2022.12.08 16:14:58



В тестере все 5 проходов идентичный результат:

2022.12.08 16:24:14.971 Core 1 2022.12.05 00:00:00   current/last_tick.time/from 2022.12.05 00:00:00 /2022.12.02 23:54:59 /2022.12.02 23:49:59

2022.12.08 16:24:14.971 Core 1 2022.12.05 00:00:00   28 error 4004

Т.е. никаких крамольных нулей нет, но вижу разрыв между текущим временем (началом тестирования) 2022.12.05 00:00:00 (тиков еще не было) и последним  тиком  last_tick.time в пятницу 2022.12.02 23:54:59 , from, как и требуется, за 5 минут до  last_tick.time.

Теперь проверим, что проблема не в разрыве пятница/понедельник. Меняю период тестирования  на 2022.12.06 - 2022.12.07 (это вторник-среда). Имеем аналогично:

2022.12.08 16:42:32.418 Core 1 2022.12.06 00:00:00   current/last_tick.time/from 2022.12.06 00:00:00 /2022.12.05 23:59:59 /2022.12.05 23:54:59

2022.12.08 16:42:32.418 Core 1 2022.12.06 00:00:00   28 error 4004

Последнюю версию советника приложил.






Файлы:
Proba.mq5  6 kb
 

Ещё раз.

Чтобы получить тики до начала тестирования, нужно:

1. Тестировать в режиме «на основе реальных тиков»

2. Предварительно запустить тестирование на реальных тиках с более ранней даты, чтобы у агента тестирования был запас тиков

 
Slava #:

Ещё раз.

Чтобы получить тики до начала тестирования, нужно:

1. Тестировать в режиме «на основе реальных тиков»

2. Предварительно запустить тестирование на реальных тиках с более ранней даты, чтобы у агента тестирования был запас тиков

Спасибо. "На основе реальных тиков"!!! то, что нужно. Сорри, что дошло только с "Еще раз".