2026-02-28 23:41:32 +07:00
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| 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());
|
2026-03-01 22:36:29 +07:00
|
|
|
|
2026-02-28 23:41:32 +07:00
|
|
|
/* Пример вывода:
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
//+------------------------------------------------------------------+
|