У последней обновленной цены нет флагов TICK_FLAG_BUY или TICK_FLAG_SELL но при этом есть обьем, как так?

 

Есть индикатор который отображает объемы за каждый тик, но в результатах появляются объемы у которых нет флагов TICK_FLAG_BUY или TICK_FLAG_SELL. Каким образом появляется объем без флага кули или продажи? Хочу отметить что при загрузки истории тиков такого несоответствия нет. Инструмент Si Splice,M1, брокер Открытие.

int OnInit(){
   printf( TICK_FLAG_BID + " = TICK_FLAG_BID - тик изменил цену бид");
   printf(TICK_FLAG_ASK + " = TICK_FLAG_ASK  – тик изменил цену аск");
   printf(TICK_FLAG_LAST + " = TICK_FLAG_LAST – тик изменил цену последней сделки");
   printf(TICK_FLAG_VOLUME + " = TICK_FLAG_VOLUME – тик изменил объем");
   printf(TICK_FLAG_BUY + " = TICK_FLAG_BUY – тик возник в результате сделки на покупку");
   printf(TICK_FLAG_SELL + " = TICK_FLAG_SELL – тик возник в результате сделки на продажу");
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick)){
      if((last_tick.flags & TICK_FLAG_BUY) == TICK_FLAG_BUY)
         printf("BUY - " + last_tick.flags + " Volume - " + last_tick.volume);
      else if((last_tick.flags & TICK_FLAG_SELL) == TICK_FLAG_SELL)
         printf("Shell - " + last_tick.flags + " Volume - " + last_tick.volume);
      else
         printf("Other - " + last_tick.flags + " Volume - " + last_tick.volume);
   }
   return(rates_total);
}


кусочек результата выполнения

2019.09.20 10:20:10.275    2019.09.13 00:00:00   2 = TICK_FLAG_BID - тик изменил цену бид
2019.09.20 10:20:10.275    2019.09.13 00:00:00   4 = TICK_FLAG_ASK  – тик изменил цену аск
2019.09.20 10:20:10.275    2019.09.13 00:00:00   8 = TICK_FLAG_LAST – тик изменил цену последней сделки
2019.09.20 10:20:10.275    2019.09.13 00:00:00   16 = TICK_FLAG_VOLUME – тик изменил объем
2019.09.20 10:20:10.275    2019.09.13 00:00:00   32 = TICK_FLAG_BUY – тик возник в результате сделки на покупку
2019.09.20 10:20:10.275    2019.09.13 00:00:00   64 = TICK_FLAG_SELL – тик возник в результате сделки на продажу

-----

2019.09.20 10:20:10.390    2019.09.13 10:00:00   Shell - 344 Volume - 3
2019.09.20 10:20:10.392    2019.09.13 10:00:00   Other - 6 Volume - 3
2019.09.20 10:20:10.393    2019.09.13 10:00:00   BUY - 312 Volume - 2

П.С. Изменил код чтобы никого не путать сокращенной записью

Файлы:
 
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick)){
      if((last_tick.flags & TICK_FLAG_BUY)==TICK_FLAG_BUY)
         printf("BUY - " + last_tick.flags + " Valume - " + last_tick.volume);
      else if((last_tick.flags & TICK_FLAG_SELL)==TICK_FLAG_SELL)
         printf("Shell - " + last_tick.flags + " Valume - " + last_tick.volume);
      else
         printf("Other - " + last_tick.flags + " Valume - " + last_tick.volume);
   }
   return(rates_total);
}
 
prostotrader:

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

2 = TICK_FLAG_BID

и
4 = TICK_FLAG_ASK
а также присутствует объем. То есть строка
2019.09.20 10:20:10.392    2019.09.13 10:00:00   Other - 6 Volume - 3
говорит о том что произошло изменение цены BID и ASK при этом прошел объем, но не указанно была ли это покупка или продажа. Почему так происходит?

З.Ы. Правильно ли я понимаю, что это два лимитника исполнились по цене которая устроила обоих?
 
Aleksu:

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

2 = TICK_FLAG_BID

и
4 = TICK_FLAG_ASK
а также присутствует объем. То есть строка
2019.09.20 10:20:10.392    2019.09.13 10:00:00   Other - 6 Volume - 3
говорит о том что произошло изменение цены BID и ASK при этом прошел объем, но не указанно была ли это покупка или продажа. Почему так происходит?

З.Ы. Правильно ли я понимаю, что это два лимитника исполнились по цене которая устроила обоих?

Не правильно, лимит с лимитом не сводится.

Когда кто-то убрал лимитный ордер в стакане или поставил происходит изменение цены BID или ASK, и это не значит что совершена сделка, в вашем примере объем указывается от последней сделки, к тому же потеря тиков, чтобы не терять тики надо использовать CopyTicks 

 
Rafil Nurmukhametov:

Не правильно, лимит с лимитом не сводится.

Когда кто-то убрал лимитный ордер в стакане или поставил происходит изменение цены BID или ASK, и это не значит что совершена сделка, в вашем примере объем указывается от последней сделки, к тому же потеря тиков, чтобы не терять тики надо использовать CopyTicks 

Вот пример, в стакане есть лимитный ордер на продажу по 100 рублей а я выставляю лимитный ордер на покупку по 100 рублей (спред равен 0). Разве же эти 2 лимитника не сводятся вместе до образования естественного спреда? И вот если следовать этой логикке то всё сходится. Появляется контракт с объемом который изменил цену, при этом не было рыночной продажи или рыночной покупки.
А на счет потере тиков спасибо.

 
Aleksu:

Вы получаете все тики: торговые и не торговые. Получайте только торговые тики (CopyTicks() или CopyTicksRange()) и проблем не будет (на реале открытия и бкс, по крайней мере их нет).

 
Я не понимаю, а с чего  вы вообще взяли, что без флагов  TICK_FLAG_BUY и TICK_FLAG_SELL в volume должен лежать всегда 0 ?  
 
pivomoe:
Я не понимаю, а с чего  вы вообще взяли, что без флагов  TICK_FLAG_BUY и TICK_FLAG_SELL в volume должен лежать всегда 0 ?  

А Вы прочтите справку на функции CopyTicks и CopyTicksRange