Кто-то разбирался с этой фантасмагорией? Что здесь реальные тики, а что фейки? Какие тики учитывать при расчете средних и скользящих значений, а какие нет?
В OnTick ту же EMA рассчитывать ни в коем случае нельзя. Используйте CopyTicks, сделав семафор на появление нового тика.
Нашел случайно инфу в тему https://www.mql5.com/ru/forum/23/page18
fxsaber, это я не вам, понятное дело, а для ТС почитать.
Смотрите пункт 10 по билду 1035
--------
MQL5: Добавлена функция работы с тиковой историей CopyTicks. Функция позволяет получить массив тиков, накопленных терминалом за текущую рабочую сессию. Глубина получаемых тиков ограничена последними 2 000.Новая функция расширяет возможности написания скальперских торговых роботов. Функция OnTick не является обработчиком каждого тика, она уведомляет эксперта об изменениях на рынке. Изменения могут быть пакетными: в терминал может одновременно прийти несколько тиков, но функция OnTick будет вызвана лишь один раз для уведомления эксперта о последнем состоянии рынка. Функция CopyTicks позволяет получать и анализировать все пришедшие тики.
- www.mql5.com
первый раз вижу тики с одинаковым временем миллисек (хотя с тики давно не просматривал и как только появился OnTick() глюков хватало со временем и флагами ) , весьма интересно ! а на демке или реале,срочный рынок или форекс ? возможно билд или поставщик тиков косячит . время будет проверю у себя.
На демке, естественно. На форекс. EURGBP.Я же говорю, разбираюсь с тем, как работают тики. Пытался сделать индикатор, считающий накопленный объем, столкнулся с тем, что приходят по несколько тиков с одним временем.
Но MQ ни за что не признается, что это приходят одни и те же тики, просто с разными флагами. Просто не пишут они флаги BID/ASK вместе с флагами VOLUME/ASK. Присылают еще один тик. То есть, событие OnTick вызвано два раза одним и тем же тиком.
Нашел случайно инфу в тему https://www.mql5.com/ru/forum/23/page18
fxsaber, это я не вам, понятное дело, а для ТС почитать.
Смотрите пункт 10 по билду 1035
--------
MQL5: Добавлена функция работы с тиковой историей CopyTicks. Функция позволяет получить массив тиков, накопленных терминалом за текущую рабочую сессию. Глубина получаемых тиков ограничена последними 2 000.Новая функция расширяет возможности написания скальперских торговых роботов. Функция OnTick не является обработчиком каждого тика, она уведомляет эксперта об изменениях на рынке. Изменения могут быть пакетными: в терминал может одновременно прийти несколько тиков, но функция OnTick будет вызвана лишь один раз для уведомления эксперта о последнем состоянии рынка. Функция CopyTicks позволяет получать и анализировать все пришедшие тики.
То же самое сказано в документации, в описании функции CopyTicks. Пакет тиков объясняет, почему загрузка одного последнего тика приводит к исчезновению ряда тиков, которые видны при пакетной загрузке. То есть, если я делаю CopyTicks(_Symbol, LastTickArray, COPY_TICK_ALL, 0, 1), то я вижу лишь часть тиков, которые я увижу, использовав функцию CopyTicks(_Symbol, LastTickArray, COPY_TICK_ALL, 0, 5).
Лог ниже заполнялся последними тиками, копируемыми функцией CopyTicks(_Symbol, LastTickArray, COPY_TICK_ALL, 0, 1). То есть, по одному последнему тику с каждым приходом события OnTick().
Number
2016.12.30 22:35:26.238 1 1,483,140,926,005 0.85342 0.85372 TICK_FLAG_ASK
2016.12.30 22:35:43.253 1 1,483,140,940,986 0.85333 0.85365 TICK_FLAG_ASK
2016.12.30 22:35:43.294 1 1,483,140,940,986 0.85333 0.85365 TICK_FLAG_ASK
2016.12.30 22:35:43.386 1 1,483,140,940,986 0.85333 0.85365 TICK_FLAG_ASK
2016.12.30 22:35:43.599 1 1,483,140,946,198 0.85324 0.85360 TICK_FLAG_BID
У выделенных тиков, очевидно, изменились и цена bid и цена ask. Однако, в первом случае стоит только флаг TICK_FLAG_ASK, а во тором случае только флаг TICK_FLAG_BID. Невольно задумаешься - какая-то путаница с флагами. Ан нет. Просто в последовательности пропущены тики.
Попробуем теперь загружать тики функцией CopyTicks(_Symbol, LastTickArray, COPY_TICK_ALL, 0, 4), то есть четыре последних тиков с каждым запуском хендлера события OnTick().
(серым цветом выделена новая последовательность из четырех тиков от другой, то есть - новое событие OnTick())
Number
2016.12.30 22:57:39.425 1 1,483,142,260,517 0.72004 0.72059 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.30 22:57:39.425 2 1,483,142,260,767 0.72004 0.72059 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.30 22:57:39.425 3 1,483,142,261,023 0.72004 0.72059 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.30 22:57:39.425 4 1,483,142,262,029 0.72006 0.72062 TICK_FLAG_BID TICK_FLAG_ASK
2016.12.30 22:57:39.684 1 1,483,142,261,023 0.72004 0.72059 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.30 22:57:39.684 2 1,483,142,262,029 0.72006 0.72062 TICK_FLAG_BID TICK_FLAG_ASK
2016.12.30 22:57:39.684 3 1,483,142,262,283 0.72006 0.72062 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.30 22:57:39.684 4 1,483,142,262,284 0.72006 0.72059 TICK_FLAG_ASK
Видно, что теперь путаницы с флагами нет. Флаги точно указывают, изменилась ли цена bid, цена ask или обе сразу.
Понятно, что если бы эти тики копировались по одному, то в логе присутствовали бы только тики номер 4.
То, есть при ближайшем рассмотрении действительно становится понятно, что тики приходят пакетами, и при копировании по одному, в лог будет попадать только последний. Тут вопросов нет.
Но вот какой вопрос остается.
Последовательность скопированных тиков может полностью повторяться в нескольких последовательно пришедших событиях OnTick(). То есть, нового тика может не быть вовсе, а событие OnTick() будет запущено, как в примере на самом верху, который я воспроизвел ниже.
Пожалуйста, три раза распечатана одна и та же последовательность тиков. То есть, функция CopyTicks() не скопировала ни одного нового тика.
2016.12.29 22:42:25.765 Last tick time = 1483054941883 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_ASK
2016.12.29 22:42:25.765 Last tick time = 1483054942394 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:25.765 Last tick time = 1483054946079 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:25.765 Last tick time = 1483054947647 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:25.765 Last tick time = 1483054947647 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_BID
2016.12.29 22:42:26.780 Last tick time = 1483054941883 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_ASK
2016.12.29 22:42:26.780 Last tick time = 1483054942394 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.780 Last tick time = 1483054946079 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.780 Last tick time = 1483054947647 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.780 Last tick time = 1483054947647 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_BID
2016.12.29 22:42:26.848 Last tick time = 1483054941883 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_ASK
2016.12.29 22:42:26.848 Last tick time = 1483054942394 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.848 Last tick time = 1483054946079 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.848 Last tick time = 1483054947647 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.848 Last tick time = 1483054947647 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_BID
Но вот какой вопрос остается.
Не увидел вопроса.
Вопрос-проблема. Как или почему событие OnTick() вызывается без прихода нового тика.
SymbolInfoTick и CopyTicks, вызванные в самом начале OnTick могут отставать и опережать тик очередного пакета, который инициировал событие Tick.
Т.е. OnTick вызывается по приходу нового тика, но в том же CopyTicks может не быть этой инфы еще. Или же в нем может быть инфа даже о тиках, которые появились позже.
SymbolInfoTick и CopyTicks, вызванные в самом начале OnTick могут отставать и опережать тик очередного пакета, который инициировал событие Tick.
Т.е. OnTick вызывается по приходу нового тика, но в том же CopyTicks может не быть этой инфы еще. Или же в нем может быть инфа даже о тиках, которые появились позже.
Как вы себе это представляете? Тик пришел, событие вызвано, а инфы еще нет? Тогда что пришло?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Разбираясь с тонкостями поступления тиков в терминале, при обработке события OnTick() обратил внимание на то, что:
1. событие OnTick() может вызываться без появления нового тика (то есть появляется абсолютно идентичная предыдущей запись),
2. если в тике произошло изменение цены bid или ask, тик приходит дважды, сначала с флагами TICK_FLAG_LAST, TICK_FLAG_VOLUME, а потом с флагами соответственно TICK_FLAG_BID или TICK_FLAG_ASK. Время поступления тика совпадает до миллисекунды (ну, может отличаться на 1 миллисекунду).
Ниже приведен код и содержание лога:
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int received = CopyTicks(Symbol1, LastTicksArray, COPY_TICKS_ALL, 0, 5);
if(received == -1)
{
ResetLastError();
Print("Ticks are not available, error = ", GetLastError());
}
else
{
printf(" ");
for(int t = 0; t < 5; t++)
{
string flags;
flags += (LastTicksArray[t].flags & TICK_FLAG_BID) == TICK_FLAG_BID ? "TICK_FLAG_BID, " : " ,";
flags += (LastTicksArray[t].flags & TICK_FLAG_ASK) == TICK_FLAG_ASK ? "TICK_FLAG_ASK, " : " ,";
flags += (LastTicksArray[t].flags & TICK_FLAG_LAST) == TICK_FLAG_LAST ? "TICK_FLAG_LAST, " : " ,";
flags += (LastTicksArray[t].flags & TICK_FLAG_VOLUME) == TICK_FLAG_VOLUME ? "TICK_FLAG_VOLUME, " : " ,";
flags += (LastTicksArray[t].flags & TICK_FLAG_BUY) == TICK_FLAG_BUY ? "TICK_FLAG_BUY, " : " ,";
flags += (LastTicksArray[t].flags & TICK_FLAG_SELL) == TICK_FLAG_SELL ? "TICK_FLAG_SELL, " : " ,";
PrintFormat("Last tick time = %lld, Bid = %.5f, Ask = %.5f, Tick flag = %s", LastTicksArray[t].time_msc, LastTicksArray[t].bid, LastTicksArray[t].ask, flags);
}
}
}
Функция копирует пять последних поступивших тиков в массив и выводит в лог скопированную группу из пяти тиков с указанием времени поступления тика (в мс), цены bid и ask, а также флагов тика.
В логе ниже тики сгруппированы группами по пять. Каждая группа - это поступление нового события OnTick().
Видно, что некоторые группы ничем не отличаются (кроме времени записи в логе - первый столбец), однако если в группе есть тик с изменением цен, он приходит два раза (с тем же временем в мс), первый раз с флагами LAST/VOLUME, второй раз с флагом BID или ASK.
Запись лога (желтым выделены изменившиеся цены, красным - совпадающее время тиков, зеленым - мои комментарии, вставленные мной позже):
2016.12.29 22:42:25.765 Last tick time = 1483054941883 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_ASK
2016.12.29 22:42:25.765 Last tick time = 1483054942394 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:25.765 Last tick time = 1483054946079 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:25.765 Last tick time = 1483054947647 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:25.765 Last tick time = 1483054947647 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_BID
через 15 мс новое событие OnTick() записывает ту же самую последовательность из пяти тиков без каких-то изменений
2016.12.29 22:42:26.780 Last tick time = 1483054941883 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_ASK
2016.12.29 22:42:26.780 Last tick time = 1483054942394 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.780 Last tick time = 1483054946079 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.780 Last tick time = 1483054947647 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.780 Last tick time = 1483054947647 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_BID
Через 68 мс еще раз та же последовательность
2016.12.29 22:42:26.848 Last tick time = 1483054941883 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_ASK
2016.12.29 22:42:26.848 Last tick time = 1483054942394 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.848 Last tick time = 1483054946079 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.848 Last tick time = 1483054947647 Bid = 0.85524 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:26.848 Last tick time = 1483054947647 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_BID
Видно, что каждому изменению bid или ask предшествует тик с тем же временем поступления и флагами LAST / VOLUME
2016.12.29 22:42:28.068 Last tick time = 1483054947647 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_BID
2016.12.29 22:42:28.068 Last tick time = 1483054949817 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:28.068 Last tick time = 1483054949817 Bid = 0.85521 Ask = 0.85541 TICK_FLAG_BID TICK_FLAG_ASK
2016.12.29 22:42:28.068 Last tick time = 1483054950187 Bid = 0.85521 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:28.068 Last tick time = 1483054950187 Bid = 0.85523 Ask = 0.85540 TICK_FLAG_BID TICK_FLAG_ASK
2016.12.29 22:42:29.924 Last tick time = 1483054950353 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_BID
2016.12.29 22:42:29.924 Last tick time = 1483054951017 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:29.924 Last tick time = 1483054951017 Bid = 0.85523 Ask = 0.85540 TICK_FLAG_BID
2016.12.29 22:42:29.924 Last tick time = 1483054951120 Bid = 0.85523 Ask = 0.85540 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:29.924 Last tick time = 1483054951120 Bid = 0.85522 Ask = 0.85540 TICK_FLAG_BID
2016.12.29 22:42:33.632 Last tick time = 1483054952798 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_ASK
2016.12.29 22:42:33.632 Last tick time = 1483054953143 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:33.632 Last tick time = 1483054953144 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_BID
2016.12.29 22:42:33.632 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:33.632 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_ASK
И снова последовательность полностью повторилась.
2016.12.29 22:42:33.734 Last tick time = 1483054952798 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_ASK
2016.12.29 22:42:33.734 Last tick time = 1483054953143 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:33.734 Last tick time = 1483054953144 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_BID
2016.12.29 22:42:33.734 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:33.734 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_ASK
2016.12.29 22:42:35.461 Last tick time = 1483054952798 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_ASK
2016.12.29 22:42:35.461 Last tick time = 1483054953143 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:35.461 Last tick time = 1483054953144 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_BID
2016.12.29 22:42:35.461 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:35.461 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_ASK
2016.12.29 22:42:39.853 Last tick time = 1483054953144 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_BID
2016.12.29 22:42:39.853 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:39.853 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_ASK
2016.12.29 22:42:39.853 Last tick time = 1483054959766 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:39.853 Last tick time = 1483054959766 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_BID TICK_FLAG_ASK
повторный приход последовательности
2016.12.29 22:42:40.354 Last tick time = 1483054953144 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_BID
2016.12.29 22:42:40.354 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:40.354 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_ASK
2016.12.29 22:42:40.354 Last tick time = 1483054959766 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:40.354 Last tick time = 1483054959766 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_BID TICK_FLAG_ASK
повторный приход последовательности
2016.12.29 22:42:40.462 Last tick time = 1483054953144 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_BID
2016.12.29 22:42:40.462 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:40.462 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_ASK
2016.12.29 22:42:40.462 Last tick time = 1483054959766 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:40.462 Last tick time = 1483054959766 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_BID TICK_FLAG_ASK
повторный приход последовательности
2016.12.29 22:42:40.613 Last tick time = 1483054953144 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_BID
2016.12.29 22:42:40.613 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85541 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:40.613 Last tick time = 1483054955026 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_ASK
2016.12.29 22:42:40.613 Last tick time = 1483054959766 Bid = 0.85525 Ask = 0.85542 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:40.613 Last tick time = 1483054959766 Bid = 0.85524 Ask = 0.85541 TICK_FLAG_BID TICK_FLAG_ASK
2016.12.29 22:42:47.082 Last tick time = 1483054963870 Bid = 0.85526 Ask = 0.85543 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:47.082 Last tick time = 1483054963870 Bid = 0.85525 Ask = 0.85543 TICK_FLAG_BID
2016.12.29 22:42:47.082 Last tick time = 1483054965046 Bid = 0.85525 Ask = 0.85543 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:47.082 Last tick time = 1483054965088 Bid = 0.85525 Ask = 0.85543 TICK_FLAG_LAST TICK_FLAG_VOLUME
2016.12.29 22:42:47.082 Last tick time = 1483054965088 Bid = 0.85526 Ask = 0.85543 TICK_FLAG_BID
Кто-то разбирался с этой фантасмагорией? Что здесь реальные тики, а что фейки? Какие тики учитывать при расчете средних и скользящих значений, а какие нет?