Два соседних BookEvent могут дублировать стакан

 

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

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

template <typename T>
bool ArrayEqual( const T &Array1[], const T &Array2[] )
{
  const int Amount = ArraySize(Array1);
  bool Res = (Amount == ArraySize(Array2));

  if (Res)
    for (int i = 0; i < Amount; i++)
      if (_R(Array1[i]) != Array2[i]) // https://www.mql5.com/ru/code/16280
      {
        Res = false;

        break;
      }

  return(Res);
}

template <typename T>
bool ArrayClone( const T &Source[], T &Target[] )
{
  ArrayFree(Target);

  return(ArrayCopy(Target, Source) >= 0);
}

void OnInit( void )
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int Reason )
{
  MarketBookRelease(_Symbol);
}

void OnBookEvent( const string &symbol )
{
  static MqlBookInfo PrevBook[];
  MqlBookInfo Book[];

  if ((symbol == _Symbol) && MarketBookGet(symbol, Book))
  {
    if (ArrayEqual(Book, PrevBook))
    {
      if (ArraySize(PrevBook) > 0)
        Alert("Book == PrevBook");
    }
    else
      ArrayClone(Book, PrevBook);
  }
}

 Результат

2016.09.14 17:24:30.896 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:30.896 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:30.896 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:30.896 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:30.896 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:30.896 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:30.896 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:30.896 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:29.406 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:23.151 Test2 (Si-9.16,M1)      Book == PrevBook
2016.09.14 17:24:23.151 Test2 (Si-9.16,M1)      Book == PrevBook
Причин таких ситуаций может быть много: от пропуска MT5 некоторых стаканов, до генерацией самой биржей дубль-стаканов.
 
fxsaber:

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

 Результат

Причин таких ситуаций может быть много: от пропуска MT5 некоторых стаканов, до генерацией самой биржей дубль-стаканов.
Биржа не может делать дублей
 
prostotrader:
Биржа не может делать дублей
Вот этого просто не знаю. У меня стакан доступен только на 20 уровней. Возможно, биржа генерирует стакан для брокеров на большее количество уровней, а MT5 потом его обрезает. И вот если в стакане биржи, например, на 21-м банде произошли изменения, то MT5 отправит пользователю данные, что стакан пришел, но изменений в нем не будет видно. Это, как гипотеза.
 
fxsaber:
Вот этого просто не знаю. У меня стакан доступен только на 20 уровней. Возможно, биржа генерирует стакан для брокеров на большее количество уровней, а MT5 потом его обрезает. И вот если в стакане биржи, например, на 21-м банде произошли изменения, то MT5 отправит пользователю данные, что стакан пришел, но изменений в нем не будет видно. Это, как гипотеза.
В биржевом ПО - потоки, а нам отдаются срезы потоков, поэтому не может быть дублей
 
fxsaber:

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

 Результат

Причин таких ситуаций может быть много: от пропуска MT5 некоторых стаканов, до генерацией самой биржей дубль-стаканов.

Процедура сравнения не очевидна:

if (_R(Array1[i]) != Array2[i])

С явным сравнением будут выдаваться те же результаты?

 
Vasiliy Sokolov:

Процедура сравнения не очевидна:

С явным сравнением будут выдаваться те же результаты?

Явное сравнение просто не пройдет - нет операторов сравнения для структур.
 
fxsaber:
Явное сравнение просто не пройдет - нет операторов сравнения для структур.

А переопределить оператор? ;-)

 
Dennis Kirichenko:

А переопределить оператор? ;-)

Для MqlBookInfo?!
 
fxsaber:
Явное сравнение просто не пройдет - нет операторов сравнения для структур.
Dennis Kirichenko:

А переопределить оператор? ;-)

fxsaber:
Для MqlBookInfo?!

Усложняете парни. Три строчки ведь требуется вставить:

void BookCompare(MqlBookInfo info1, MqlBookInfo info2)
{
   bool res = info1.type == info2.type && info1.price == ....
   return res;
}
* double лучше сравнивать православно, а не как у меня в примере. Ну это я думаю и так понятно.
 
Vasiliy Sokolov:

Усложняете парни. Три строчки ведь требуется вставить:

А универсальное решение сравнения любых массивов?
template <typename T>
bool ArrayEqual( const T &Array1[], const T &Array2[] )
{
  const int Amount = ArraySize(Array1);
  bool Res = (Amount == ArraySize(Array2));

  if (Res)
    for (int i = 0; i < Amount; i++)
      if (_R(Array1[i]) != Array2[i]) // https://www.mql5.com/ru/code/16280
      {
        Res = false;

        break;
      }

  return(Res);
}
 
fxsaber:
А универсальное решение сравнения любых массивов?

А особенности чисел типа double