Art12900_Structs/TestMqlBookInfo.mq5

217 行
12 KiB
MQL5

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);
}
//+------------------------------------------------------------------+