Art12900_Structs/TestMqlRates.mq5
2026-03-02 00:59:38 +07:00

252 行
23 KiB
MQL5

//+------------------------------------------------------------------+
//| TestMqlRates.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()
{
//---
MqlRates array[];
if(CopyRates(Symbol(),PERIOD_CURRENT,0,4,array)!=4)
{
Print("CopyRates failed, error: ",(string)GetLastError());
return;
}
//--- Устанавливаем индексацию массива как у таймсерии
ArraySetAsSeries(array,true);
//--- В цикле по массиву с полученными данными баров распечатываем в журнале краткие записи
for(int i=0;i<(int)array.Size();i++)
MqlRatesPrint(Symbol(),PERIOD_CURRENT,array[i],false,14,2,i);
/* Пример вывода:
GBPUSD H1[0]:
Time: 2023.07.21 14:00:00
Open: 1.28451
High: 1.28541
Low: 1.28451
Close: 1.28491
Tick Volume: 1098
Spread: 4
Real Volume: 0
GBPUSD H1[1]:
Time: 2023.07.21 13:00:00
Open: 1.28678
High: 1.28685
Low: 1.28418
Close: 1.28452
Tick Volume: 3602
Spread: 1
Real Volume: 0
GBPUSD H1[2]:
Time: 2023.07.21 12:00:00
Open: 1.28581
High: 1.28696
Low: 1.28557
Close: 1.28678
Tick Volume: 4807
Spread: 1
Real Volume: 0
GBPUSD H1[3]:
Time: 2023.07.21 11:00:00
Open: 1.28695
High: 1.28745
Low: 1.28401
Close: 1.28581
Tick Volume: 7440
Spread: 1
Real Volume: 0
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки время открытия бара |
//+------------------------------------------------------------------+
string MqlRatesTime(const MqlRates &rates,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Time:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-s",indent,"",w,header,(string)rates.time);
/* Пример вывода:
Time: 2023.07.21 06:00:00
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки цену открытия бара |
//+------------------------------------------------------------------+
string MqlRatesOpen(const string symbol,const MqlRates &rates,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Open:";
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,rates.open);
/* Пример вывода:
Open: 1.28812
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки цену High бара |
//+------------------------------------------------------------------+
string MqlRatesHigh(const string symbol,const MqlRates &rates,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="High:";
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,rates.high);
/* Пример вывода:
High: 1.28859
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки цену Low бара |
//+------------------------------------------------------------------+
string MqlRatesLow(const string symbol,const MqlRates &rates,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Low:";
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,rates.low);
/* Пример вывода:
Low: 1.28757
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки цену закрытия бара |
//+------------------------------------------------------------------+
string MqlRatesClose(const string symbol,const MqlRates &rates,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Close:";
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,rates.close);
/* Пример вывода:
Close: 1.28770
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки тиковый объём бара |
//+------------------------------------------------------------------+
string MqlRatesTickVolume(const MqlRates &rates,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Tick Volume:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-lld",indent,"",w,header,rates.tick_volume);
/* Пример вывода:
Tick Volume: 963
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки спред на баре |
//+------------------------------------------------------------------+
string MqlRatesSpread(const MqlRates &rates,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Spread:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-ld",indent,"",w,header,rates.spread);
/* Пример вывода:
Spread: 4
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки биржевой объём бара |
//+------------------------------------------------------------------+
string MqlRatesRealVolume(const MqlRates &rates,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Real Volume:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-lld",indent,"",w,header,rates.real_volume);
/* Пример вывода:
Real Volume: 0
*/
}
//+------------------------------------------------------------------+
//| Выводит в журнал описание всех полей структуры MqlRates |
//+------------------------------------------------------------------+
void MqlRatesPrint(const string symbol,const ENUM_TIMEFRAMES timeframe,const MqlRates &rates,
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 tf=StringSubstr(EnumToString(timeframe==PERIOD_CURRENT ? Period() : timeframe),7);
string num=(index==WRONG_VALUE ? ":" : StringFormat("[%ld]:",index));
//--- Если краткая запись - выводим в журнал данные бара в формате Symbol TF[index]: Time, O, H, L, C, S, V/VR
if(short_entry)
{
res=StringFormat("%s %s%s %s, O: %.*f, H: %.*f, L: %.*f, C: %.*f, S: %2ld, V: %5lld, RV: %lld",
symbol,tf,num,(string)rates.time,dg,rates.open,dg,rates.high,dg,rates.low,dg,rates.close,rates.spread,rates.tick_volume,rates.real_volume);
Print(res);
}
/* Пример вывода:
GBPUSD H1: 2023.07.21 08:00:00, O: 1.28794, H: 1.28848, L: 1.28772, C: 1.28772, S: 4, V: 448, RV: 0
*/
//--- Иначе
else
{
//--- создаём строку с описанием всех данных структуры с отступами и заданной шириной поля заголовка
res=StringFormat("%s %s%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s",symbol,tf,num,
MqlRatesTime(rates,header_width,indent),
MqlRatesOpen(symbol,rates,header_width,indent),
MqlRatesHigh(symbol,rates,header_width,indent),
MqlRatesLow(symbol,rates,header_width,indent),
MqlRatesClose(symbol,rates,header_width,indent),
MqlRatesTickVolume(rates,header_width,indent),
MqlRatesSpread(rates,header_width,indent),
MqlRatesRealVolume(rates,header_width,indent)
);
//--- Выводим в журнал полученную строку
Print(res);
}
/* Пример вывода (если Last не нулевой):
Time: 2023.07.20 14:42:33
Bid: 1.28958
Ask: 1.28962
Last: 1.28947
Volume: 33
Time msc: 2023.07.20 14:42:33.401
Flags: BID|ASK
Volume Real: 33.45
Пример вывода (если Last нулевой):
Time: 2023.07.20 14:42:33
Bid: 1.28958
Ask: 1.28962
Time msc: 2023.07.20 14:42:33.401
Flags: BID|ASK
*/
}
//+------------------------------------------------------------------+