Ошибки, баги, вопросы - страница 3028
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Игорю тоже скоро надоест…
у меня лишь желание разобраться
в МТ5 много подводных камней с синхронизацией, сейчас вопрос как раз и про это
имхо, если в индикаторе используются построения на каждом баре (линии, а не стрелки)
то достаточно такого цикла для экономного расчета:
если будет первый вызов, то prev_calculated будет = 0, в последующие вызовы будут пересчитаны новые бары
и если оба индикатора будут написаны правильно, то не нужно ничего синхронизировать дополнительно, все будет работать, останется лишь сравнивать CopyBuffer() с требуемым количеством значений вызываемого индикатора
у меня лишь желание разобраться
в МТ5 много подводных камней с синхронизацией, сейчас вопрос как раз и про это
имхо, если в индикаторе используются построения на каждом баре (линии, а не стрелки)
то достаточно такого цикла для экономного расчета:
если будет первый вызов, то prev_calculated будет = 0, в последующие вызовы будут пересчитаны новые бары
и если оба индикатора будут написаны правильно, то не нужно ничего синхронизировать дополнительно, все будет работать, останется лишь сравнивать CopyBuffer() с требуемым количеством значений вызываемого индикатора
И я об этом же. Ладно-бы пытаться синхронизировать перед первым запуском, а так…………
у меня лишь желание разобраться
в МТ5 много подводных камней с синхронизацией, сейчас вопрос как раз и про это
имхо, если в индикаторе используются построения на каждом баре (линии, а не стрелки)
то достаточно такого цикла для экономного расчета:
если будет первый вызов, то prev_calculated будет = 0, в последующие вызовы будут пересчитаны новые бары
и если оба индикатора будут написаны правильно, то не нужно ничего синхронизировать дополнительно, все будет работать, останется лишь сравнивать CopyBuffer() с требуемым количеством значений вызываемого индикатора
если есть желание разобраться, а не оппонировать, то Вам следовало бы написать что то вроде ниже показанного кода:
скомпилируйте оба кода и запустите второй. получите что то вроде этого в логах при запуске на М1 и М3 старшего индикатора:
2021.05.28 19:05:01.408 OldTF (EURUSD,M3) 0.000234 sec, расcчитано 50000 баров, всего баров 50000
2021.05.28 19:05:03.860 LitTF (EURUSD,M1) 0.007452 sec, расcчитано 50023 баров, всего баров 50023
2021.05.28 19:06:00.670 OldTF (EURUSD,M3) 0.000001 sec, расcчитано 1 баров, всего баров 50001
2021.05.28 19:06:02.211 LitTF (EURUSD,M1) 0.008180 sec, расcчитано 50024 баров, всего баров 50024
2021.05.28 19:07:00.780 LitTF (EURUSD,M1) 0.000004 sec, расcчитано 1 баров, всего баров 50025
2021.05.28 19:08:01.246 LitTF (EURUSD,M1) 0.000014 sec, расcчитано 1 баров, всего баров 50026
2021.05.28 19:09:00.959 OldTF (EURUSD,M3) 0.000000 sec, расcчитано 1 баров, всего баров 50002
2021.05.28 19:09:01.775 LitTF (EURUSD,M1) 0.006898 sec, расcчитано 50027 баров, всего баров 50027
2021.05.28 19:10:00.830 LitTF (EURUSD,M1) 0.000004 sec, расcчитано 1 баров, всего баров 50028
даже невооружённым взглядом можете заметить во первых, наискорейший из возможных вариантов построения быстрых индикаторов, во вторых, что прев кальк таки обнуляется тогда,
когда его не просят и это приведёт к значительному необоснованному снижению производительности при оптимизации. в данном примере индикатор вынужден полностью пересчитаться на кадом новом баре М3. если не делать синхронизацию, то будете получать дыры при построении индикатора.
Тады, тьфу на вас…
Разработчики на такие глупости не реагируют, Игорю тоже скоро надоест… И оставайтесь разговаривать сам с собою…
Только надо барабашку попросить перенести ваши излияния в отдельную тему, чтобы не загаживать нужную…
посмотрите код выше, съешьте свой паспорт, посыпьте голову пеплом и засуньте свою спесь себе туда, где её никому не будет видно.
это не должно корректно работать в индикаторах:
если не ошибаюсь, то в справке есть разбор скрипта для подкачки данных по всем ТФ и должно быть предупреждение, что нельзя так запрашивать исторические данные из индикатора по причине того, что индикатор работает асинхронно
да и BarsCalculated() рекомендуют использовать один раз после связывания хэндла
UPD: скрипт для подкачки истории и объяснение, почему это не работает в индикаторах: https://www.mql5.com/ru/docs/series/timeseries_access
В этой статье написано только, что в индике нежелательно запрашивать данные из таймсерии (или запрашивать SeriesInfoInteger в цикле)
"Напомним, что отправка запроса на обновление таймсерии с тем же периодом, что и у индикатора, вызывающего обновление, крайне нежелательна. Нежелательность запроса данных по тому же символу-периоду, что и у индикатора обусловлена тем, что обновление исторических данных производится в том же потоке, в котором работает индикатор. Поэтому велика вероятность клинча."
Если же просто запросить SeriesInfoInteger и, в случае false выйти из OnCalculate, то как здесь может наступить клинч?
Вопрос ко всем:
в справке https://www.mql5.com/ru/docs/series/timeseries_access сказано:
"При вызове функций, осуществляющих копирование любых данных из таймсерий, необходимо иметь в виду то, что параметр start (номер бара, с которого начинать копирование ценовых данных) всегда должен быть в пределах доступной истории терминала. Если у нас имеется только 100 баров, то не имеет смысла пытаться скопировать 300 баров, начиная с бара с индексом 500. Такой запрос будет воспринят как ошибочный и не будет обработан, т.е. никакая история с торгового сервера подгружена не будет."
Что CopyTime выдаст -1, это понятно, но - будет ли инициирован сам процесс на построение таймсерии/ подкачки с сервера баров вплоть до 800го (500+300) или нет?
Подскажите, плиз.
1. В этой статье написано только, что в индике нежелательно запрашивать данные из таймсерии (или запрашивать SeriesInfoInteger в цикле)
"Напомним, что отправка запроса на обновление таймсерии с тем же периодом, что и у индикатора, вызывающего обновление, крайне нежелательна. Нежелательность запроса данных по тому же символу-периоду, что и у индикатора обусловлена тем, что обновление исторических данных производится в том же потоке, в котором работает индикатор. Поэтому велика вероятность клинча."
2. Если же просто запросить SeriesInfoInteger и, в случае false выйти из OnCalculate, то как здесь может наступить клинч?
1. Да, потому что нельзя тормозить поток индикатора, потому что запрос статуса синхронизации приведёт к подкачке истории, а ждать нельзя.
2. Верно. Если данные не готовы, то просто произойдет выход из онкалк, при этом запуститься терминалом синхронизации но при этом поток индикатора не будет заторможен. Следующий онкальк сможет выполниться полностью и без тормозов только когда данные будут готовы а запрашиваемый индикатор полностью посчитан. Выше в коде добавил принт, демонстрирующий, что запрашиваемый индикатор готов далеко не всегда, но для максимально быстрого расчета всех индикаторов мы можем себе позволить обсчитывать бар новый лишь один раз, а не на каждом тике.
Спасибо.
еще, посмотрите мой вопрос :https://www.mql5.com/ru/forum/1111/page3028#comment_22557528
Andrey Dik:
посмотрите код выше,
Исправьте свой код, добавьте распечатку
и когда увидите своих тараканов, сверните монитор в трубочку и засуньте… сами знаете куда.
Спасибо.
еще, посмотрите мой вопрос :https://www.mql5.com/ru/forum/1111/page3028#comment_22557528
я не уверен по этому вопросу на 100% (нужно проверять), убедившись, что запрашиваемая дата свежее, чем есть на сервере самая первая в истории, можно запрашивать данные, история будет подкачена.
я не уверен по этому вопросу на 100% (нужно проверять), убедившись, что запрашиваемая дата свежее, чем есть на сервере самая первая в истории, можно запрашивать данные, история будет подкачена.
Спасибо,
я спрашивал про другой свой пост, еще раз ссылка : https://www.mql5.com/ru/forum/1111/page3028#comment_22557528