Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Нет такой функции. Более того, непонятно, зачем она может быть нужна.
Это было предложение создать ее и использовать через вызов из основной OnTester (), а не терять в части ситуаций свою OnTester (). Ну я то разобрался более менее с библиотекой, но другие могут потерять и не найти, где она потерялась))
Расчет комиссий примерно 0,25 сек или 2,5%.Добавил код расчета свопов и проверил время - потребляет примерно 0,3 секунды или 3%. Расчет можно ускорить, если не для каждого ордера считывать эти переменные из терминала, а где то один раз их считать и потом использовать из переменных. Нужен какой то VIRTUAL::OnInit() для этого
потребляет примерно 0,3 секунды или 3%.
Расчет комиссий примерно 0,25 сек или 2,5%.Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: Virtual
fxsaber, 2023.11.23 16:43
Оставляю на будущее советник для замера производительности.
Есть предложение по ускорению.
Свежая история про ускорение. 20 ядер делали оптимизацию. Все агенты посчитали свою пакет заданий и ждут только одного, который выполнил 87/88 заданий и висит долго. Надо было разобраться, почему висит.
Пока висел, скопировал opt-файл. Когда отвис - снова скопировал. Получил два opt-файла. Второй оказался на 233 (а не 88) прохода длиннее. Вытащил оттуда настройки этих проходов и посмотрел на домашней машине, будут ли тормозить в одиночных прогонах. Взял на пробу самый последний в записи, и он оказался тормозным: половину тиков прогнал за 20 секунд, а вторую половину тиков не дождаться, замедление с каждым тиком происходит.
Немного удивился своей компетенции, потому что без профилировщика сразу понял потенциальную проблему - выделение памяти под историю торговли.
Сделал такую замену.
И сразу исчезли тормоза. Как оказалось, было 2.5 миллиона закрытых позиций. Virtual их быстро проглотил после этой замены. Рекомендую подправить у себя.
На каждый тик в среднем приходится 2.5 OrdersTotal(), 0.5 OrderModify(), 7.8 OrderType(), 5.1 OrderSelect() и т.д. Это позволяет примерно понимать, сколь сильно идет злоупотребление вызовами.
Таким способом можно свои советники сделать экономнее, даже если виртуалка не используется. Ну и по ускорению виртуалки есть над чем подумать. Например, ORDER::IsChange вызывается 3.4 раза на тик, что много.
Сделал такую замену.
И сразу исчезли тормоза. Как оказалось, было 2.5 миллиона закрытых позиций. Virtual их быстро проглотил после этой замены. Рекомендую подправить у себя.
Да, я тоже заметил то, что время расчетов не росло линейно. Неделя 10 сек, 5 недель около 4 минут. Тоже подумал про ресайз массива, но занимался свопами. Сделал эту правку и себе, теперь увеличение с 1 до 5 недель увеличивает время расчета в 5,5 раз, т.е. примерно линейно (не ровно в 5 раз м.б. потому, что тиков там больше, и ресайз все таки делается иногда). Спасибо! Если уж такими огромными шагами стали увеличивать массив, то может и для активных ордеров задать 1000 по умолчанию? Памяти сейчас у всех много, скорость важнее.
Надо будет посмотреть. Вопрос лишь в целесообразности. Используют в качестве тестера один-два человека.
Возможно так мало используют, что не видят точного совпадения с тестером MQ.
Добавил в VIRTUAL функции для контроля открытости рынка для торговли, как вы советовали делать это в своем OnTick(). Но надо и там, чтобы ТП/СЛ/Лимитки не срабатывали при закрытом рынке. Так же сделал проброс последнего тика в конце теста, для закрытия сделок в конце теста по последней цене на 59 минуте, а не по последней цене торговой сессии на 54 минуте (отличались профиты по этим сделкам). Еще поменял порядок их закрытия, чтобы совпадало с тестером MQ.
Добавил расчет комиссий в % от лота. На моем ДЦ 0,0016% за лот и берется 2 раза, на входе и выходе. Раньше там было указано, что берется в двойном размере на входе. Проверил эту версию, не совпало с тестером. Ф-я которая была у меня раньше всегда рассчитывала по Bid цене - тоже не совпало, примерно 1% сделок имели комиссию больше на 1 цент. Попробовал расчитывать комиссию за покупку при входе по Ask, а при выходе по Bid и наоборот при продаже на входе. Результат комиссий стал абсолютно точно совпадать с тестером MQ.
В итоге получил полное совпадение по всем параметрам: комиссии, свопы, и итоговый профит.
Вот анимированный Гиф: (прикрепил, если в сайт не покажет)
Правок много. Могу скинуть код вам, чтобы вы добавили его в свой и обновили библиотеку. Видимо придется сделать совместимость с MQL4, я его не знаю и делал чисто под MQL5. Может что-то еще проверить, я не все функции знаю и для чего они. Смотреть отличия где я что добавил можно в Notepad++ с плагином Compare.
Если такой GIF разместить в описании библиотеки и пример запуска, чтобы каждый мог проверить, то пользователей может стать больше. Но и вопросов по библиотеке станет больше от новичков))
Я вот теперь убедился в точности работы и могу спокойно продолжать работу над советником используя виртуальный тестер. Спасибо Вам! Огромная работа.
По скорости, какие расчеты насколько замедляют самую быструю версию без свопов, комиссий и контроля тиков: (уже с новым ресайзом массива истории)
5 недель на вашем последнем примере, чтобы не миллисекунды сравнивать.
без контроля без свопов без комиссий - быстрая версия
OnTester result 2231715
2927398 ticks, 7477 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:09.896 (including ticks preprocessing 0:00:00.312).
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.451.
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.521.
2927398 ticks, 7477 bars generated. Environment synchronized in 0:00:00.022. Test passed in 0:00:09.933 (including ticks preprocessing 0:00:00.312).
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.463.
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.481.
в среднем 9,5 сек
комис в %
OnTester result -5615401.2
2927398 ticks, 7477 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:17.969 (including ticks preprocessing 0:00:00.328).
2927398 ticks, 7477 bars generated. Test passed in 0:00:17.354.
2927398 ticks, 7477 bars generated. Test passed in 0:00:17.796.
в среднем 17,5 сек медленне на 84%
комис в пунктах
OnTester result -7047933
ticks, 7477 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:10.178 (including ticks preprocessing 0:00:00.312).
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.751.
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.766.
в среднем 9,8 сек медленне на 3%
своп
OnTester result 2230654.96
2927398 ticks, 7477 bars generated. Environment synchronized in 0:00:00.022. Test passed in 0:00:09.501 (including ticks preprocessing 0:00:00.312).
2927398 ticks, 7477 bars generated. Test passed in 0:00:08.846.
2927398 ticks, 7477 bars generated. Test passed in 0:00:08.841.
2927398 ticks, 7477 bars generated. Environment synchronized in 0:00:00.022. Test passed in 0:00:09.283 (including ticks preprocessing 0:00:00.312).
2927398 ticks, 7477 bars generated. Test passed in 0:00:08.853.
2927398 ticks, 7477 bars generated. Test passed in 0:00:08.840.
странно, что быстрее, возможно редактор лучше оптимизировал код при компиляции, иногда он 3-4 сек компилирует, а иногда 7-8 сек.
в среднем 8,9 сек быстрее на 6%
контроль тиков
OnTester result 2754428
2927398 ticks, 7477 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:10.344 (including ticks preprocessing 0:00:00.312).
2927398 ticks, 7477 bars generated. Test passed in 0:00:10.026.
2927398 ticks, 7477 bars generated. Test passed in 0:00:10.001.
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.943.
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.901.
в среднем 10 сек медленне на 5%
своп , комис в пт, контроль тиков
OnTester result -6461417
2927398 ticks, 7477 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:09.715 (including ticks preprocessing 0:00:00.312).
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.299.
2927398 ticks, 7477 bars generated. Test passed in 0:00:09.403.
ticks, 7477 bars generated. Test passed in 0:00:09.305.
в среднем 9,4 сек быстрее на 1%
своп, комис в %, контроль тиков
OnTester result -5038568.32
2927398 ticks, 7477 bars generated. Test passed in 0:00:18.092 (including ticks preprocessing 0:00:00.359).
2927398 ticks, 7477 bars generated. Test passed in 0:00:17.375.
2927398 ticks, 7477 bars generated. Test passed in 0:00:17.367.
в среднем 17,5 сек медленне на 84%
своп, комис в %
OnTester result -5616461.24
2927398 ticks, 7477 bars generated. Environment synchronized in 0:00:00.021. Test passed in 0:00:18.642 (including ticks preprocessing 0:00:00.312).
2927398 ticks, 7477 bars generated. Test passed in 0:00:17.880.
2927398 ticks, 7477 bars generated. Test passed in 0:00:17.429.
в среднем 17,7 сек медленне на 86%
В общем самый лучший/точный вариант комиссии в % замедляет расчеты на 85% примерно. Это конечно много, но для демонстрации тем, кто хочет своими глазами увидеть абсолютное совпадение с тестером MQ, это может быть нужно.
А свопы действительно часто меняются, сегодня опять поменяли.
Добавил в VIRTUAL функции для контроля открытости рынка для торговли, как вы советовали делать это в своем OnTick(). Но надо и там, чтобы ТП/СЛ/Лимитки не срабатывали при закрытом рынке.
Так же сделал проброс последнего тика в конце теста, для закрытия сделок в конце теста по последней цене на 59 минуте, а не по последней цене торговой сессии на 54 минуте (отличались профиты по этим сделкам).
Так это неправильно! Анимированая гифка даже показывает фиолетовым цветом выход за пределы торговой сессии Тестером.
Возможно так мало используют, что не видят точного совпадения с тестером MQ.
...
Если такой GIF разместить в описании библиотеки и пример запуска, чтобы каждый мог проверить, то пользователей может стать больше.
Думаю, проще - возможностей Тестера хватает.
Достаточно OnTick.
Да -для советников с вирт. тестером созданным по VIRTUAL::Create();
Внутренний контроль нужен для версий советника с #define VIRTUAL_TESTER , как в вашем последнем примере. Там мой OnTick уже вторичный, и вызывается из виртуального тестера через #define OnTick OldOnTick2. Т.е. мой OnTick не может остановить виртуальный, он срабатывает позже. Я так понял. Могу и ошибаться.
Так это неправильно! Анимированая гифка даже показывает фиолетовым цветом выход за пределы торговой сессии Тестером.
Сделал так, для точного соответствия MQ тестеру. В реальной торговле закрыться сделки при закрытой сессии не смогут конечно. Видимо это просто фиксация эквити на момент конца теста. Для своих целей вообще не буду учитывать незакрытые сделки.
Думаю, проще - возможностей Тестера хватает.
Хорошо.
Моя доработка и скриншот покажут сомневающимся, что тестер работает правильно, вплоть до абсолютного совпадения с MQ тестером, если считать комиссии по % и свопы.
Возможно я и сам не буду с реальной комиссией по % считать, из за значительного замедления. Хотя попробую ускорить, там можно часть переменных предварительно рассчитать, в т.ч. самые медленные строковые.
Чаще всего даже не подозреваем, сколько советник чего вызывает. Поэтому вставил счетчик. Такой результат получил.
На каждый тик в среднем приходится 2.5 OrdersTotal(), 0.5 OrderModify(), 7.8 OrderType(), 5.1 OrderSelect() и т.д. Это позволяет примерно понимать, сколь сильно идет злоупотребление вызовами.
Таким способом можно свои советники сделать экономнее, даже если виртуалка не используется. Ну и по ускорению виртуалки есть над чем подумать. Например, ORDER::IsChange вызывается 3.4 раза на тик, что много.
по тому и просится, вернуть обычный режим профилирования
кто знает где-то что забагалось и будет крутиться вертеться месяцами в пустую, да и вообще с тем вариантом проще было в понимании, можно было просто рассчитать сколько на что считается,
и не важно даже было сколько это занимает времени, главное убрать лишние если есть (а все остальное разработчики посмотрят сами как работает), но разработчики решили иначе (у них в общем то свой интерес в этом, а он абсолютно может отличаться от обычного домашнего рабочего).
как вообще соотносится в профайлере, когда ты точно знаешь что посчиталось и нашел лишние(прошлый вариант). И - функция работает медленно..., это ведь обычно будет не добывательство Pi в последней степени, а если затуп просто системной функции, или ее обычная работа.
ощущение что Терминал лет 5 назад начал не в том направлении развиваться, и давно пора искать в чем причина
Разработчики могут тут гордиться что они тут всю жизнь вложили, а раз в 1000 больше не вложили жизнь?? Если Ренат так и не хочет понимать это...