Синхронизация истории с сервером - страница 3

 
Karputov Vladimir:

Конечно время выполнения зависит от нескольких факторов:

  • это был первый запрос тиков на данном символе и на данном торговом сервере или не первый
  • количество запрошенных данных
  • скорость интернета, в конце концов

Но с чего Вы решили, что можете говорить: "Гарантии никакой нет"? Если хоть немного подумать и принять во внимание факторы описанные мной выше, то напрашивается простое решение - делаете запрос один раз - сравниваете количество полученных тиков (можно ещё дополнительно даты тиков в начале и в конце массива). Через определённый промежуток делаете повторный запрос - снова сравниваете. И так делать пока данные в последнем запросе и в предпоследнем не будут равны.

Я писал об этом ещё во втором сообщении (несколько запросов и проверка совпадения). Это всё костыли и велосипеды. Со стороны авторов терминала дать подобный функционал (признак валидности истории, хотябы какого-то участка) - пустяковое дело. Или что, ip пакет затеряется на просторах интернета? Это вообще на забота MQ, этим занимается tcp (или что там у них), и гарантирует порядок и последовательность пакетов. Если что-то и потеряется, то ip пакет будет послан заново на другом конце увидят данные в правильном порядке.
 
pavlick_:
Я писал об этом ещё во втором сообщении (несколько запросов и проверка совпадения). Это всё костыли и велосипеды. Со стороны авторов терминала дать подобный функционал (признак валидности истории, хотябы какого-то участка) - пустяковое дело. Или что, ip пакет затеряется на просторах интернета? Это вообще на забота MQ, этим занимается tcp (или что там у них), и гарантирует порядок и последовательность пакетов. Если что-то и потеряется, то ip пакет будет послан заново на другом конце увидят данные в правильном порядке.
В MQL нет функций контроля IP пакетов - ибо это работа терминала. Пользователю туда путь заказан. И попробуйте каждый раз вместо слова "костыль" писать "я ленюсь или не знаю, как правильно сделать". 
 
Artyom Trishkin:

Конечно правда. Не всегда удаётся получить цены OHLC с неродного символа, даже если предварительно проверить наличие исторических данных по символу, и они вроде как есть. Для проверки данных использую метод, описанный в документации.

ЗЫ. А бывает так, что данные говорят что есть, а Point символа нулевой, при этом символ в обзоре рынка есть - я его предварительно туда размещаю, проверяю его наличие, а уж затем запрашиваю исторические данные, и при их наличии - уже все остальные нужные по символу данные для поиска сигналов. Всё делаю в индикаторе.

Если Point символа нулевой, тогда не знаю. Никогда на такое не натыкался.
 
Dmitry Fedoseev:
Если Point символа нулевой, тогда не знаю. Никогда на такое не натыкался.
Забавно, что после прохождения всех проверок, если все равно невозможно получить данные OHLC, то стоит сменить тф такого символа, или попытаться открыть его график, то нарываюсь на бесконечную надпись ожидания обновления. При этом связь с сервером присутствует.
Вот и ищу разные способы получения данных по символам.
Може есть что подсказать? Хотя бы для точного получения OHLC
 
Artyom Trishkin:
Забавно, что после прохождения всех проверок, если все равно невозможно получить данные OHLC, то стоит сменить тф такого символа, или попытаться открыть его график, то нарываюсь на бесконечную надпись ожидания обновления. При этом связь с сервером присутствует.
Вот и ищу разные способы получения данных по символам.
Може есть что подсказать? Хотя бы для точного получения OHLC

Две функции есть: Bars() и BarsCalculated().  BarsCalculated() нужна если запрос к индикатору с другого графика.

В самом начале вызываем Bars(), если она возвращает <=0, значит, таймфрейм формируется (обновляется), делаем return до следующего тика. 

Еще проверят результат CopyClose() и т.п. функций. Больше вроде и нечего проверять.

 
Karputov Vladimir:
В MQL нет функций контроля IP пакетов - ибо это работа терминала. Пользователю туда путь заказан. И попробуйте каждый раз вместо слова "костыль" писать "я ленюсь или не знаю, как правильно сделать". 

А Вы с сетью работали? Выглядит всё так: ос сама реализует работу с tcp/ip, конечная программа видит всё в стили: открыла файл (сокет), прочитала из файла, закрыла файл, всё. И не парится о сложной архитектуре сети, шлюзах, пропавших пакетах, это делают за неё (и за MT4 в том числе).

ЗЫ: проверил у себя, MT4 подключил 2 tcp сокета к серверу. Больше ничего нет (какого-нибудь udp). Так что упорядоченный поток от сервера к терминалу обеспечивает сама система.

 
Dmitry Fedoseev:

Две функции есть: Bars() и BarsCalculated().  BarsCalculated() нужна если запрос к индикатору с другого графика.

В самом начале вызываем Bars(), если она возвращает <=0, значит, таймфрейм формируется (обновляется), делаем return до следующего тика. 

Еще проверят результат CopyClose() и т.п. функций. Больше вроде и нечего проверять.

Спасибо, Дмитрий, попробую так. Совсем упустил из виду Вars()
 
Конечно здорово добавлять в МТ4 новый пятёрочный функционал, но только если он не кривой. Перепробовал некоторое количество новых функций, впечатление не очень. Например:

Alert( (bool)SeriesInfoInteger(symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE, val) );
Никогда не возвращает false. Если с сервером соединения не было установлено и информации об истории сервера нет, то функция возвращает true и в val забивается сегодняшняя дата. Она ведь меня просто обманывает, нафига мне сегодняшняя дата? Пусть вернёт false и я пойму, что информация не доступна (сейчас, наверное, набегут адепты MQ и порекомендуют проверять val с текущей датой).  Кривая Bars(), в справке ведь чётко написано:

Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение.
Ноль от неё не дождаться. В общем, лучше вообще без функций, чем с кривыми функциями. Или документация должна совпадать с поведением.
 
pavlick_:
Конечно здорово добавлять в МТ4 новый пятёрочный функционал, но только если он не кривой. Перепробовал некоторое количество новых функций, впечатление не очень. Например:

Alert( (bool)SeriesInfoInteger(symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE, val) );
Никогда не возвращает false. Если с сервером соединения не было установлено и информации об истории сервера нет, то функция возвращает true и в val забивается сегодняшняя дата. Она ведь меня просто обманывает, нафига мне сегодняшняя дата? Пусть вернёт false и я пойму, что информация не доступна (сейчас, наверное, набегут адепты MQ и порекомендуют проверять val с текущей датой).  Кривая Bars(), в справке ведь чётко написано:
Ноль от неё не дождаться. В общем, лучше вообще без функций, чем с кривыми функциями. Или документация должна совпадать с поведением.
Ни один язык программирования не будет думать за программиста. 
 
Dmitry Fedoseev:
Ни один язык программирования не будет думать за программиста.
Ницше нервно курит в сторонке.

Ну Вы как думающий программист не предложите ли свой вариант, который позволит узнать дату первой свечи в истории на сервере?
Причина обращения: