Альтернативный лог-файл c использованием HTML и CSS
Зачем это мне нужно или в чем проблема?
Любой эксперт оснащен средствами для вывода информации о его функционировании, текущем состоянии, непредвиденных ситуациях и прочих событиях. Используя данные, которые генерирует подобным образом эксперт, можно проследить за всей хронологией событий, которые он зарегистрировал, даже не запуская MetaTrader. Мы можем легко найти нужный нам день и попытаться найти интересующую нас информацию. Но проблема состоит в том, что эксперты могут оставлять просто огромное количество сообщений, разобраться в которых будет непросто даже его создателю. Что уже говорить о других пользователях, которые не имеют отношения к разработке экспертов вообще. Открывая типичный лог-файл, мы увидим море однотипной информации, которая представлена сотнями или тысячами строк.
А теперь представте себе насколько проще было бы работать, если бы лог-файл был организован следующим образом: ошибки и непредвиденные ситуации выделялись бы более крупным шрифтом красного цвета, предупреждения – персиковым цветом с меньшим размером, служебная информация – салатовым. Все торговые операции – синим цветом и так далее. То есть глядя на подобный лог-файл, вы могли бы сразу, даже не вникая и не читая, сориентироваться в том, что произошло и что же вам сообщил эксперт. Вы бегло смотрите на десятки строк и не встречаете ни одной красной или персиковой – никаких ошибок и предупреждений, все в порядке. За несколько секунд просматриваете все сообщения синего цвета и убеждаетесь, что ордеры выставлены правильно. Предел мечтаний? Ничего подобного – сейчас мы напишем библиотеку для реализации этой хитрой штуковины.
Итак, в этой статье мы напишем очень простую, но мощную библиотеку для создания html-файлов, научимся настраивать отображение последних и посмотрим, как это можно легко внедрить и использовать в вашем эксперте или скрипте.
Что мы будем использовать?
Мы воспользуемся HyperText Markup Language (HTML) для создания самих файлов и Cascading Style Sheets (CSS каскадные таблицы стилей) для настройки внешнего вида под ваш вкус. Что же такое HTML? Это язык, с помощью которого описываются веб-странички и благодаря которому вы сейчас читаете этот текст. Мы не будем рассматривать HTML - код и вы должны поверить мне на слово и принять все, как есть. Просматривать сами логи мы будем браузером Internet Explorer, Opera или чем-нибудь еще – нет разницы чем.
Создаём библиотеку generateHTML.
Итак, теперь запускаем MetaEditor и приступаем. Создаем новую библиотеку и вставляем этот код:
//+------------------------------------------------------------------+ //| generateHTML.mq4 | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Antonio Banderass. All rights reserved" #property link "banderassa@ukr.net" #property library //---- int htmlFileHandle=-1; //+------------------------------------------------------------------+ //| CreateHtmlFile | //+------------------------------------------------------------------+ int CreateHtmlFile(string fileName, string title, string style = "styles/default.css") { int handle = FileOpen(fileName, FILE_CSV|FILE_WRITE, " "); if(handle > 0) { htmlFileHandle = handle; FileWrite(handle, "<html><head><title>", title, "</title><link rel=stylesheet href=", style, " type=text/css>", "</head><body id=body><div align-center><h3 id=title>", title, "</h3></div><hr noshade id=hr>"); } else Print("generateHTML library: error while creating html file"); return (handle); } //+------------------------------------------------------------------+ //| CloseHtmlFile | //+------------------------------------------------------------------+ void CloseHtmlFile() { if(htmlFileHandle > 0) { FileWrite(htmlFileHandle, "</body></html>"); FileClose(htmlFileHandle); } } //+------------------------------------------------------------------+ //| WriteMsg | //+------------------------------------------------------------------+ void WriteMsg(string text, string style = "text") { FileWrite(htmlFileHandle, "<font id=", style, ">", text, "</font>"); } //+------------------------------------------------------------------+ //| WriteMsgLn | //+------------------------------------------------------------------+ void WriteMsgLn(string text, string style = "text") { FileWrite(htmlFileHandle, "<font id=", style, ">", text, "</font><br>"); } //+------------------------------------------------------------------+ //| WriteMsgTime | //+------------------------------------------------------------------+ void WriteMsgTime(string text, string style = "text") { FileWrite(htmlFileHandle, "<font id=", style, ">" + TimeToStr(CurTime()) + ": ", text, "</font>"); } //+------------------------------------------------------------------+ //| WriteMsgTimeLn | //+------------------------------------------------------------------+ void WriteMsgTimeLn(string text, string style = "text") { FileWrite(htmlFileHandle, "<font id=", style, ">" + TimeToStr(CurTime()) + ": ", text, "</font><br>"); } //+------------------------------------------------------------------+
Сохраните этот файл под названием generateHTML.mq4 в папке
libraries. Сама библиотека использует только встроенные функции языка
mql4, так что ничего дополнительно подключать не нужно. Нажимаем F5.
Следует отметить, что библиотека просто создает текстовые файлы и
заполняет их HTML кодом, используя функции FileOpen(),
FileClose() и FileWrite(). Объяснять каждый тег не вижу смысла, просто
поверьте мне на слово.
Подготовка к работе.
Для нормальной работы нужно еще настроить библиотеку. Для этого
заходим в папку ...MetaTrader/experts/files. Создаём там папку logs,
заходим в нее и создаем еще одну папку styles. Заходим в последнюю
папку и создаем там файл default.css и вставляем туда этот текст:
#body { background-color: dimgray; } #title { font-size:200%; color: greenyellow; } #text { font-size: 150%; color: greenyellow; } #error { font-size: 180%; color: orangered; } #warning { font-size: 120%; color: gold; }
Позже мы рассмотрим его во всех деталях, а пока сохраняйте файл
и выходите из блокнота. На этом подготовка библиотеки закончена.
Посмотрим на что она способна.
Создаём наш первый html файл.
Создайте пустой тестовый скрипт. В начале исходника подключите нашу библиотеку директивой #include:
#include "..\libraries\generateHTML.mq4"
Теперь добавим немного кода в функцию start():
CreateHtmlFile("logs\log1.html","testing library generateHTML "+TimeToStr(CurTime()));
Эта функция создаeт html-файл с названием log1.html в папке logs. Второй параметр – это заголовок, который будет размещeн в начале файла. Последний параметр рассмотрим позже, здесь он упущен, так как используется значение по умолчанию.
Теперь все готово для вывода сообщений, поехали:
WriteMsgLn("WriteMsgLn(). Test message");
Эта функция выводит обычное текстовое сообщение. Как видно - все максимально просто. Единственный параметр - это текст сообщения. Такая простота накладывает и определенные ограничения: мы не можем открыть и работать одновременно с несколькими лог-файлами. Но скоро я расскажу как обойти и эту маленькую проблемку. Также следующее сообщение будет выводиться с новой строки. Само название функции говорит что оно будет выполнять: Ln от Line New, что означает - новая строка. Продолжим:
WriteMsgLn("WriteMsgLn(). Warning message","warning");Сейчас мы уточнили второй параметр. Он указывает, что это сообщение следует вывести в стиле "warning". Это значит, что текст будет иметь персиковый цвет и будет немного крупнее обычного текста. Эти параметры отображения задаются в файле default.css, до которого мы вскоре доберемся. По умолчанию выставляется стиль "text", то есть два следующих вызова будут идентичны:
WriteMsgLn("WriteMsgLn(). Message"); WriteMsgLn("WriteMsgLn(). Message","text");
Продолжим тестирование различных стилей:
WriteMsgLn("WriteMsgLn(). Error message","error");
Фактически тоже самое, но в стиле "error". Текст будет красноватым и еще крупнее. Теперь рассмотрим функции для одновременного вывода сообщений и времени:
WriteMsgTimeLn("WriteMsgTimeLn(). Message with time");
Теперь кроме самого сообщения будет выводиться еще и текущее время. Оно будет размещаться в начале строки. Вы можете также уточнять стиль, в котором выводить сообщение как и раньше:
WriteMsgTimeLn("WriteMsgTimeLn(). Warning message with time","warning"); WriteMsgTimeLn("WriteMsgTimeLn(). Error message with time","error");Если вы хотите вывести пару сообщений в одну строку, то просто воспользуйтесь функциями WriteMsg() и WriteMsgTime(). Они идентичны предыдущим, но выводят все в одну строку:
WriteMsg("WriteMsg(). Text"); WriteMsgTime("WriteMsgTime(). Text with time"); WriteMsg("WriteMsg(). Warning","warning"); WriteMsgTime("WriteMsgTime(). Error","error");
После того, как все сообщения выведены следует закрыть HTML файл:
CloseHtmlFile();Теперь откомпилируйте скрипт "html-file creation" и запустите его в MetaTrader. Затем зайдите в папку с логами, у нас это ...MetaTrader\experts\files\logs\ и откройте только что созданный лог вашим браузером. Как вы можете видеть, такое представление информации является более наглядным и понятным. Проблема может появиться, если ваши вкусы не совпадают с моими. Посмотрим как можно настроить цвета и размер шрифта с помощью каскадных таблиц стилей (СSS).
Настраиваем отображение.
Как видно, все достаточно просто. Теперь, когда вы знаете как использовать библиотеку, давайте настроим отображение логов под ваш вкус. Заходим в папку ...MetaTrader/experts/files/logs/styles. Открываем единственный файл. Это настройки отображения – CSS. Рассмотрим первые строки:
#body
Название стиля, отображение которого мы хотим настроить. Как видно сначала идет знак #, а уже потом само название. В данном случае - это все тело документа. Этот стиль должен быть включен в любой CSS-файл.
{
background-color: dimgray;
}
Здесь мы устанавливаем цвет фона. Между фигурными скобками указываются параметры и их значения в такой форме:название параметра: его значение;В этом случае имеем: название параметра - background-color (цвет фона лог-файла) и значение - dimgray (серый цвет). Смотрим дальше:
#title { font-size:200%; color: greenyellow; }
Этот стиль присваивается заголовку, который размещается в начале файла. Тут мы указываем размер шрифта и его цвет. Первый параметр указывается в процентах. Дальше:
#text { font-size: 150%; color: greenyellow; } #error { font-size: 180%; color: orangered; } #warning { font-size: 120%; color: gold; }
А это три уже знакомых нам стиля, которые соответствуют обычному тексту, ошибке и предупреждению. Вы также можете установить дополнительный параметр background-color, который устанавливает цвет фона текста. Что бы создать свой стиль и использовать его, просто опишите его в этом файле и сохраните. Например так:
#order { font-size: 160%; color: Dodgerblue; }
Потом, что бы воспользоваться этим стилем, укажите его, как аргумент при выводе сообщения:
WriteMsgTimeLn("WriteMsgTimeLn(). Order message with time","order");Теперь вы умеете создавать новые стили и использовать их.
Цвета.
По ниже приведенным ссылкам вы можете найти таблицы цветов, очевидно, что моя цветовая схема понравится не всем.http://www.computerhope.com/htmcolor.htm
http://www.immigration-usa.com/html_colors.html
http://html-color-codes.com/
https://it.utexas.edu/
Чтобы
воспользоваться цветами из таблиц, которые имеют вид
шестнадцатиразрядного числа (например C34A2C), нужно перед ним
поставить знак #, например:
#body { background-color: #C34A2C; }
Создаем свои файлы стилей.
Для создания нового файла стиля, откройте файл default.css, модифицируйте его и сохраните под новым именем. При создании файла уточните последний параметр, который указывает путь к файлу стиля, который вы хотите применить, например:
CreateHtmlFile("logs\log1.html","testing library generateHTML","logs\styles\myStyle.css ");
Создание и использование одновременно нескольких лог-файлов.
Так как при работе с библиотекой мы никогда не указываем, какой
именно лог-файл использовать, чем достигается максимальная простота,
возникает вопрос: как писать сообщение в нескольких лог-файлах
одновременно? Всё достаточно просто. Функция для создания html-файлов
возвращает значение типа int. Это и есть идентификатор файла.
Также имеется глобальная переменная int htmlFileHandle, которая
указывает какой файл сейчас используется. Всё что нам нужно - это
запомнить идентификаторы всех лог-файлов, а потом при надобности
присваивать их значения переменной htmlFileHandle.
Вот пожалуй
и всё что я хотел сказать. Мы получили простое средство
для создания и эффективного отображения информации. Я надеюсь, что
это будет полезно многим трейдерам и хоть немного облегчит их работу.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/1432
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования