Ошибки, баги, вопросы - страница 2437
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Т.е. OnTesterPass вызывается без наличия фрэймов? Ну тогда это очевидная ошибка. Данное событие означает получение фрэйма, а не окончание прохода.
Все фрэймы должны придти в OnTesterPass до того, как вызывать событие OnTesterDeinit. Это нормальная здоровая логика. Если, повторюсь, речь не идёт о принудительном прерывании тестирования.
OnTesterPass вызывается, когда пришёл хотя бы один фрейм. Может прийти пачка фреймов. Поэтому в OnTesterPass надо принимать фреймы в цикле, а не по одному. Но если "после последнего раза - ни разу", то OnTesterPass не вызывается.
Оптимизация прекращается, когда пришёл последний результат. Фреймы могут поступить позднее, особенно если в фрейме передаётся большое количество данных или если передаётся сразу несколько фреймов на один проход. Поэтому в OnTesterDeinit, которая запускается по завершению оптимизации нужно организовывать приём оставшихся фреймов. Тоже в цикле.
Это - нормальная здоровая логика.
Я несколько раз давал примеры приёма фреймов именно в OnTesterDeinit, а не только в OnTesterPass. И именно приём сложных фреймов разных типов
если передаётся сразу несколько фреймов на один проход.
Когда-то пробовал, такое не прокатывало. Только один FrameAdd срабатывал.
Оптимизация прекращается, когда пришёл последний результат. Фреймы могут поступить позднее, особенно если в фрейме передаётся большое количество данных или если передаётся сразу несколько фреймов на один проход. Поэтому в OnTesterDeinit, которая запускается по завершению оптимизации нужно организовывать приём оставшихся фреймов. Тоже в цикле.
Если фрэймы могут поступить позднее, то значит нет гарантии, что и в OnTesterDeinit они будут сразу? Т.е. надо делать цикл ожидания? И как долго ждать?
Я то ранее подумал, что дело обстоит так: OnTesterPass вызывается только для тех фрэймов, которые пришли с момент окончания предыдущего OnTesterPass. Если же новый фрэйм пришёл в процессе выполнения OnTesterPass , а конкретней - с момента последнего вызова FrameNext и до завершения функции, то этот фрэйм так и останется висеть, пока не придёт новый фрэйм, генерирующий событие. Поэтому OnTesterDeinit и необходим для получения этих висящих фрэймов.
Если фрэймы могут поступить позднее, то значит нет гарантии, что и в OnTesterDeinit они будут сразу? Т.е. надо делать цикл ожидания? И как долго ждать?
Я то ранее подумал, что дело обстоит так: OnTesterPass вызывается только для тех фрэймов, которые пришли с момент окончания предыдущего OnTesterPass. Если же новый фрэйм пришёл в процессе выполнения OnTesterPass , а конкретней - с момента последнего вызова FrameNext и до завершения функции, то этот фрэйм так и останется висеть, пока не придёт новый фрэйм, генерирующий событие. Поэтому OnTesterDeinit и необходим для получения этих висящих фрэймов.
FrameNext - это тупое чтение mqd-файла и больше ничего.
FrameFirst - FileSeek.Когда-то пробовал, такое не прокатывало. Только один FrameAdd срабатывал.
Здесь я пример показывал.
Спасибо.
PS FrameFirst здесь лишний
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Тестирование стратегий по расписанию с автоподстановкой результата в советника
Slava, 2013.04.10 15:04
Вот пример. В OnTester советник отсылает 2 фрейма - история сделок и история, на которой он работал.
В OnTesterDeinit приём и обработка всех фреймов первого и второго типа
PS FrameFirst здесь лишний
Нет. Не лишний - чисто методически. Законченный блок кода безо всяких умолчаний
Этот код был выдран из более сложного кода. Передавали 4 типа разных фреймов. При этом читали в OnTesterPass тоже. Здесь представлен "рафинированный" код.
Нет. Не лишний - чисто методически. Законченный блок кода безо всяких умолчаний
Этот код был выдран из более сложного кода. Передавали 4 типа разных фреймов. При этом читали в OnTesterPass тоже. Здесь представлен "рафинированный" код.
Про то, что FrameFirst всегда лишний, если вызывается перед FrameFilter.
Не рекомендовал бы передачу данных более, чем через один фрейм.
Про то, что FrameFirst всегда лишний, если вызывается перед FrameFilter.
Не рекомендовал бы передачу данных более, чем через один фрейм.
1. Да. Может быть лишний.
2. Один тип фреймов читается в OnTesterPass, дочитывается в OnTesterDeinit. Остальные фреймы вычитываются в OnTesterDeinit
Нам эта возможность передачи-получения нескольких типов фреймов позволила исправить несколько трудновоспроизводимых ошибок в тестере. Причём фреймы передавались только если возникало различие с неким эталонным значением.
Откроете opt-формат?