
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Каждый скрипт имеет у себя локальную копию части рыночной информации, которая обновляется при входе в 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 работает в транзакционной модели, что позволяет очень экономно расходовать сетевой трафик.
Но это уже оффтопик.
Терминал автоматически обнаруживает все важные изменения и обязательно синхронизируется с сервером.
А как тогда объяснить разницу в котировках разных терминалов подключенных к одному серверу?
О дрявой истории я уже не говорю...