Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Код теста:
Этот код показывает, что автор не понимает проблемы.
Этот советник получает Bid-цену текущего символа двумя способами. Для каждого из них он суммирует время выполнения длительных по исполнению случаев. И затем показывает разницу между ними.
Загрузил 6/8 Агентов. И запустил этот советник на шести чартах (разные символы) на демо-сервере RannForex-Server. Результат.
Имеем полное доказательство того, что суммарное время (TimeBid1) выполнения SYMBOL_BID катастрофически проигрывает (TimeBid2) альтернативному получению Bid-цены.
Такое костыльное решение получения текущих цен уделывает по производительности самую главную функцию MQL5. Согласны с этим доказательством?
Жаль, раньше не пришел в голову этот красноречивый костыль.
ЗЫ Для работы советника нужно разрешить алготорговлю. Поэтому только на демо-счетах запускать.
Этот советник получает Bid-цену текущего символа двумя способами.
POSITION_PRICE_CURRENT снепшотится?
Тогда что с чем сравниваем? Получение последней сохраненной (когда?) цены с получением последней известной терминалу цены?
Ну и про 6 из 8 ядер сказали прямо. Зачем такие тесты?
Этот код показывает, что автор не понимает проблемы.
Ваше утверждение доказывает, что вы не хотите видеть очевидного.
Этот код показывает, что нет никаких "тормозов SymbolInfoTick".
На более-менее современном железе время выполнения SymbolInfoTick не превышает 1 МИКРОсекунды.
Этот советник получает Bid-цену текущего символа двумя способами. Для каждого из них он суммирует время выполнения длительных по исполнению случаев. И затем показывает разницу между ними.
Загрузил 6/8 Агентов. И запустил этот советник на шести чартах (разные символы) на демо-сервере RannForex-Server. Результат.
Имеем полное доказательство того, что суммарное время (TimeBid1) выполнения SYMBOL_BID катастрофически проигрывает (TimeBid2) альтернативному получению Bid-цены.
Такое костыльное решение получения текущих цен уделывает по производительности самую главную функцию MQL5. Согласны с этим доказательством?
Жаль, раньше не пришел в голову этот красноречивый костыль.
ЗЫ Для работы советника нужно разрешить алготорговлю. Поэтому только на демо-счетах запускать.
Нет, это не доказательство. Абсолютно грязный тест, который невозможно воспринимать серьезно.
Подробно даже разбирать не буду, достаточно того, что вы опять делаете замер времени единичного колла через GetMicrosecondCount(), и опять на фоне "Загрузил 6/8 Агентов" на 4 ядерном цпу.
Я уже наглядно показывал выше, что так можно и в выполнении "x++" воображаемые тормоза найти.
Ваше утверждение о "тормозах SymbolInfoTick" элементарно проверяется и опровергается моим кодом, очень простым и очевидным.
Изначальная реализация SymbolInfoTick хоть и была достаточно быстрой, но действительно при стрессовой многопоточной нагрузке допускала единичные выбросы времени исполнения на отдельных потоках.
В последних билдах она лишена и этого недостатка.
Просто удивительно, что вы продолжаете спорить с человеком, который точно знает о чем говорит, т.е. видит реализации и может их профайлить в различных режимах.
"Давайте спорить о вкусе устриц и кокосовых орехов с теми, кто их ел".
POSITION_PRICE_CURRENT снепшотится?
Нет. MT4Orders используется только для выставления позиции.
Тогда что с чем сравниваем? Получение последней сохраненной (когда?) цены с получением последней известной терминалу цены?
Сравниваем длительность получения цены из Обзора рынка и позиции. Цены, конечно, совпадают.
Ну и про 6 из 8 ядер сказали прямо. Зачем такие тесты?
Только для того, чтобы даже слепому было видно, что проблема есть. Ну это же бред, когда Bid-цена через позицию не тормозит, а SymbolInfoTick - лагает по-страшному.
Чувствую, что без поддержки форумчан эту MQ-стену не пробить. Код короткий, профи должны быстро въехать. Нет там изъянов. Четко показано, что цены через позиции получаются значительно быстрее, чем из Обзора рынка. Как MQ не видят очевидного - не понимаю.
Ваше утверждение доказывает, что вы не хотите видеть очевидного.
Этот код показывает, что нет никаких "тормозов SymbolInfoTick".
На более-менее современном железе время выполнения SymbolInfoTick не превышает 1 МИКРОсекунды.
Нет, это не доказательство. Абсолютно грязный тест, который невозможно воспринимать серьезно.
Подробно даже разбирать не буду, достаточно того, что вы опять делаете замер времени единичного колла через GetMicrosecondCount(), и опять на фоне "Загрузил 6/8 Агентов" на 4 ядерном цпу.
Я уже наглядно показывал выше, что так можно и в выполнении "x++" воображаемые тормоза найти.
Ваше утверждение о "тормозах SymbolInfoTick" элементарно проверяется и опровергается моим кодом, очень простым и очевидным.
Изначальная реализация SymbolInfoTick хоть и была достаточно быстрой, но действительно при стрессовой многопоточной нагрузке допускала единичные выбросы времени исполнения на отдельных потоках.
В последних билдах она лишена и этого недостатка.
Просто удивительно, что вы продолжаете спорить с человеком, который точно знает о чем говорит, т.е. видит реализации и может их профайлить в различных режимах.
"Давайте спорить о вкусе устриц и кокосовых орехов с теми, кто их ел".
Вы не смотрели код. Не верю в некомпетентность.
Это условие, при котором только если выполнение длилось больше 100 мкс, оно учитывается. Если считаете это малым значением, сделайте на порядок больше. Эффект тот же самый.
Обе сравниваемые функции находятся в абсолютно равных условиях. Одна по итогу тормозит, другая - нет. Посмотрите еще раз внимательно, что замеряет код.
На данный момент замена в боевых советниках SymbolInfoTick на предложенный костыль убирает почти все тормоза, связанные с получением текущих цен. Это бредово, но, к сожалению, это так.
ЗЫ Обращаю внимание на while в OnTick. Он специально сделан, чтобы поймать тики, которые пришли после того, что акцептировал OnTick. Код не на ровном месте писался. Это не абсолютно искусственный for-цикл с измерением средней температуры по больнице в идеальных условиях.
Чувствую, что без поддержки форумчан эту MQ-стену не пробить. Код короткий, профи должны быстро въехать. Нет там изъянов. Четко показано, что цены через позиции получаются значительно быстрее, чем из Обзора рынка. Как MQ не видят очевидного - не понимаю.
На глаз, в коде действительно нет ошибок, стало быть SymbolInfoTick тормозит по сравнению с получением цены открытой позиции
прикольный хак получать цену из позиции, не допетрил бы и даже бы не догадался никогда что может быть такая разницаТолько для того, чтобы даже слепому было видно, что проблема есть. Ну это же бред, когда Bid-цена через позицию не тормозит, а SymbolInfoTick - лагает по-страшному.
попробуйте протестировать SymbolInfoTick когда в обзоре рынка один символ и когда несколько десятков символов, но запрашивайте один инструмент - как в Вашем примере
высока вероятность, что с сервера идет сжатый трафик и эти периодические тормоза SymbolInfoTick появляются когда происходит распаковка данных
т.е. когда много символов будет еще более частые или глубокие провалы во времени теста
ну и соответственно, если это подтвердится, то переделывать всю архитектуру.... сомнительное удовольствие
попробуйте протестировать SymbolInfoTick когда в обзоре рынка один символ и когда несколько десятков символов, но запрашивайте один инструмент - как в Вашем примере
высока вероятность, что с сервера идет сжатый трафик и эти периодические тормоза SymbolInfoTick появляются когда происходит распаковка данных
т.е. когда много символов будет еще более частые или глубокие провалы во времени теста
Эта гипотеза касается этого случая, когда цены в Обзоре рынка отстают от цен стакана (и наоборот). Но мы пока говорим только о тормозах самой SymbolInfoTick внутри Терминала, не затрагивая вопрос актуальности цен.
Обе сравниваемые функции находятся в абсолютно равных условиях.
Как минимум, GetBid вызывается после SymbolInfoDouble. Если поменять местами, результат не изменится?
Мне что-то подсказывает, что POSITION_PRICE_CURRENT берет сохраненную цену, а не пытается получить свежую.
Ну и повторюсь, не вижу смысла в тестировании на 80% загруженном процессоре. Тестируем производительность проца и распределение ресурсов виндой, а не нужные функции.
Как минимум, GetBid вызывается после SymbolInfoDouble. Если поменять местами, результат не изменится?
Экспериментировал с этим еще до публикации. Нет влияет на результат.
Мне что-то подсказывает, что POSITION_PRICE_CURRENT берет сохраненную цену, а не пытается получить свежую.
В том и дело, что MQL-прогам нужна последняя цена, пришедная в Терминал, а не что-то другое. Когда приходит тик в Терминал, он автоматически обновляет все таблицы с позициями/ордрерами.
Ну и повторюсь, не вижу смысла в тестировании на 80% загруженном процессоре. Тестируем производительность проца и распределение ресурсов виндой, а не нужные функции.
Главное условие - идентичность окружения для обеих функций. Загрузка ЦПУ - более яркий фактор для заметности расхождений.
Параллельно 20 советников иногда могут одновременно сделать вызов SymbolInfoTick, тогда происходит миллисекундный всплеск нагрузки и появляются лаги. Я всего лишь предложил это сделать явно, чтобы сразу была заметна проблема.
Повторюсь, идентичность условий тестирования соблюдена для обеих функций. Факт.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
MT5 и скорость в боевом исполнении
fxsaber, 2020.10.26 17:53
На данный момент замена в боевых советниках SymbolInfoTick на предложенный костыль убирает почти все тормоза, связанные с получением текущих цен. Это бредово, но, к сожалению, это так.