Мне кажется тут есть разница. RefreshRates(), насколько я понимаю обращается к серверу и выдает свежую информацию.
Неправильно. RefreshRates не обращается к серверу.
Каждый скрипт имеет у себя локальную копию части рыночной информации,
которая обновляется при входе в start() или вызове RefreshRates(). Эта
локальная копия информации нужна для того, чтобы у скрипта была
точно закрепленные данные (чтобы вдруг не получилось, что Ask
!= Ask).
MarketInfo() позволяет обращаться напрямую к постоянно обновляемым
данным в Market Watch и получать всегда последнюю информацию.
Ничего непонимаю. Как это "RefreshRates не обращается к серверу.
"?
и при этом "Каждый скрипт имеет у себя локальную копию части
рыночной информации, которая обновляется при входе в start() или
вызове RefreshRates()"
Помоему противоречие какоето. Как это какаято копия локальная
обновляется без обращение к серверу?
И как может случится что "Ask != Ask". Чето путаница какаято.
Да очень просто. При запуске функции start() в советнике/скрипте
программе передаются текущие актуальные значения Bid, Ask и так
далее. Программа начинает работу, не обращаясь за обновлением
этих данных, так как обычно обработка идет очень быстро. Но бывает
так, что в процессе обработки текущая рыночная информация изменилась
( сильные новости или долгая обработка в программе), и фактически
данные устарели. Чтобы устранить этот конфликт, нужно обновить
копию рыночных данных программы даннами из терминала (а там
они всегда свежие). Вот это и делает функция RefreshRates()
Если почитать документацию, то там так и написано.
Обновление данных в предопределенных переменных и массивах-таймсериях. Эта функция используется, когда эксперт или скрипт производит
вычисления в течение долгого времени и нуждается в обновленных
данных. Возвращается TRUE, если данные обновлены, иначе FALSE. Данные
могут не обновиться только по той причине, что они соответствуют
текущему состоянию клиентского терминала. Если данные обновлены,
то обновляется и время поступления последней котировки, которое
возвращается функцией TimeCurrent().
Эксперты и скрипты работают с собственной копией исторических
данных. Копия данных по текущему инструменту создается при
первоначальном запуске эксперта или скрипта. При каждом следующем
запуске эксперта (напомним, что скрипт выполняется однократно и не зависит от приходящих тиков) первоначально
созданная копия обновляется. За то время, пока эксперт или скрипт
работает, может прийти один или несколько новых тиков, поэтому
данные могут устареть.
Renat:
Никто к серверу не обращается. Терминал всегда имеет полное
рыночное окружение (только исторические данные могут подгружаться
в режиме on demand).
Попробуем по другому:
в терминале постоянно в режиме реального времени обновляется
вся рыночная информация
каждый скрипт имеет свой КЕШ для часто используемых данных (Bid,
Ask и тд)
Кеш рыночного окружения для скрипта нужен для того, чтобы заморозить
образ рынка на момент старта и не иметь проблем с тем, что Ask
в одной строке не равен аску в другой. Функция RefreshRates() как раз и обновляет именно этот кеш.
На возникающий вопрос "не понятно, а зачем кеш?" я порекомендую
подумать поглубже самостоятельно.
Из ваших ответов я понял, что функций обращающихся к серверу
в МТ4 нет. (с запросом информации от сервера)
Информация содержащаяся в кеше обновляется только по приходу
информации от сервера.
(насчет того , зачем нужен кеш - понятно)
Я правильно понял ?
Кажется я начинаю понимать.
Между терминалом и сервером существует постоянная синхронизация
котировок Аск и Бид. Возможно клиентский терминал ходит с большой
частотой на сервер за ними
либо эта обратная связь организованна каким либо другим образом
- не важно.
Но в обработке процедуры start() информация не всегда актуальна
- точнее она актуальна только вначале ее отработки.
И чтобы быть 100% уверенным в актуальнсоти котировок нужно выполнить
RefreshRates() - и котировки из некоторого буфера клиентского терминала обновятся
для текущей исполняемой процедуры start().
Надеюсь теперь я правильно все представил?
А как следствие всего мною выше описанного и сказанного вами,
функция MarketInfo() - вернет 100% актуальные котировки и без всяких
RefreshRates().
Renat:
Рекомендую вдумчиво еще раз почитать мои ответы и считать, что
они 100% верны. Не нужно ничего придумывать, точные ответы даны.
Из вышеизложенного следует:
Никакая из функций МТ4 не производит обращения к серверу котировок.
Нет такой.
Вследствие этого возникает вопросы:
Кто обращается за обновляемыми котировками на сервер. Клиентский
терминал - или сервер иницирует отправку обновленных данных
?
Как часто обмен информацией происходит. Где это можно увидеть
? Как частота обновлений регулируется ?
Как происходит процесс:
или сервер по приходу тика обновленный пакет шлет в терминал,
или терминал с какой то частотой запрашивает сервер.
???
Для успешной работы по созданию программ
требуется понимание происходящих процессов.
Работа с черным ящиком несколько затруднительна.
Клиент ничего не запрашивает у сервера по текущей рыночной ситуации.
Сервер сам _все_что_нужно_ шлет клиенту в режиме реального времени.
О частоте говорить нельзя, так как все данные отправляются клиентам
мгновенно без задержек.
Клиент запрашивает данные у сервера только при подгрузке истории
котировок или сделок.
Renat:
Клиент ничего не запрашивает у сервера по текущей рыночной
ситуации. Сервер сам _все_что_нужно_ шлет клиенту в режиме реального
времени. О частоте говорить нельзя, так как все данные отправляются
клиентам мгновенно без задержек.
Клиент запращивает данные у сервера только при подгрузке истории
котировок или сделок..
Благодарю. Теперь стало намного понятней.
Дальше возникает следующий вопрос:
А это происходит как односторонняя высылка данных от сервера,
или в режиме транзакции,
то есть сервер не считает полученными даннными те, которые он
выслал пока получил подтверждения в приеме от клиента.
Или же серверу это без разницы, и вся доставка пакетов (и подтверждения
получения)
происходит через возможности IP/TCP протокола.
Что будет если при связи не со 100% прохождением пакетов (PING) случится
потеря пакета ?
Что будет если при связи не со 100% прохождением пакетов (PING) случится потеря пакета ?
Наш сетевой протокол спроектирован так, что правильно восстанавливается после сетевых разрывов. То есть, графики и тики докачиваются, все синхронизируется и терминал может продолжать нормальную работу. Терминал автоматически обнаруживает все важные изменения и обязательно синхронизируется с сервером. Синхронизация работает экономно, неизменные данные попусту не пересылаются.
Большинство сетевых обновлений/пакетов в системе MetaTrader 4 работает в транзакционной модели, что позволяет очень экономно расходовать сетевой трафик.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Каждый скрипт имеет у себя локальную копию части рыночной информации, которая обновляется при входе в start() или вызове RefreshRates(). Эта локальная копия информации нужна для того, чтобы у скрипта была точно закрепленные данные (чтобы вдруг не получилось, что Ask != Ask).
MarketInfo() позволяет обращаться напрямую к постоянно обновляемым данным в Market Watch и получать всегда последнюю информацию.
Ничего непонимаю. Как это "RefreshRates не обращается к серверу. "?
и при этом "Каждый скрипт имеет у себя локальную копию части рыночной информации, которая обновляется при входе в start() или вызове RefreshRates()"
Помоему противоречие какоето. Как это какаято копия локальная обновляется без обращение к серверу?
И как может случится что "Ask != Ask". Чето путаница какаято.
Если почитать документацию, то там так и написано.
Эксперты и скрипты работают с собственной копией исторических данных. Копия данных по текущему инструменту создается при первоначальном запуске эксперта или скрипта. При каждом следующем запуске эксперта (напомним, что скрипт выполняется однократно и не зависит от приходящих тиков) первоначально созданная копия обновляется. За то время, пока эксперт или скрипт работает, может прийти один или несколько новых тиков, поэтому данные могут устареть.
Никто к серверу не обращается. Терминал всегда имеет полное рыночное окружение (только исторические данные могут подгружаться в режиме on demand).
Попробуем по другому:
- в терминале постоянно в режиме реального времени обновляется
вся рыночная информация
- каждый скрипт имеет свой КЕШ для часто используемых данных (Bid,
Ask и тд)
Кеш рыночного окружения для скрипта нужен для того, чтобы заморозить образ рынка на момент старта и не иметь проблем с тем, что Ask в одной строке не равен аску в другой. Функция RefreshRates() как раз и обновляет именно этот кеш.На возникающий вопрос "не понятно, а зачем кеш?" я порекомендую подумать поглубже самостоятельно.
Информация содержащаяся в кеше обновляется только по приходу информации от сервера.
(насчет того , зачем нужен кеш - понятно)
Я правильно понял ?
Между терминалом и сервером существует постоянная синхронизация котировок Аск и Бид. Возможно клиентский терминал ходит с большой частотой на сервер за ними
либо эта обратная связь организованна каким либо другим образом - не важно.
Но в обработке процедуры start() информация не всегда актуальна - точнее она актуальна только вначале ее отработки.
И чтобы быть 100% уверенным в актуальнсоти котировок нужно выполнить RefreshRates() - и котировки из некоторого буфера клиентского терминала обновятся для текущей исполняемой процедуры start().
Надеюсь теперь я правильно все представил?
А как следствие всего мною выше описанного и сказанного вами, функция MarketInfo() - вернет 100% актуальные котировки и без всяких RefreshRates().
Рекомендую вдумчиво еще раз почитать мои ответы и считать, что они 100% верны. Не нужно ничего придумывать, точные ответы даны.
Никакая из функций МТ4 не производит обращения к серверу котировок. Нет такой.
Вследствие этого возникает вопросы:
Кто обращается за обновляемыми котировками на сервер. Клиентский терминал - или сервер иницирует отправку обновленных данных ?
Как часто обмен информацией происходит. Где это можно увидеть ? Как частота обновлений регулируется ?
Как происходит процесс:
или сервер по приходу тика обновленный пакет шлет в терминал,
или терминал с какой то частотой запрашивает сервер.
???
Для успешной работы по созданию программ
требуется понимание происходящих процессов.
Работа с черным ящиком несколько затруднительна.
Клиент запрашивает данные у сервера только при подгрузке истории котировок или сделок.
Клиент ничего не запрашивает у сервера по текущей рыночной ситуации. Сервер сам _все_что_нужно_ шлет клиенту в режиме реального времени. О частоте говорить нельзя, так как все данные отправляются клиентам мгновенно без задержек.
Клиент запращивает данные у сервера только при подгрузке истории котировок или сделок..
Дальше возникает следующий вопрос:
А это происходит как односторонняя высылка данных от сервера, или в режиме транзакции,
то есть сервер не считает полученными даннными те, которые он выслал пока получил подтверждения в приеме от клиента.
Или же серверу это без разницы, и вся доставка пакетов (и подтверждения получения)
происходит через возможности IP/TCP протокола.
Что будет если при связи не со 100% прохождением пакетов (PING) случится потеря пакета ?
Что будет если при связи не со 100% прохождением пакетов (PING) случится потеря пакета ?
Наш сетевой протокол спроектирован так, что правильно восстанавливается после сетевых разрывов. То есть, графики и тики докачиваются, все синхронизируется и терминал может продолжать нормальную работу. Терминал автоматически обнаруживает все важные изменения и обязательно синхронизируется с сервером. Синхронизация работает экономно, неизменные данные попусту не пересылаются.
Большинство сетевых обновлений/пакетов в системе MetaTrader 4 работает в транзакционной модели, что позволяет очень экономно расходовать сетевой трафик.
Но это уже оффтопик.
Терминал автоматически обнаруживает все важные изменения и обязательно синхронизируется с сервером.
А как тогда объяснить разницу в котировках разных терминалов подключенных к одному серверу?
О дрявой истории я уже не говорю...