English 中文 Español Deutsch 日本語 Português
Альтернативный лог-файл c использованием HTML и CSS

Альтернативный лог-файл c использованием HTML и CSS

MetaTrader 4Примеры | 24 октября 2006, 16:42
3 714 2
Antoniuk Oleg
Antoniuk Oleg

Зачем это мне нужно или в чем проблема?


Любой эксперт оснащен средствами для вывода информации о его функционировании, текущем состоянии, непредвиденных ситуациях и прочих событиях. Используя данные, которые генерирует подобным образом эксперт, можно проследить за всей хронологией событий, которые он зарегистрировал, даже не запуская 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

Прикрепленные файлы |
generateHTML.mq4 (3.2 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (2)
[Удален] | 24 окт. 2006 в 18:00
Мда.... Опять во мне забродил xml, такие мощные отчеты можно генерить!. ... Надеюсь когда-нибудь сделаю :)
Иван
Иван | 24 окт. 2006 в 19:42
Идея с красивым выводом логов безусловно замечательная! Хотя лично для себя не знаю что мне будет проще - просто просмотреть появление повторяющейся ошибки в стандартного вида логах для понимания ошибки в алгоритме, или же доработка текста эксперта для вывода красивых логов и последующего анализа красивого файла. Думаю, что мне вполне хватает пока что первого варианта. Но новичкам вполне может пригодиться!
Как не попасть в ловушки оптимизации? Как не попасть в ловушки оптимизации?
В статье описываются методы, позволяющие лучше понимать результаты оптимизации тестера. Также приведено несколько советов, помогающих избежать "вредной оптимизации".
Секреты клиентского терминала MetaTrader 4: Библиотека файлов в MetaEditor Секреты клиентского терминала MetaTrader 4: Библиотека файлов в MetaEditor
При создании собственных программ важное значение имеет редактор кода. Чем больше функций предлагает редактор, тем удобнее и быстрее создаётся программа. Многие программы создаются на основе уже существующего кода. Вы используете индикатор или скрипт, но Вас не всё в нём устраивает? Скачайте код этой программы с нашего сайта и переделайте его под себя.
Передача торговых сигналов в универсальном советнике. Передача торговых сигналов в универсальном советнике.
В статье описываются различные способы передачи торговых сигналов из сигнального модуля универсального советника в модуль управления позициями и ордерами. Рассматриваются последовательный и параллельный интерфейсы.
Визуализация тестирования. Ручная торговля. Визуализация тестирования. Ручная торговля.
Тестирование "ручных" стратегий на истории. Проверьте свой алгоритм торговли, не вникая в тонкости программирования!