Вопрос по RefreshRates() Разработчикам - страница 2

 
Renat:
mazzz:

Мне кажется тут есть разница. 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 нет. (с запросом информации от сервера)
Информация содержащаяся в кеше обновляется только по приходу информации от сервера.
(насчет того , зачем нужен кеш - понятно)
Я правильно понял ?
 
Рекомендую вдумчиво еще раз почитать мои ответы и считать, что они 100% верны. Не нужно ничего придумывать, точные ответы даны.
 
Кажется я начинаю понимать.
Между терминалом и сервером существует постоянная синхронизация котировок Аск и Бид. Возможно клиентский терминал ходит с большой частотой на сервер за ними
либо эта обратная связь организованна каким либо другим образом - не важно.
Но в обработке процедуры start() информация не всегда актуальна - точнее она актуальна только вначале ее отработки.
И чтобы быть 100% уверенным в актуальнсоти котировок нужно выполнить RefreshRates() - и котировки из некоторого буфера клиентского терминала обновятся для текущей исполняемой процедуры start().

Надеюсь теперь я правильно все представил?

А как следствие всего мною выше описанного и сказанного вами, функция MarketInfo() - вернет 100% актуальные котировки и без всяких RefreshRates().
 
Renat:
Рекомендую вдумчиво еще раз почитать мои ответы и считать, что они 100% верны. Не нужно ничего придумывать, точные ответы даны.
Из вышеизложенного следует:
Никакая из функций МТ4 не производит обращения к серверу котировок. Нет такой.
Вследствие этого возникает вопросы:
Кто обращается за обновляемыми котировками на сервер. Клиентский терминал - или сервер иницирует отправку обновленных данных ?
Как часто обмен информацией происходит. Где это можно увидеть ? Как частота обновлений регулируется ?
Как происходит процесс:
или сервер по приходу тика обновленный пакет шлет в терминал,
или терминал с какой то частотой запрашивает сервер.
???
Для успешной работы по созданию программ
требуется понимание происходящих процессов.
Работа с черным ящиком несколько затруднительна.
 
Клиент ничего не запрашивает у сервера по текущей рыночной ситуации. Сервер сам _все_что_нужно_ шлет клиенту в режиме реального времени. О частоте говорить нельзя, так как все данные отправляются клиентам мгновенно без задержек.

Клиент запрашивает данные у сервера только при подгрузке истории котировок или сделок.
 
Renat:
Клиент ничего не запрашивает у сервера по текущей рыночной ситуации. Сервер сам _все_что_нужно_ шлет клиенту в режиме реального времени. О частоте говорить нельзя, так как все данные отправляются клиентам мгновенно без задержек.

Клиент запращивает данные у сервера только при подгрузке истории котировок или сделок..
Благодарю. Теперь стало намного понятней.
Дальше возникает следующий вопрос:
А это происходит как односторонняя высылка данных от сервера, или в режиме транзакции,
то есть сервер не считает полученными даннными те, которые он выслал пока получил подтверждения в приеме от клиента.
Или же серверу это без разницы, и вся доставка пакетов (и подтверждения получения)
происходит через возможности IP/TCP протокола.
Что будет если при связи не со 100% прохождением пакетов (PING) случится потеря пакета ?
 
mazzz:

Что будет если при связи не со 100% прохождением пакетов (PING) случится потеря пакета ?

Наш сетевой протокол спроектирован так, что правильно восстанавливается после сетевых разрывов. То есть, графики и тики докачиваются, все синхронизируется и терминал может продолжать нормальную работу. Терминал автоматически обнаруживает все важные изменения и обязательно синхронизируется с сервером. Синхронизация работает экономно, неизменные данные попусту не пересылаются.

Большинство сетевых обновлений/пакетов в системе MetaTrader 4 работает в транзакционной модели, что позволяет очень экономно расходовать сетевой трафик.

Но это уже оффтопик.
 

Терминал автоматически обнаруживает все важные изменения и обязательно синхронизируется с сервером.

А как тогда объяснить разницу в котировках разных терминалов подключенных к одному серверу?

О дрявой истории я уже не говорю...

Причина обращения: