Стакан и сделки - страница 2

 

Да, совсем забыл, индексация максимального и минимального объёма в массивах ведется так


 
prostotrader:

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

Ок, но я бы на Вашем месте проверил в конце свечи собрав общий объем и сравнив с эталонным.

 
Alexey Kozitsyn:

Ок, но я бы на Вашем месте проверил в конце свечи собрав общий объем и сравнив с эталонным.

Спасибо, попробую сделать так, но визуально видно, что все правильно.

 
prostotrader:

Спасибо, попробую сделать так, но визуально видно, что все правильно.

:)

 
Alexey Kozitsyn:

:)

Нет, правда, на демо стаканы еле шевелятся, и когда идут подряд одиночные сделки (несколько), то всё

прекрасно видно. 

 
prostotrader:

Нет, правда, на демо стаканы еле шевелятся, и когда идут подряд одиночные сделки (несколько), то всё

прекрасно видно. 

Дак о том и речь, что на спокойном рынке Вы увидите все. А вот когда начнется движ... Вот для таких случаев и нужны проверки.

 
Alexey Kozitsyn:

Дак о том и речь, что на спокойном рынке Вы увидите все. А вот когда начнется движ... Вот для таких случаев и нужны проверки.

Алгоритм не зависит от "спокойности" стакана :)

Но я обязательно проверю, спасибо.

Добавлено

Вся прелесть этого класса в том, что у него нет привязки к ТФ, все данные получаем в реальном времени.

Сработал OnBookEvrent - получили данные. 

//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent(const string &symbol)
{
  if(symbol == br_symbol)
  {
    br_stakan.RefreshStData();
    br_data = br_stakan.GetStData();
    if(br_data.deals.sell_cnt > 0)
    {
      Print(br_symbol, ": Sell deals = ", br_data.deals.sell_cnt);
      Print(br_symbol, ": Sell volume = ", br_data.deals.sell_volume);
    }
    if(br_data.deals.buy_cnt > 0)
    {
      Print(br_symbol, ": Buy deals = ", br_data.deals.buy_cnt);
      Print(br_symbol, ": Buy volume = ", br_data.deals.buy_volume);
    }  
  }
  else
  if(symbol == si_symbol)
  {
    si_stakan.RefreshStData();
    si_data = si_stakan.GetStData();
    if(si_data.deals.sell_cnt > 0)
    {
      Print(si_symbol, ": Sell deals = ", si_data.deals.sell_cnt);
      Print(si_symbol, ": Sell volume = ", si_data.deals.sell_volume);
    }
    if(si_data.deals.buy_cnt > 0)
    {
      Print(si_symbol, ": Buy deals = ", si_data.deals.buy_cnt);
      Print(si_symbol, ": Buy volume = ", si_data.deals.buy_volume);
    }  
  }
}
 
Была ошибка в подсчетах индексов объёмов
Файлы:
Stakan.mqh  21 kb
 

Переделал функцию GetStData(), чтобы было невозможно получить не актуальные данные

Еще раз большое спасибо всем откликнувшимся!
Файлы:
Stakan.mqh  21 kb
 

Ддя Rafil Nurmukhametov

Возьмите класс Stakan

Вот в этом куске кода можно выделять сделки по любым параметрам 

//--- Deals
  stakan_data.deals.buy_cnt = 0;
  stakan_data.deals.sell_cnt = 0;
  stakan_data.deals.sell_volume = 0;
  stakan_data.deals.buy_volume = 0;
  oper_time.end_count = GetMicrosecondCount();
  ulong delta_time = ulong(MathAbs(double(oper_time.end_count - oper_time.start_count)));
  int result = CopyTicksRange(st_symbol, ticks_array, COPY_TICKS_TRADE, oper_time.last_tick_time, oper_time.last_tick_time + delta_time);
  if(result > 0)
  {
    for(int i = 0; i < result; i++)
    {
      if((ticks_array[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) 
      { 
        stakan_data.deals.sell_cnt++;
        stakan_data.deals.sell_volume += long(ticks_array[i].volume);
      }
      else
      if((ticks_array[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) 
      { 
        stakan_data.deals.buy_cnt++;
        stakan_data.deals.buy_volume += long(ticks_array[i].volume); 
      }
    }
    oper_time.last_tick_time = ticks_array[0].time_msc + 1;
    oper_time.start_count = GetMicrosecondCount();
  }
}