Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2678
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Спасиб что ответили, но тут не копировщик а массивы с ценами, и последняя при каждом тике обновляется. По этому и спрашиваю по какой логике лучше организовать.
Как средствами mql5 удостовериться, что окружение загрузилось с торгового сервера? То есть функции типа TerminalInfoХХХХ(), AccountInfoХХХХ(), .... возвращают актуальные свежие данные.
Как средствами mql5 удостовериться, что окружение загрузилось с торгового сервера? То есть функции типа TerminalInfoХХХХ(), AccountInfoХХХХ(), .... возвращают актуальные свежие данные.
Что можно добавить к ответу ИИ (Gemini)? Ответ ИИ:
В MQL5 (в отличие от MQL4) многие процессы асинхронны.
Ситуация, когда OnInit() уже запустился, TerminalInfoInteger(TERMINAL_CONNECTED) возвращает true , но баланс счета равен 0 или нет котировок — стандартная проблема._
Терминал может быть «подключен» (socket open), но еще не успел получить пакет данных о счете или синхронизировать историю.
Вот комплексный подход, как гарантировать, что данные свежие.
Ключевые индикаторы "Свежести"
Чтобы быть уверенным на 100%, нужно проверить 3 уровня:
Готовая функция WaitForTerminalSync
Этот код можно использовать в скриптах (с ожиданием) или адаптировать для советников.
Разбор используемых функций
SymbolIsSynchronized(symbol) :
Это самая главная функция для вашего вопроса. Она возвращает true только тогда, когда данные по символу в терминале полностью соответствуют данным на торговом сервере. Если терминал только что запустился и докачивает данные — она вернет false .
TerminalInfoInteger(TERMINAL_PING_LAST) :
Возвращает значение последнего пинга в микросекундах. Сразу после подключения, но до получения первых полезных данных, это значение часто равно 0 . Это хороший индикатор того, что hand-shake с сервером завершен.
AccountInfoInteger(ACCOUNT_LOGIN) :
В момент старта терминала, даже если CONNECTED=true , переменные счета могут быть обнулены на доли секунды. Проверка на > 0 гарантирует, что структура данных аккаунта заполнена.
SeriesInfoInteger(..., SERIES_SYNCHRONIZED) (не использовал в коде выше, но полезно знать):
Если вам нужна история баров (например, iClose , CopyRates ), то нужно проверять именно это свойство. SymbolIsSynchronized гарантирует текущие котировки, а SeriesInfoInteger — исторические данные для построения графиков.
Как применять
В Скрипте (OnStart):
В скриптах нет тиков, поэтому нужно принудительно ждать в цикле (как сделано выше).
В Советнике (OnInit / OnTick):
В OnInit нельзя делать долгие циклы с Sleep (это подвесит терминал). Лучше всего в OnInit проверить базовые вещи, а полноценную логику запускать в OnTick только если проверки прошли:
Что можно добавить к ответу ИИ (Gemini)?
Такие ответы создают впечатление серьезных и правильных, но в них часто встречаются выдуманные вещи. Достаточно одной несуществующей константы, и весь код теряет смысл. А чтобы проверить надо как минимум попробовать самостоятельно скомпилировать этот код. Но даже если ошибок компиляции не будет, то это ещё не будет означать, что код корректно решает поставленную задачу. Такая проверка может занять гораздо большее время.
Можно добавить, что с высокой вероятностью этот код работать не будет, либо он не будет решать поставленную задачу, либо он будет решить её так, что лучше бы не решал.
Такие ответы создают впечатление серьезных и правильных, но в них часто встречаются выдуманные вещи. Достаточно одной несуществующей константы, и весь код теряет смысл. А чтобы проверить надо как минимум попробовать самостоятельно скомпилировать этот код. Но даже если ошибок компиляции не будет, то это ещё не будет означать, что код корректно решает поставленную задачу. Такая проверка может занять гораздо большее время.
То есть вы даже не попытались скомпилировать, не говоря уже о том чтобы вникнуть в суть вопроса и ответа.
Можно почитать рекомендации в документации. На мой взгляд, в начале ответа написана ерунда. Да и в самом вопросе есть смешение разных вещей во что-то одинаковое: информации о ценах и информации о счёте. Этого вполне может оказаться достаточно, чтобы в ответе тоже была использована смесь из несмешиваемого.
Где вы в моём вопросе увидели про историю цен?
Про историю цены есть в ответе ИИ, но это может быть вполне логичным - если уж история цен синхронизирована, то синхронизировано и окружение.
Если же у вас есть конкретный рецепт проверки синхронизации окружения, то не стесняйтесь им поделиться с нами сирыми и убогими, чтобы нам впредь не прибегать к не менее сирым и убогим ИИ.
Aleksey Nikolayev #:
Что можно добавить к ответу ИИ (Gemini)? Ответ ИИ:
...
Тестируйте, проверяйте, исправляйте и дорабатывайте.
Здесь не стоит начинать обсуждение кодов от ИИ.
Если очень хочется всё-таки, то создайте отдельную тему, в которой и пробуйте разобраться в ответах ИИ, просто аккумулированных из открытых источников - т.е. просто собранных "с миру по нитке"
И они ещё удивляются падению посещаемости форума.
Как ошибки ИИ повлияют на увеличение посещаемости форума?
Здесь должны быть правильные и красивые решения, а не сбор "средней температуры по больнице" со всех публичных источников.
Для справки (из исследований, проведенных сотрудниками американской публичной компании Semrush):
Выяснилось, что главный источник знаний для ChatGPT - это не книги и не экспертные базы данных, а ... форумы Reddit (40%), Wikipedia (26%) и далее YouTube, Google и прочее.
Выходит, всемогущий и многомиллиардный ChatGPT не формирует экспертных знаний, а воспроизводит усреднённое мнение толпы.
Это делает рыночный пузырь ИИ еще более наглядным. Все бегают в эйфории от того, как резко ИИ изменит нашу жизнь к лучшему. Вот только это вовсе не ИИ. Он просто всякий мусор в сети ищет быстрее, чем вы.
То есть вы даже не попытались скомпилировать, не говоря уже о том чтобы вникнуть в суть вопроса и ответа.
В этом не было необходимости. Достаточно было прочитать внимательно вопрос и ответ от ИИ.
Где вы в моём вопросе увидели про историю цен?
Про историю цены есть в ответе ИИ, но это может быть вполне логичным - если уж история цен синхронизирована, то синхронизировано и окружение.
Действительно, в вопросе не шла речь про получение цен. Я неправильно сформулировал, но мысль про смешение разных вещей всё равно была той же самой.
Как понимаю, функции TerminalInfoXXX() служат для получения информации о клиентском терминале. Они всегда возвращают правильное значение, если смогли вызваться. Им не нужно ждать чего-то для синхронизации, так как информацию о себе им даёт запущенный терминал.
А функции AccountInfoXXX() служат для получения информации о торговом счёте, которое может быть не установлено сразу после запуска терминала. Например, когда мы первый раз запустили терминал и отказались создавать демо-счёт или подключаться к существующему счёту. Либо нет связи с сервером брокера. То есть этим функциям надо ещё чтобы терминал смог подключиться к серверу брокера и тот передал бы терминалу параметры торгового счёта. Если терминал не смог подключиться, то про то, что в этом случае будут возвращать эти функции в документации не говорится. Возможно потому, что вызвать их в такой ситуации обычно не так просто. Если терминал потерял подключение, то, возможно, эти функции просто будут возвращать последние запомненные параметры счёта. Проверять такое не приходилось, поэтому это только предположение.
Если же у вас есть конкретный рецепт проверки синхронизации окружения, то не стесняйтесь им поделиться с нами сирыми и убогими, чтобы нам впредь не прибегать к не менее сирым и убогим ИИ.
Если под окружением понимать только информацию от TerminalInfoXXX() и AccountInfoXXX(), то в этом случае, наверное, достаточно только возврата true при вызове функции
В этом случае все вызовы AccountInfoXXX() будут возвращать актуальные значения. А TerminalInfoXXX() и так всегда должна возвращать актуальные значения.
Если вы рассматриваете код, который должен выполняться внутри OnTick(), то там и эта проверка не нужна, так как тик может прийти и запустить обработчик только при наличии подключения к торговому счёту.
Поэтому мне не удалось понять, для обработки какой ситуации могут потребоваться такие проверки. Возможно, если вы опишите более подробно ситуацию, которая сподвигла вас на формулировку этого вопроса, то тогда можно будет получить более подходящий ответ.
P.S. ИИ - это очень круто. Но если его ответ вводит в заблуждение, то уже не настолько круто.
Проверять такое не приходилось, поэтому это только предположение.
Данные кешируются, и в них содержатся значения от прошлого успешного подключения.
Чтобы данные о счёте сменились в кеше, нужно ждать несколько секунд.
Эмпирическим путём получено при написании кодов, по-моему, для статьи.