Почему тику назначается флаг TICK_FLAG_LAST, но цена "last" при этом не меняется?

 

Провёл следующий эксперимент:


MqlTick ticks[];
int counter1 = 0;
int counter2 = 0;
double last  = 0;
long   time  = 0;
const int ticksSize = CopyTicksRange("BP6Z19", ticks, COPY_TICKS_ALL, 1574987706000, 1574987706000 + 1000 * 60 * 60);
for(int i = 0; i < ticksSize; i++) {
  if(ticks[i].time_msc < time) {
    Print("Pls sort ticks");
    return;
  }
  const bool isLast = (ticks[i].flags & TICK_FLAG_LAST) == TICK_FLAG_LAST;
  if(isLast) counter1++;
  if(ticks[i].last != last) counter2++;
  //if(isLast && ticks[i].last == last) PrintFormat("Last not changed. Prev: %.4f, curr: %.4f", last, ticks[i].last);
  last = ticks[i].last;
  time = ticks[i].time_msc;
}
PrintFormat("c1: %d, c2: %d", counter1, counter2);

Вывод в консоль: c1: 606, c2: 51

Т.е. тиков с флагом TICK_FLAG_LAST = 606, а фактических изменений цены last = 51.

Вопрос: почему тик содержит флаг TICK_FLAG_LAST, хотя цена фактически при этом не изменилась?

 
Trader Fortis:

Провёл следующий эксперимент:


Вывод в консоль: c1: 606, c2: 51

Т.е. тиков с флагом TICK_FLAG_LAST = 606, а фактических изменений цены last = 51.

Вопрос: почему тик содержит флаг TICK_FLAG_LAST, хотя цена фактически при этом не изменилась?

Вероятно потому, что эти тики были торговыми, и потенциально могли поменять цену last. 

 
Alexey Kozitsyn:

Вероятно потому, что эти тики были торговыми, и потенциально могли поменять цену last. 

Действительно, это торговые тики:

MqlTick ticks[];
int counter1 = 0;
int counter2 = 0;
int counter3 = 0;
double last  = 0;
long   time  = 0;
const int ticksSize = CopyTicksRange("BP6Z19", ticks, COPY_TICKS_ALL, 1574987706000, 1574987706000 + 1000 * 60 * 60);
for(int i = 0; i < ticksSize; i++) {
  if(ticks[i].time_msc < time) {
    Print("Pls sort ticks");
    return;
  }
  const bool isLast = (ticks[i].flags & TICK_FLAG_LAST) == TICK_FLAG_LAST;
  const bool isBuy  = (ticks[i].flags & TICK_FLAG_BUY)  == TICK_FLAG_BUY;
  const bool isSell = (ticks[i].flags & TICK_FLAG_SELL) == TICK_FLAG_SELL;
  if(isLast) counter1++;
  if(ticks[i].last != last) counter2++;
  if(isBuy || isSell) counter3++;
  //if(isLast && ticks[i].last == last) PrintFormat("Last not changed. Prev: %.5f, curr: %.5f", last, ticks[i].last);
  last = ticks[i].last;
  time = ticks[i].time_msc;
}
PrintFormat("c1: %d, c2: %d, c3: %d", counter1, counter2, counter3);

Вывод в консоль: c1: 606, c2: 51, c3: 606

Тогда непонятно в чём смысл этого флага. Ведь в справке чётко написано:

TICK_FLAG_LAST – тик изменил цену последней сделки

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Для получения текущей рыночной информации служат функции SymbolInfoInteger(), SymbolInfoDouble() и SymbolInfoString(). В качестве второго параметра этих функций допустимо передавать один из идентификаторов из перечислений ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE и ENUM_SYMBOL_INFO_STRING соответственно. Некоторые символы (как...
 
Trader Fortis:

Действительно, это торговые тики:

Вывод в консоль: c1: 606, c2: 51, c3: 606

Тогда непонятно в чём смысл этого флага. Ведь в справке чётко написано:

TICK_FLAG_LAST – тик изменил цену последней сделки

Скорей всего, справка с форекса осталась - это ошибка. Вы, надеюсь, понимаете, что цена Ласт не всегда меняется после совершения сделки.
 
Dmitriy Skub:
Скорей всего, справка с форекса осталась - это ошибка. Вы, надеюсь, понимаете, что цена Ласт не всегда меняется после совершения сделки.

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

 
Trader Fortis:

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

Если пришел тик, и Вы получили TICK_FLAG_LAST, а цена не изменилась, значит произошла сделка по предыдущей цене

это вполне нормально.