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

Автор: lexy Среда, Сентябрь 10th, 2014 Нет комментариев

Рубрика: Разное

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

Чтобы воспользоваться цветами из таблиц, которые имеют вид шестнадцатиразрядного числа (например C34A2C), нужно перед ним поставить знак #, например:

#body
{
   background-color: #C34A2C;
}

Создаем свои файлы стилей.

Для создания нового файла стиля, откройте файл default.css, модифицируйте его и сохраните под новым именем. При создании файла уточните последний параметр, который указывает путь к файлу стиля, который вы хотите применить, например:

CreateHtmlFile("logs\log1.html","testing library generateHTML","logs\styles\myStyle.css ");

Создание и использование одновременно нескольких лог-файлов.

Так как при работе с библиотекой мы никогда не указываем, какой именно лог-файл использовать, чем достигается максимальная простота, возникает вопрос: как писать сообщение в нескольких лог-файлах одновременно? Всё достаточно просто. Функция для создания html-файлов возвращает значение типа int. Это и есть идентификатор файла. Также имеется глобальная переменная int htmlFileHandle, которая указывает какой файл сейчас используется. Всё что нам нужно — это запомнить идентификаторы всех лог-файлов, а потом при надобности присваивать их значения переменной htmlFileHandle.

Вот пожалуй и всё что я хотел сказать. Мы получили простое средство для создания и эффективного отображения информации. Я надеюсь, что это будет полезно многим трейдерам и хоть немного облегчит их работу.

Прикрепленные файлы:
 generateHTML.mq4 (3.2 Kb)
 html-file creation.mq4 (1.6 Kb)
Источник: mql4.com

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты