Если эти статьи станут серией, то это будет просто замечательно!!!
Как же мне не хватало подобных статей года четыре назад, когда я начал учится писать код.
Да и сейчас нахожу в них, то чего ещё не знал.
Особенно в предыдущей про StringFormat и PrintFormat очень познавательно, учитывая, что справка по этим функциям весьма скудная.
Спасибо автору за интересные и нужные статьи!
- www.mql5.com
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.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Vladimir Karputov, 2016.10.15 08:38
Пожалуйста, в русской части форума пишите на русском языке.Забыл, наверное. Спасибо.
//+------------------------------------------------------------------+ //| Выводит в журнал описание всех полей структуры 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 );
Возвращает исходник функции распечатки по исходнику структуры.
string GetPrintSource( const string Source ) { return("string ToString( const STRUCT &Data ) { return(\"i = \" + (string)Data.i); }"); } void OnStart() { Print(GetPrintSource("struct STRUCT { int i; };")); }Нечто похожее делал здесь, но с инпутами.
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Структуры в MQL5 и способы вывода их данных на печать:
В статье рассмотрим структуры MqlDateTime, MqlTick, MqlRates, MqlBookInfo и способы вывода данных этих структур на печать. Для того, чтобы распечатать все поля структуры есть стандартная функция ArrayPrint(), которая выводит в удобном табличном формате данные, содержащиеся в массиве с типом обрабатываемой структуры.
Структуры MqlParam и MqlTradeRequest служат для передачи технической информации для создания индикаторов и отсылки торговых запросов на сервер. Мы сами заполняем нужные поля структур в соответствии с необходимым результатом отправки данных в заполненной структуре. Т.е. эти структуры особо не нуждаются в том, чтобы вывести на печать данные, которыми были заполнены поля этих структур программистом самостоятельно.
А вот остальные структуры возвращают результаты запросов, и каждое поле заполняется либо подсистемой терминала, либо торговым сервером. Получить данные из этих структур, проанализировать программно заполненные поля структур, либо распечатать в журнал для последующего ручного анализа — весьма удобно и необходимо как для принятия решения программно, так и для понимания и поиска места логической ошибки.
Для того, чтобы распечатать все поля структуры есть стандартная функция ArrayPrint(), которая выводит в удобном табличном формате данные, содержащиеся в массиве с типом обрабатываемой структуры. Но иногда нужно вывести на печать данные из структуры и в другом формате, который может быть удобнее табличного представления. Например, в одну строку вывести все поля структуры — с заголовками и соответствующими им данными. Для анализа больших массивов данных это может быть удобнее. В то же время иногда требуется видеть более детальное представление — с описанием полей структуры и иным представлением соответствующих данных.
Автор: Artyom Trishkin