Это очень короткая статья с очень небольшим количеством кода. Посмотрим в следующей части, имеет ли смысл иметь часть 1, 2 и так далее.
SYMBOL_TICKS_BOOKDEPTH дает максимальное количество запросов, отображаемых в Depth of Market. Неверно, что это свойство дает тот же результат, что и подсчет количества уровней в DOM. Оно дает максимальное, а не точное число.
Вы можете сделать это с помощью данного скрипта:
//+------------------------------------------------------------------+ //|TestOnderBook.mq5 | //|Copyright 2025, Samuel Manoel De Souza | //| https://www.mql5.com/en/users/samuelmnl | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, Samuel Manoel De Souza" #property link "https://www.mql5.com/en/users/samuelmnl" #property version "1.00" //+------------------------------------------------------------------+ //| Функция запуска программы сценария| //+------------------------------------------------------------------+ int OnInit(void) { MarketBookAdd(_Symbol); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { MarketBookRelease(_Symbol); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void OnTick(void) { } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void OnBookEvent(const string& symbol) { double tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); MqlBookInfo book[]; MarketBookGet(_Symbol, book); int total = ArraySize(book); if(total == 0) { Print("there is no order available on the book"); ExpertRemove(); return; } int buy_levels = 0, sell_levels = 0; int buy_gaps = 0, sell_gaps = 0, gaps = 0; for(int i = 0; i < total; i++) { Print("price: ", book[i].price, ", volume: ", book[i].volume, ", type: ", EnumToString(book[i].type)); buy_levels += book[i].type == BOOK_TYPE_BUY ? 1 : 0; sell_levels += book[i].type == BOOK_TYPE_SELL ? 1 : 0; if(i > 0) { bool is_gap = fabs(book[i].price - book[i - 1].price) >= 2 * tick_size; gaps += is_gap ? 1 : 0; buy_gaps += is_gap && book[i].type == book[i - 1].type && book[i].type == BOOK_TYPE_BUY ? 1 : 0; sell_gaps += is_gap && book[i].type == book[i - 1].type && book[i].type == BOOK_TYPE_SELL ? 1 : 0; } } Print("max levels: ", SymbolInfoInteger(_Symbol, SYMBOL_TICKS_BOOKDEPTH)); Print("levels: ", total); Print("buy levels: ", buy_levels); Print("sell levels: ", sell_levels); Print("gaps: ", gaps); Print("buy gaps: ", buy_gaps); Print("sell gap: ", sell_gaps); ExpertRemove(); } //+------------------------------------------------------------------+
Это очень короткая статья с очень небольшим количеством кода. Посмотрим в следующей части, имеет ли смысл иметь часть 1, 2 и так далее.
SYMBOL_TICKS_BOOKDEPTH дает максимальное количество запросов, отображаемых в Depth of Market. Неверно, что это свойство дает тот же результат, что и подсчет количества уровней в DOM. Оно дает максимальное, а не точное число.
Вы можете сделать это с помощью данного скрипта:
статья суппер! тоже хотел в планах по стакану написать ТС - точнее с использованием стакана котировок!

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Разработка торговой системы на основе стакана цен (Часть I): индикатор:
Стакан цен Depth of Market, несомненно, является очень важным элементом для выполнения быстрых сделок, особенно в алгоритмах высокочастотного трейдинга (HFT). В этой серии статей мы рассмотрим этот тип торговых событий, которые можно получить через брокера на многих торгуемых символах. Начнем с индикатора, в котором можно настроить цветовую палитру, положение и размер гистограммы, отображаемой непосредственно на графике. Мы также рассмотрим, как сгенерировать события BookEvent для тестирования индикатора в определенных условиях. Другие возможные темы для будущих статей - это хранение данных ценовых распределений и способы их использования в тестере стратегий.
Давайте вспомним, что такое Depth of Market- это ряд отложенных лимитных ордеров. Эти ордера представляют собой торговые «намерения» участников рынка и часто не превращаются в настоящую сделку. Это связано с тем, что у участников есть возможность отменить ранее установленные ордеры по различным причинам. К ним относятся изменения рыночных условий и, как следствие, отсутствие заинтересованности в выполнении ордера в объеме и по цене, указанной выше.
Значение, возвращаемое функцией `SymbolInfoInteger(_Symbol, SYMBOL_TICKS_BOOKDEPTH)`, как раз и является глубиной стакана цен и представляет собой половину массива, который заполнится ценовыми уровнями, с которыми предстоит работать. Одна половина данного массива отводится под количество лимитных ордеров на продажу, а другая - под количество установленных лимитных ордеров на покупку. Согласно документации, для символов без строки заявок значение данного свойства равно нулю. Пример этого мы видим на рисунке ниже, где показан стакан цен, глубина которого равна 10 и где видны все доступные ценовые уровни.
Следует отметить, что глубину можно получить из символа и не обязательно из стакана цен. Чтобы получить значения этого свойства достаточно использовать функцию SymbolInfoInteger, не прибегая к идентификатору OnBookEvent и связанным с ним функциям, таким как MarketBookAdd. Конечно, мы можем получить тот же результат, подсчитав количество элементов массива типа MqlBookInfo, которые заполняет идентификатор OnBookEvent, как мы увидим более подробно далее.
Автор: Daniel Santos