//+------------------------------------------------------------------+ //| TestMqlBookInfo.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Объявляем массив для хранения снимка стакана цен MqlBookInfo array[]; //--- Если не получилось открыть стакан цен и подписаться на его события - сообщаем об этом и уходим if(!MarketBookAdd(Symbol())) { Print("MarketBookAdd failed, error: ",(string)GetLastError()); return; } //--- Если записи стакана цен получить не удалось - сообщаем об этом и уходим if(!MarketBookGet(Symbol(),array)) { Print("MarketBookGet failed, error: ",(string)GetLastError()); return; } //--- Распечатываем в журнале снимок стакана цен из массива в виде строк MqlBookInfoPrintTable(Symbol(),array,14,2); //--- Если не получилось отписаться от стакана цен - сообщим об ошибке в журнал if(!MarketBookRelease(Symbol())) Print("MarketBookRelease failed, error: ",(string)GetLastError()); /* Пример вывода: Market Book by GBPUSD [00]: Type: Sell Price: 1.28627 Volume: 100 Volume Real: 100.00 Market Book by GBPUSD [01]: Type: Sell Price: 1.28620 Volume: 50 Volume Real: 50.00 Market Book by GBPUSD [02]: Type: Sell Price: 1.28618 Volume: 20 Volume Real: 20.00 Market Book by GBPUSD [03]: Type: Sell Price: 1.28615 Volume: 10 Volume Real: 10.00 Market Book by GBPUSD [04]: Type: Buy Price: 1.28610 Volume: 10 Volume Real: 10.00 Market Book by GBPUSD [05]: Type: Buy Price: 1.28606 Volume: 20 Volume Real: 20.00 Market Book by GBPUSD [06]: Type: Buy Price: 1.28605 Volume: 50 Volume Real: 50.00 Market Book by GBPUSD [07]: Type: Buy Price: 1.28599 Volume: 100 Volume Real: 100.00 */ } //+------------------------------------------------------------------+ //| Возвращает в виде строки тип заявки в стакане цен | //+------------------------------------------------------------------+ string MqlBookInfoType(const MqlBookInfo &book,const uint header_width=0,const uint indent=0) { //--- Получаем значение типа заявки ENUM_BOOK_TYPE book_type=book.type; //--- "Вырезаем" из строки, полученной из enum, только тип string type=StringSubstr(EnumToString(book_type),10); //--- Преобразуем все полученные символы в нижний регистр и заменяем первую букву с маленькой на заглавную if(type.Lower()) type.SetChar(0,ushort(type.GetChar(0)-0x20)); //--- Заменяем в полученной строке все символы подчёркивания на символ пробела StringReplace(type,"_"," "); //--- Определяем текст заголовка и ширину поля заголовка //--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1 string header="Type:"; uint w=(header_width==0 ? header.Length()+1 : header_width); //--- Возвращаем значение свойства с заголовком с нужной шириной и отступом return StringFormat("%*s%-*s%-s",indent,"",w,header,type); /* Пример вывода: Type: Sell */ } //+------------------------------------------------------------------+ //| Возвращает в виде строки цену заявки в стакане цен | //+------------------------------------------------------------------+ string MqlBookInfoPrice(const string symbol,const MqlBookInfo &book,const uint header_width=0,const uint indent=0) { //--- Определяем текст заголовка и ширину поля заголовка //--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1 string header="Price:"; uint w=(header_width==0 ? header.Length()+1 : header_width); //--- Получаем количество знаков после запятой int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); //--- Возвращаем значение свойства с заголовком с нужной шириной и отступом return StringFormat("%*s%-*s%-.*f",indent,"",w,header,dg,book.price); /* Пример вывода: Price: 1.28498 */ } //+------------------------------------------------------------------+ //| Возвращает в виде строки объём заявки в стакане цен | //+------------------------------------------------------------------+ string MqlBookInfoVolume(const MqlBookInfo &book,const uint header_width=0,const uint indent=0) { //--- Определяем текст заголовка и ширину поля заголовка //--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1 string header="Volume:"; uint w=(header_width==0 ? header.Length()+1 : header_width); //--- Возвращаем значение свойства с заголовком с нужной шириной и отступом return StringFormat("%*s%-*s%-lld",indent,"",w,header,book.volume); /* Пример вывода: Volume: 100 */ } //+------------------------------------------------------------------+ //| Возвращает в виде строки объём заявки с повышенной точностью | //+------------------------------------------------------------------+ string MqlBookInfoVolumeReal(const MqlBookInfo &book,const uint header_width=0,const uint indent=0) { //--- Определяем текст заголовка и ширину поля заголовка //--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1 string header="Volume Real:"; uint w=(header_width==0 ? header.Length()+1 : header_width); //--- Возвращаем значение свойства с заголовком с нужной шириной и отступом return StringFormat("%*s%-*s%-.2f",indent,"",w,header,book.volume_real); /* Пример вывода: Volume Real: 100.00 */ } //+------------------------------------------------------------------+ //| Выводит в журнал описание всех полей структуры MqlRates | //+------------------------------------------------------------------+ void MqlBookInfoPrint(const string symbol,const MqlBookInfo &book, const bool short_entry=true,const uint header_width=0,const uint indent=0,int index=WRONG_VALUE) { //--- Объявляем переменную для хранения результата string res=""; //--- Получаем количество знаков после запятой и строковое значение индекса int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); string num=(index==WRONG_VALUE ? "" : StringFormat("[%02ld]",index)); //--- "Вырезаем" из строки с наименованием типа заявки, полученной из enum, только тип string type=StringSubstr(EnumToString(book.type),10); //--- Преобразуем все полученные символы в нижний регистр и заменяем первую букву с маленькой на заглавную if(type.Lower()) type.SetChar(0,ushort(type.GetChar(0)-0x20)); //--- Заменяем в полученной строке все символы подчёркивания на символ пробела StringReplace(type,"_"," "); //--- Если краткая запись - выводим в журнал данные записи стакана в формате [index] Type Price V VR if(short_entry) { res=StringFormat("%-8s%-11s%- *.*f Volume%- 5lld Real%- 8.2f", num,type,dg+4,dg,book.price,book.volume,book.volume_real); Print(res); } /* Пример вывода: [00] Sell 1.28598 Volume 100 Real 100.00 */ //--- Иначе else { //--- создаём строку с описанием всех данных структуры с отступами и заданной шириной поля заголовка res=StringFormat("Market Book by %s %s:\n%s\n%s\n%s\n%s",symbol,num, MqlBookInfoType(book,header_width,indent), MqlBookInfoPrice(symbol,book,header_width,indent), MqlBookInfoVolume(book,header_width,indent), MqlBookInfoVolumeReal(book,header_width,indent) ); //--- Выводим в журнал полученную строку Print(res); } /* Пример вывода BoolInfo by GBPUSD [00]: Type: Sell Price: 1.28588 Volume: 100 Volume Real: 100.00 */ } //+------------------------------------------------------------------+ //| Выводит в журнал записи стакана цен в кратком формате | //+------------------------------------------------------------------+ void MqlBookInfoPrintShort(const string symbol,const MqlBookInfo &book_array[]) { PrintFormat("Market Book by %s:",symbol); for(int i=0;i<(int)book_array.Size();i++) MqlBookInfoPrint(symbol,book_array[i],true,0,0,i); } //+------------------------------------------------------------------+ //| Выводит в журнал записи стакана цен в табличном формате | //+------------------------------------------------------------------+ void MqlBookInfoPrintTable(const string symbol,const MqlBookInfo &book_array[],const uint header_width=0,const uint indent=0) { for(int i=0;i<(int)book_array.Size();i++) MqlBookInfoPrint(symbol,book_array[i],false,header_width,indent,i); } //+------------------------------------------------------------------+