Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
У вас индикатор не отслеживает обновление данных.
От брокера приходят новые бары, а вы их не проверяете.
Я добавил пару строк чтобы показать, что при проверке всё отображается верно.
Это рабочая ситуация - проверять новый бар.
Да Вы что! А с чего Вы взяли, что я обязательно должен отслеживать новые бары? Это в документации написано? В смысле, я ДОЛЖЕН получить значение функции, а потом обязательно сравнивать его с предыдущим? Есть функция, функция рассчитана на работу со старшими таймфреймами. Функция может возвращать ошибку, когда у нее нет данных или возвращать некорректное значение (равное 0 в данном случае). Все. Не должны программисты что-то городить для того, чтобы 100% получить корректное значение.
Зато смотрите, что я нашел в документации к SeriesInfoInteger():
Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().
А Вы посмотрите мой самый первый пост. Видите там ошибку 4066? Потом ошибку 0 и возврат некорректных данных. Почему же функция (в данном случае SeriesInfoInteger()) предварительно перед отправкой данных не делает проверку на актуальность? Почему она не взводит флаг ошибки? Понимаете, лучше подождать чуть дольше, пока проходят внутренние проверки, чем потом искать ошибки.
Зато после этого, мне было дано много советов, используя которые результат так и не был получен. А дело оказалось даже не в таймере.
ок, читаем справку)
SeriesInfoInteger
Возвращает информацию о состоянии исторических данных.
Слово исторических что означает?
Если История загружена - ошибки нет.
Да Вы что! А с чего Вы взяли, что я обязательно должен отслеживать новые бары? Это в документации написано? В смысле, я ДОЛЖЕН получить значение функции, а потом обязательно сравнивать его с предыдущим? Есть функция, функция рассчитана на работу со старшими таймфреймами. Функция может возвращать ошибку, когда у нее нет данных или возвращать некорректное значение (равное 0 в данном случае). Все. Не должны программисты что-то городить для того, чтобы 100% получить корректное значение.
Зато смотрите, что я нашел в документации к SeriesInfoInteger():
В моем коде GetLastError() видите? Вот проверка. Эта проверка должна быть необходимой и ДОСТАТОЧНОЙ! Все остальное - костыльные решения.Вы ничего не должны)
...брокер вам присылает обновленные данные - если хотите, используйте их для расчета, если нет - какие проблемы, считайте по уже имеющейся Истории)
пс. сейчас выходные, рынок закрыт, у вас в терминале некорректные данные!
и нет ошибки!!!)
ок, читаем справку)
Слово исторических что означает?
Если История загружена - ошибки нет.
Вы ничего не должны)
...брокер вам присылает обновленные данные - если хотите используйте их для расчета, если нет - какие проблемы, считайте по Истории)
Каждый тик, пришедший в терминал - уже история. И я хочу получать актуальные ее значения или ошибку. Если Вас все устраивает - ок.
Каждый тик, пришедший в терминал - уже история. И я хочу получать актуальные ее значения или ошибку. Если Вас все устраивает - ок.
Да, история это то что уже загрузилось, или то что грузится в прошлое.
А то, что только сейчас обновляется (после последней котировки) - это еще не история, это новые необработанные данные.
Проверяйте не расчет баров, а время свечи.
Вот так будет правильно обновляться (проверил).
Тарас, вот результат Вашего кода:
Тарас, вот результат Вашего кода:
Да, это первый тик, тот который выдает готовую историю, та которая есть в наличии.
После этого тика (если есть новые бары), сразу приходит второй тик, в котором мой код обновляет ваши переменные и они показывают правильные данные.
пс. можете вставить свою функцию проверки нового бара, будет тоже самое.
ппс. я, у себя, постоянно проверяю количество баров, если число изменилось больше чем на 1, значит нужно пересчитать всё заново, если число изменилось на 1 - значит просто новый бар. А ошибки проверяю только самые критические, и не вижу этой задержки-ошибки.
Да, это первый тик, тот который выдает готовую историю, та которая есть в наличии.
После этого тика (если есть новые бары), сразу приходит второй тик, в котором мой код обновляет ваши переменные и они показывают правильные данные.
пс. можете вставить свою функцию проверки нового бара, будет тоже самое.
ппс. я, у себя, постоянно проверяю количество баров, если число изменилось больше чем на 1, значит нужно пересчитать всё заново, если число изменилось на 1 - значит просто новый бар. А ошибки проверяю только самые критические, и не вижу этой задержки-ошибки.
А вот, кстати, еще аргумент, в пользу того, что происходит ошибка. Именно ОШИБКА при расчете в индикаторе! Написал советник:
Запускается с того же графика, что и индикатор. Посмотрим результаты:
Что же мы видим. Видим, что все хорошо. Все прогрузилось, и заметьте, никаких ошибок, сразу актуальные данные! Главный ВОПРОС: дак почему в эксперте данные старших ТФ можно получить нормально, а в индикаторе нужно "плясать с бубном"? Разве не должны программы работать одинаково? Почему один и тот же код в индикаторе и эксперте работает по разному?! Не должно такого быть.
А вот, кстати, еще аргумент, в пользу того, что происходит ошибка. Именно ОШИБКА при расчете в индикаторе! Написал советник:
Запускается с того же графика, что и индикатор. Посмотрим результаты:
Что же мы видим. Видим, что все хорошо. Все прогрузилось, и заметьте, никаких ошибок, сразу актуальные данные! Главный ВОПРОС: дак почему в эксперте данные старших ТФ можно получить нормально, а в индикаторе нужно "плясать с бубном"? Разве не должны программы работать одинаково? Почему один и тот же код в индикаторе и эксперте работает по разному?! Не должно такого быть.
Потому что это дело терминала соединяться и что то там делать с подгрузкой проверкой и т.д., все индикаторы находятся в одном потоке, и покуда все в потоке не закончится (фактически до следующего вызова OnСalculate) ничего нового не произойдет, т.е. находясь в этом потоке, быстрее окончания потока, вы все равно ничего не получите. Эксперт находится в своем отдельном потоке, поэтому когда он запускается, ему позволено отложить свой запуск на время обновлений данных, обновлять данные - на все остальное в терминале это не влияет. Это с рождения так и никак уже не исправить, т.к. среду metatrader4 похоронили.
Потому что это дело терминала соединяться и что то там делать с подгрузкой проверкой и т.д., все индикаторы находятся в одном потоке, и покуда все в потоке не закончится (фактически до следующего вызова OnСalculate) ничего нового не произойдет, т.е. находясь в этом потоке, быстрее окончания потока, вы все равно ничего не получите. Эксперт находится в своем отдельном потоке, поэтому когда он запускается, ему позволено отложить свой запуск на время обновлений данных, обновлять данные - на все остальное в терминале это не влияет. Это с рождения так и никак уже не исправить, т.к. среду metatrader4 похоронили.
Да я в курсе, что все индикаторы одного символа находятся в одном потоке, а на каждый эксперт выделяется свой поток. Но это не дело. Разработчики - они на то и разработчики, чтобы исправлять ошибки в своих творениях. Программы не должны по разному работать! Если индикаторы что-то не успели - ошибка и нет проблем. Ведь эксперт как-то сразу получил корректные данные без ошибок! Значит можно реализовать. @Slava, можете высказаться по поводу, будет ли исправлено явно ошибочное поведение? Или, хотя бы, дополнение документации (что при prev_calculated = 0 корректных данных старших ТФ не получить)?
Да я в курсе, что все индикаторы одного символа находятся в одном потоке, а на каждый эксперт выделяется свой поток. Но это не дело. Разработчики - они на то и разработчики, чтобы исправлять ошибки в своих творениях. Программы не должны по разному работать! Если индикаторы что-то не успели - ошибка и нет проблем. Ведь эксперт как-то сразу получил корректные данные без ошибок! Значит можно реализовать. @Slava, можете высказаться по поводу, будет ли исправлено явно ошибочное поведение? Или, хотя бы, дополнение документации (что при prev_calculated = 0 корректных данных старших ТФ не получить)?
В документации где то было что эксперту дается целых 5 секунд перед запуском чтобы получить данные, а в это время терминал пытается выкачать данные для эксперта. Индикатору это не дано, так же индикатору не положено запрашивать обновление истории, для него это не критично, если критично - значит считайте в эксперте. Главная мысль, что в текущей реализации не возможно желаемое положение вещей. По существу, ТФ-ы это таймеры и есть периоды где эти кратные таймеры совпадают в один момент - это 100% совпадающий по времени синхронный процесс(кроме времени открытия/закрытия), т.к. первый тик минуты текущего тф совпадающей с первой минутой пятиминутки, часа и т.д. - это просто запись в несколько переменных одного и того же значения , и логично что в этих моментах можно задать набор нужных ТФ и получать все необходимые данные сразу. Почему разработчики сделали так, а не иначе, хз, возможно из-за разделения клиент-сервер это невозможно было(будет) сделать в существующей модели работы терминала, т.к. если сейчас дать возможность индикаторам возможности экспертов, то они завесят терминал.
Можно посмотреть в конце дня, кому интересно, как работает вызов индикатора, индикатор вызывает другой индикатор, эксперт(_asktfexp) вызывает индикатор(_asktf_sample) вызывающий индикатор(_asktf). При вызове индикатора из эксперта, таймер в индикаторе не запустится, поэтому решения с таймером в индикаторе это только для случаев, когда этот индикатор только будет висеть на графике и не будет вызываться (что в общем логично).