![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
!= замените на ==
Спасибо Дмитрий.
Не внимательность это да, страдаемс )
Но судя по проведённым сегодня экспериментам, проблему это не решает.
Так как этот тестовый скрипт у меня сегодня примерно одинаковое количество раз выдавал разные результаты, то открывает, то не открывает.
Даже если поменять нет на да, один фиг проблема останется. Печалька.
Работа с фреймами, как я понимаю, использует какие-то весьма тонкие системные механизмы, и я лично использовал ее исключительно в OnTesterDeinit().
То, что функция иногда может работать в недокументируемых режимах... ну... любая сложная система может иметь какие-то непредвиденные режимы работы... Но, на мой взгляд, правильнее будет не использовать их.
Без фреймов у меня не получается сделать задуманное, объединить на одном графике бэк и форвард тестирование https://www.mql5.com/ru/code/36058.
Я сначала сделал чтоб инфа из фреймов записывалась в файлы, а потом захотел лишний шаг(запись в файлы) убрать и сразу из фреймов строить графики. Но не получилось.
Я разобрался в каких случаях скрипт срабатывал.
Если провести оптимизацию в которой используется функции FrameAdd OnTester OnTesterDeinit, в общем кто то из них загружает на график в терминале оптимизируемого советника.
Так вот если скрипт с FrameNext запустить на этом графике с прикреплённым экспертом, то скрипт нормально работает )))
Можно было бы читать из файла с записаными фреймами, но у меня судя по всему проблема с компом, так как то открывает файл, то нет.
Ну или как выше объяснил Дмитрий, файл у меня то открывается(значит не открывается), то не открывается(значит открывается).
Как то так.
Я сначала сделал чтоб инфа из фреймов записывалась в файлы, а потом захотел лишний шаг(запись в файлы) убрать и сразу из фреймов строить графики. Но не получилось.
У себя я в OnTesterDeinit() все собранные фреймы распределил по парам, выделил наилучшую пару, и информацию по ней записал в файл. А потом, информацию из этого файла - использую для формирования настроечных параметров для советника.
Ну а в твоем случае - я бы всю информацию скидывал бы в файл, и потом - использовал бы ее для построения графиков.
Ну, я в своем случае сделал именно так.
В OnTesterDeinit() все собранные фреймы распределил по парам, выделил наилучшую пару, и информацию по ней записал в файл. А потом, информацию из этого файла - использую для формирования настроечных параметров для советника.
Ну а в твоем случае - я бы всю информацию скидывал бы в файл, и потом - использовал бы ее для построения графиков.
Ну так я по вашему совету полез смотреть, что такое фреймы и с чем их едят )))
Смотрю, а там фреймы все в файл сваливаются, вот и подумал, а зачем мне его переписывать в свой, если он уже есть )))
Разберусь с компом, так и сделаю. какая разница из какого файла строить графики, а сортировку что строим , а что нет можно сделать на этапе отправки фрейма из эксперта.
Зачем вам файлы?
Собирайте нужные данные в процессе каждого тестерного прохода и отправляйте их во фрейм (FrameAdd).
В этом же советнике стройте нужные графики прямо по ходу оптимизации (OnTesterPass) или после ее завершения (OnTesterDeinit).
Вот тут готовый код — https://www.mql5.com/ru/articles/4395
Зачем вам файлы?
Собирайте нужные данные в процессе каждого тестерного прохода и отправляйте их во фрейм (FrameAdd).
В этом же советнике стройте нужные графики прямо по ходу оптимизации (OnTesterPass) или после ее завершения (OnTesterDeinit).
Вот тут готовый код — https://www.mql5.com/ru/articles/4395
Спасибо.
Статью, я конечно читал, многое в ней для себя почерпнул.
После того как написал это https://www.mql5.com/ru/code/36058 , сразу начал переделывать, потому как не то, что хотелось.
Сначала сделал именно так как вы советуете, но выяснилось, что скринов получается сильно много и найти в них, что то нужное очень проблематично.
Фильтры!!!
Да фильтры это хорошо, скринов меньше, но если в фильтрах указать не правильные параметры, то скринов может не оказаться совсем. Тоже не айс, особенно если оптимизация занимает не один день.
Поэтому собственно и появилась эта тема с вопросом "почему", потому, что оказалось нужно строить графики не только во время или сразу после, но и возможно намного после и не один раз. Попытался в скрипте использовать FrameNext(), но не получилось. Ну попытка не пытка, дорогу осилит идущий и т.д. )))
Решил, сделать так: в самом советнике, минимальные фильтры, не выгружать те проходы прибыль которых меньше нуля и те, которые завершились прерыванием тестирования функцией TesterStop(), тоже типа фильтра, но ускоряет оптимизацию в разы.
В OnTesterDeinit выгружаем всё в файл такой же как и .mqd , но со своей структурой, и уже с этим файлом будет работать скрипт в котором можно выставить разные фильтры.
Потом я правда сделал выгрузку не в один файл, а в кучу маленьких файлов, мне так проще осуществлять в них поиск нужных.
Кроме фильтров , по прибыли, просадке, макс число убыточных сделок и т.д. хочу ещё прикрутить какой нибудь другой анализ графиков, типа отношение трендовой прибыли к среднеквадратичному отклонению (этот код есть в справочнике), и из этой статьи https://www.mql5.com/ru/articles/1492 мне понравилась линия линейной регрессии и коэффициент линейной корреляции, ну и ещё чего нибудь прикрутить для лучшей визуализации.
Основная проблема сейчас с юзабельностью. Обычный пользователь не станет ничего копировать в код советника, а программистам этот мой код нафик не нужен.
Вот подсказал бы кто как сделать так, чтоб обойтись без вставок в код советника, ну или хотя бы, чтоб вставка была одна, ссылка на библиотеку. А то сейчас надо вставлять код и в OnTick() и в OnTradeTransaction(), не удобно это всё.
Всё конечно можно было бы упростить, собрав просто в OnTester() историю сделок, но тогда я не смогу построить график эквити, а он на мой взгляд намного важнее графика баланса.
В общем помаленьку, работа продвигается, в том числе благодаря всем откликнувшемся на вопрос.
Основная проблема сейчас с юзабельностью. Обычный пользователь не станет ничего копировать в код советника, а программистам этот мой код нафик не нужен.
Вот подсказал бы кто как сделать так, чтоб обойтись без вставок в код советника, ну или хотя бы, чтоб вставка была одна, ссылка на библиотеку. А то сейчас надо вставлять код и в OnTick() и в OnTradeTransaction(), не удобно это всё.
Ну, с этого нужно было начать.
Сделать полный функционал для закрытых советников не получится.
Ну, с этого нужно было начать.
Сделать полный функционал для закрытых советников не получится.
Та не, про закрытые я не думал. Просто хотелось бы сделать, чтоб использование было максимально простым.
Есть же люди которые используют советники и индикаторы из CodeBase, вот надо сделать так, чтоб им было понятно как пользоваться этим.
Нет, без вставки кода - никак не обойтись.
А значит, надо просто максимально изолировать эти вставки, сделать их предельно простыми. Чтобы каждая вставка была одной строкой.
По сути, чтобы для подключения системы надо было бы выполнить три действия - в заголовок подключить .mhq файл, в функцию OnTick() в самом начале вставить строку, и в функцию OnTradeTransaction() вставить другую строку.
В таком виде - большинство интересующихся смогут все запустить.
Нет, без вставки кода - никак не обойтись.
А значит, надо просто максимально изолировать эти вставки, сделать их предельно простыми. Чтобы каждая вставка была одной строкой.
По сути, чтобы для подключения системы надо было бы выполнить три действия - в заголовок подключить .mhq файл, в функцию OnTick() в самом начале вставить строку, и в функцию OnTradeTransaction() вставить другую строку.
В таком виде - большинство интересующихся смогут все запустить.
Понятно. У меня именно так и сделано, я думал может быть есть способ сделать ещё проще. Ну да ладно, как говорится, дареному коню... кому надо разберутся)))