//+------------------------------------------------------------------+ //| 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 */ } //+------------------------------------------------------------------+