Обсуждение статьи "Структуры в MQL5 и способы вывода их данных на печать"

 

Опубликована статья Структуры в MQL5 и способы вывода их данных на печать:

В статье рассмотрим структуры MqlDateTime, MqlTick, MqlRates, MqlBookInfo и способы вывода данных этих структур на печать. Для того, чтобы распечатать все поля структуры есть стандартная функция ArrayPrint(), которая выводит в удобном табличном формате данные, содержащиеся в массиве с типом обрабатываемой структуры.

Структуры MqlParam и MqlTradeRequest служат для передачи технической информации для создания индикаторов и отсылки торговых запросов на сервер. Мы сами заполняем нужные поля структур в соответствии с необходимым результатом отправки данных в заполненной структуре. Т.е. эти структуры особо не нуждаются в том, чтобы вывести на печать данные, которыми были заполнены поля этих структур программистом самостоятельно.
А вот остальные структуры возвращают результаты запросов, и каждое поле заполняется либо подсистемой терминала, либо торговым сервером. Получить данные из этих структур, проанализировать программно заполненные поля структур, либо распечатать в журнал для последующего ручного анализа — весьма удобно и необходимо как для принятия решения программно, так и для понимания и поиска места логической ошибки.


Для того, чтобы распечатать все поля структуры есть стандартная функция ArrayPrint(), которая выводит в удобном табличном формате данные, содержащиеся в массиве с типом обрабатываемой структуры. Но иногда нужно вывести на печать данные из структуры и в другом формате, который может быть удобнее табличного представления. Например, в одну строку вывести все поля структуры — с заголовками и соответствующими им данными. Для анализа больших массивов данных это может быть удобнее. В то же время иногда требуется видеть более детальное представление — с описанием полей структуры и иным представлением соответствующих данных.

Автор: Artyom Trishkin

 
Данного автора уже по названию статьи определяю :)))))
 

Если эти статьи станут серией, то это будет просто замечательно!!!

Как же мне не хватало подобных статей года четыре назад, когда я начал учится писать код.

Да и сейчас нахожу в них, то чего ещё не знал.

Особенно в предыдущей про StringFormat и PrintFormat очень познавательно, учитывая, что справка по этим функциям весьма скудная.

Спасибо автору за интересные и нужные статьи!

StringFormat(). Обзор, готовые примеры использования
StringFormat(). Обзор, готовые примеры использования
  • www.mql5.com
Статья является продолжением обзора функции PrintFormat(). Рассмотрим вкратце форматирование строк при помощи StringFormat() и их дальнейшее использование в программе. Напишем шаблоны для вывода информации о символе в журнал терминала. Статья будет полезна как новичкам, так и уже опытным разработчикам.
 
Очень хорошая статья. Где находится файл mqh, который мы можем скачать?
 
Zhongquan Jiang # :
Very good article. Where is the mqh file for us to download?

Files are not attached to the article, as it was conceived as a kind of extended reference information. You can simply use Copy-Paste codes from the article in the MetaEditor code editor.

 
Artyom Trishkin #:

Files are not attached to the article, as it was conceived as a kind of extended reference information. You can simply use Copy-Paste codes from the article in the MetaEditor code editor.

 
функция MqlRatesPrint отсутствует в данной статье
 
Fokus24 #:
функция MqlRatesPrint отсутствует в данной статье

Забыл, наверное. Спасибо.

//+------------------------------------------------------------------+
//| Выводит в журнал описание всех полей структуры 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
   */
  }
//+------------------------------------------------------------------+
 

Предлагаю дополнить функционал.


string GetPrintSource( const string Source );

Возвращает исходник функции распечатки по исходнику структуры.

 
fxsaber #:

Предлагаю дополнить функционал.


Возвращает исходник функции распечатки по исходнику структуры.

Пример можно? Не понял.

 
Artyom Trishkin #:

Пример можно? Не понял.

string GetPrintSource( const string Source )
{
  return("string ToString( const STRUCT &Data ) { return(\"i = \" + (string)Data.i); }");
}

void OnStart()
{
  Print(GetPrintSource("struct STRUCT { int i; };"));
}
Нечто похожее делал здесь, но с инпутами.
CheckInputs - нахождение аварийных проходов при Оптимизации советника
CheckInputs - нахождение аварийных проходов при Оптимизации советника
  • www.mql5.com
Во время Оптимизации советника некоторые проходы могут завершаться аварийно. Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий Новая версия платформы MetaTrader 5