Ошибки, баги, вопросы - страница 1562

 

Запускаю в тестере проход сразу по двум символам в режиме "реальные тики". Синхронизация с точностью до мс. Поэтому иногда, похоже, возникает несоответствие последовательностей тиков. В 1 мс сразу на двух символах может быть несколько тиков. Скажите, какой алгоритм подачи тиков в таких ситуациях?

И как без IndicatorRelease оптимально суметь в тестере поймать каждый тик (таймер в 1 мс пропускает тики), когда идет проход сразу по нескольким символам? 

 
Anton Zverev:

Запускаю в тестере проход сразу по двум символам в режиме "реальные тики". Синхронизация с точностью до мс. Поэтому иногда, похоже, возникает несоответствие последовательностей тиков. В 1 мс сразу на двух символах может быть несколько тиков. Скажите, какой алгоритм подачи тиков в таких ситуациях?

И как без IndicatorRelease оптимально суметь в тестере поймать каждый тик (таймер в 1 мс пропускает тики), когда идет проход сразу по нескольким символам? 

В тестере минимальный квант времени - 1 секунда. Поэтому бесполезно запускать таймер на 1 мс.

В одну и ту же секунду может быть несколько тиков. Причём с разных инструментов. Алгоритм подачи тиков таков, что к моменту времени тика по тестируемому инструменту, все тики других инструментов за эту же секунду уже поданы.

 
Slawa:

В тестере минимальный квант времени - 1 секунда. Поэтому бесполезно запускать таймер на 1 мс.

В одну и ту же секунду может быть несколько тиков. Причём с разных инструментов. Алгоритм подачи тиков таков, что к моменту времени тика по тестируемому инструменту, все тики других инструментов за эту же секунду уже поданы.

Вы подумаете над нормальным решением вызова советника на каждом тике в тестере?
 
Anton Zverev:
Вы подумаете над нормальным решением вызова советника на каждом тике в тестере?
В тестере советник вызывается на каждом тике тестируемого инструмента
 
Slawa:
В тестере советник вызывается на каждом тике тестируемого инструмента

Вы же отлично понимаете, о чем спрашиваю. Запускаю два символа, поймать тики второго не получается. Народ давно предлагает единственное решение - через IndicatorRelease. Но оно само по себе выглядит костыльно.

Видел разные мультисимвольные тестеры. С такой проблемой на ровном месте столкнулся только в пятерке. Как так получилось, что Вы этого не предусмотрели - загадка.

Прошу подумать, как доработать MQL, чтобы исчезло это слабое звено и продукт стал, действительно, завершенным в своей полноценности. Предлагал свой вариант, но Ваш 100% будет продуманней.

 
Anton Zverev:

Вы же отлично понимаете, о чем спрашиваю. Запускаю два символа, поймать тики второго не получается. Народ давно предлагает единственное решение - через IndicatorRelease. Но оно само по себе выглядит костыльно.

Видел разные мультисимвольные тестеры. С такой проблемой на ровном месте столкнулся только в пятерке. Как так получилось, что Вы этого не предусмотрели - загадка.

Прошу подумать, как доработать MQL, чтобы исчезло это слабое звено и продукт стал, действительно, завершенным в своей полноценности. Предлагал свой вариант, но Ваш 100% будет продуманней.

Это уже другой вопрос.

Что такое "поймать тики второго"?

Каким образом Вы ловите тики второго инструмента при обычном запуске эксперта?

 
Slawa:

Это уже другой вопрос.

Что такое "поймать тики второго"?

Чтобы советник вызвался на каждом тике второго символа.

 Каким образом Вы ловите тики второго инструмента при обычном запуске эксперта?

Вешаю индикатор через IndicatorRelease на второй символ. Тот на каждом тике своего симваол создает событие ChartEvent. Советник, соответсвенно, ловит это событие.

Это кривое решение было предложено много лет назад, судя по поиску. Другого рабочего решения не нашел. Если тест надо проводить по 10-ти символам, то запускается аж 9 индикаторов.

Представим, что имеем советник, которые на каждом тике увеличивает счетчик.

Прогоняю на одном символе в тестере, где 1 млн тиков. Счетчик показывает 1 млн.

Прогоняю также на другом символе - аналогично: 1 млн.

Ставлю прогон сразу по двум символам. 2 млн не выходит.

Теперь понятно? 

 
Anton Zverev:

Прошу подумать, как доработать MQL, чтобы исчезло это слабое звено и продукт стал, действительно, завершенным в своей полноценности. Предлагал свой вариант, но Ваш 100% будет продуманней.

На самом деле изменение, которое потребуется сделать достаточно простое - необходимо событие OnBookEvent вызывать не только при изменении стакана, но и при приходе нового тика на подписываемый инструмент. Благодаря этому событию на ФОРТС (где есть стакан) можно уже сейчас ловить приход новых тиков с других инструментов. 

Если мы на форексе, и стакана нет - OnBookEvent вызывается при приходе нового тика. Если мы на бирже - OnBookEvent вызывается при изменении стакана. Все.

 

Было бы много удобнее, если бы по каждому символу терминал вел счетчик тиков (с момента коннекта). И каждый советник при вызове получал бы номер тика, на котором вызван.

Это позволило бы делать оценку пропущенных тиков.

Сейчас каждый советник обязан запускаться на чарте. BookEvent - это первая ласточка, говорящая, что никаких чартов для запуска советников не требуется. 

 
Anton Zverev:

Чтобы советник вызвался на каждом тике второго символа.

Вешаю индикатор через IndicatorRelease на второй символ. Тот на каждом тике своего симваол создает событие ChartEvent. Советник, соответсвенно, ловит это событие.

Это кривое решение было предложено много лет назад, судя по поиску. Другого рабочего решения не нашел. Если тест надо проводить по 10-ти символам, то запускается аж 9 индикаторов.

Представим, что имеем советник, которые на каждом тике увеличивает счетчик.

Прогоняю на одном символе в тестере, где 1 млн тиков. Счетчик показывает 1 млн.

Прогоняю также на другом символе - аналогично: 1 млн.

Ставлю прогон сразу по двум символам. 2 млн не выходит.

Теперь понятно? 

При обычной работе эксперт будет вызываться на каждом тике второго символа только в том случае, если этот эксперт прикреплён к графику этого самого второго символа.

И не надо никаких чарт-евентов городить. Всё уже сделано до Вас, нужно только поискать

1. Например, делаете 1-секундный таймер.

2. В OnTimer организуете цикл от нуля до 100 со Sleep(10) и контролем, чтобы цикл не работал дольше 1-й секунды.

3. Анализируете какие угодно инструменты при помощи запросов SymbolInfoTick

Эта конструкция и в тестере будет работать

PS таймер лучше сделать на больший период, например на 3600 секунд

И цикл организовывать не на секунду, а на чуть меньше часа. С обязательной проверкой IsStopped()

Sleep, кстати, обязателен. Иначе завесите тестер. Ну и ресурсы у системы будут отжираться при обычной работе советника

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