Не воспроизводится. Укажите, какой символ используете и какие даты. Также неплохо бы посмотреть детальный отчет тестера.
P. S. Попробуйте перенести ticks_array в локальные переменные функции вместо объявления ее на глобальном уровне.
Не воспроизводится. Укажите, какой символ используете и какие даты. Также неплохо бы посмотреть детальный отчет тестера.
P. S. Попробуйте перенести ticks_array в локальные переменные функции вместо объявления ее на глобальном уровне.
символ 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
У вас "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
да, действительно, журнал не соответствует, сорри. Прикрепил соответствующий. Смотрите последний прогон ( в конце файла)
Я запрашиваю тики за 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 / Тестирование торговых стратегий](https://c.mql5.com/36/60/dokumentaciya-po-mql5-programmi.png)
- www.mql5.com
Вы используете режим "все тики". В самом начале тестирования у вас не может быть никаких тиков в принципе, потому что тики только начинают генерироваться после начала тестирования и после 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 попыток, все как в справочнике, все идеально работает автономно, но не в тестере.
Смотрите в коде, в нем нет ни одной функции без анализа результата, там всего несколько строк. Не вижу никакого противоречия с указанной Вам документацией. Схематично это выглядит так:
if(SymbolInfoTick(Symbol(),last_tick)){//вызов и анализ функции КопиТикс} else {//сообщение об ошибке}.
Если бы никаких тиков не было, то и на КопиТикс не вышли бы. Данный сов (Proba) я специально подготовил, чтобы вопрос задать. В реальном советнике, который я пытаюсь оттестировать в тестере, КопиТикс стоит в ОнТике(), и в нем тоже автономно КопиТикс работает, а в тестере выдает 4004 В справочнике про КопиТикс говорится:
Функция CopyTicks() позволяет запрашивать и анализировать все пришедшие тики. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики автоматически будут загружены с торгового сервера. При этом будут синхронизированы тики с даты from, указанной в CopyTicks(), по текущий момент. После этого все приходящие по данному символу тики будут поступать в тиковую базу и поддерживать её в актуальном синхронизированном состоянии.
Вы же видите, я делаю 5 попыток, все как в справочнике, все идеально работает автономно, но не в тестере.
if(SymbolInfoTick(Symbol(),last_tick)) - это не анализ результатов, а анализ того, что функция отработала. Что пришло в last_tick, вы не знаете. Вы точно уверены, что в last_tick.time не ноль?
Я вам давал ссылку на документацию про тестирование. Прочитайте всё без пропуска. Тестирование очень сильно отличается от реальной работы.
Чтобы получить в тестере тики до начала тестирования, нужно тестировать на реальных тиках, нужно, чтобы реальных тиков было закачано с более ранней даты, чем начало тестирования
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
Последнюю версию советника приложил.
Ещё раз.
Чтобы получить тики до начала тестирования, нужно:
1. Тестировать в режиме «на основе реальных тиков»
2. Предварительно запустить тестирование на реальных тиках с более ранней даты, чтобы у агента тестирования был запас тиков
Ещё раз.
Чтобы получить тики до начала тестирования, нужно:
1. Тестировать в режиме «на основе реальных тиков»
2. Предварительно запустить тестирование на реальных тиках с более ранней даты, чтобы у агента тестирования был запас тиков
Спасибо. "На основе реальных тиков"!!! то, что нужно. Сорри, что дошло только с "Еще раз".
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
При попытке тестирования автономно без проблем работающего советника в тестере стратегий при попытке выполнения функции CopyTicks() при инициализации выдается ошибка 4004 ERR_NOT_ENOUGH_MEMORY
По информации Диспетчера задач текущая загрузка памяти 56%.
Из советника убрал все (файл проба), он пустой, ничего в нем нет кроме CopyTicks. Ошибка не уходит.
Прошу подсказать в чем дело? спасибо.