252 行
23 KiB
MQL5
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
|
|
*/
|
|
}
|
|
//+------------------------------------------------------------------+
|