CustomBookAdd

Передает состояние стакана цен по пользовательскому инструменту. Функция позволяет транслировать стакан цен так, как если бы он приходил от сервера брокера.

bool  CustomBookAdd(
   const string        symbol,            // имя символа
   const MqlBookInfo&  books[]            // массив с описаниями элементов стакана цен
   uint                count=WHOLE_ARRAY  // количество элементов, которые будут добавлены из массива books[]
   );

Параметры

symbol

[in]  Имя пользовательского инструмента.

books[]

[in]   Массив данных типа MqlBookInfo, полностью описывающих состояние стакана цен — все заявки на покупку и продажу. Переданное состояние стакана цен полностью заменяет предыдущее.

count=WHOLE_ARRAY

[in]   Количество элементов массива books[], которое должно быть передано в функцию. По умолчанию используется весь массив.

Возвращаемое значение

true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Функция CustomBookAdd работает только для пользовательских символов, по которым открыт стакан цен — через интерфейс платформы или функцию MarketBookAdd.

При вбросе стакана цен Bid и Ask инструмента не обновляются. Вы должны самостоятельно контролировать изменение лучших цен и вбрасывать тики при помощи CustomTicksAdd.

Передаваемые данные проверяются на корректность: для каждого элемента должны быть указаны тип, цена и объем. При этом MqlBookInfo.volume и MqlBookInfo.volume_real не должны быть нулевыми или отрицательными, если оба объема отрицательны, то это будет считаться ошибкой.  Указывать можно любой из объемов или оба — берется тот, который указан или является положительным:

volume=-1 && volume_real=2 — будет использован volume_real=2,
volume=3 && volume_real=0 — будет использован volume=3.

Объем с повышенной точностью MqlBookInfo.volume_real имеет больший приоритет по сравнению с обычным MqlBookInfo.volume. Если для элемента стакана указаны оба значения, будет использовано volume_real.

Если хотя бы один элемент стакана описан неверно, система отбросит переданное состояние полностью.

Порядок следования элементов MqlBookInfo в массиве books не имеет значения. При сохранении данных терминал сортирует их по цене самостоятельно.

При сохранении данных проверяется параметр "Глубина стакана" (SYMBOL_TICKS_BOOKDEPTH) принимающего пользовательского инструмента. Если количество заявок на продажу в передаваемом стакане цен превышает это значение, лишние уровни отбрасываются. Аналогично для заявок на покупку.

Пример заполнения массива books:

Состояние стакана цен

Заполнение books[]

Пример стакана цен

books[0].type=BOOK_TYPE_SELL;
books[0].price=1.14337;
books[0].volume=100;   
books[1].type=BOOK_TYPE_SELL;
books[1].price=1.14330;
books[1].volume=50;   
books[2].type=BOOK_TYPE_SELL;
books[2].price=1.14335;
books[2].volume=40;   
books[3].type=BOOK_TYPE_SELL;
books[3].price=1.14333;
books[3].volume=10;   
books[4].type=BOOK_TYPE_BUY;
books[4].price=1.14322;
books[4].volume=10;   
books[5].type=BOOK_TYPE_BUY;
books[5].price=1.14320;
books[5].volume=90;  
books[6].type=BOOK_TYPE_BUY;
books[6].price=1.14319;
books[6].volume=100;   
books[7].type=BOOK_TYPE_BUY;
books[7].price=1.14318;
books[7].volume=10;

Пример:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- включаем стакан цен для инструмента, из которого будем брать данные
   MarketBookAdd(Symbol());
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Tick function                                                    |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   MqlTick ticks[];
   ArrayResize(ticks,1);
//--- скопируем текущие цены из обычного инструмента в пользовательский
   if(SymbolInfoTick(Symbol(),ticks[0]))
     {
      string symbol_name=Symbol()+".SYN";
      CustomTicksAdd(symbol_name,ticks);
     }
  }
//+------------------------------------------------------------------+
//| Book function                                                    |
//+------------------------------------------------------------------+
void OnBookEvent(const string &book_symbol)
  {
//--- скопируем текущее состояние стакана цен из обычного инструмента в пользовательский
   if(book_symbol==Symbol())
     {
      MqlBookInfo book_array[];
      if(MarketBookGet(Symbol(),book_array))
        {
         string symbol_name=Symbol()+".SYN";
         CustomBookAdd(symbol_name,book_array);
        }
     }
  }
//+------------------------------------------------------------------+

Смотри также

MarketBookAdd, CustomTicksAdd, OnBookEvent