下载MetaTrader 5

使用HTML和CSS替换的记录(Log)文件

28 一月 2016, 10:38
Antoniuk Oleg
0
289


为什么要使用它或者问题在哪里呢?

任何EA交易都提供允许输出数据的功能, 这些数据是关于其功能, 当前状态, 未能预料的情况以及其他事件的. 使用EA交易生成的数据, 您甚至不需启动MetaTrader就可以跟踪侦测到全部事件的时序信息. 我们可以轻松找到所需的日期时间来寻找信息. 但是问题是EA交易可能产生大量的信息, 甚至EA交易的开发者也无法很容易地整理它们, 就更不必说不会创建EA交易的用户了. 如果我们打开一个典型的记录文件, 我们会看到成百上千行的同类信息.



现在让我们想象一下, 如果记录文件以下面的方法组织会有多么方便: 错误和未能预料的情形将使用红色和大字体标识出来, 警告使用小些的字体并用桃红色标出, 服务的信息使用亮绿色, 而所有的交易事务是蓝色的, 等等. 换句话说, 当您看着这种记录文件的时候, 您能够很容易了解发生了什么以及EA交易想告诉您什么, 您不必去通读它而是可以直接进入细节. 您一目十行, 在字里行间看不到任何红色或者桃红色 - 就说明没有错误和警告, 一切正常. 您只要几秒钟就可以直接看到蓝色的信息, 确认订单已经设置正确. 这只是梦想吗?绝非如此 - 我们将写一个函数库来实现这发明.



因而, 在本文中我们将讲述编写一个简单而功能强大的制作html文件的实例, 在过程中我们会学习调整它们的显示, 以及如何在您的EA交易和脚本程序中轻松实现和使用它们.

会使用什么呢?

我们将使用超文本标记语言(HTML)来创建文件而使用层叠式样表(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 函数库: 创建html文件时出错.");
   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. 我想说一下, 此函数库简单地使用FileOpen(), FIleClose和FileWrite()函数来创建文本文件, 并使用HTML代码填写. 这里不需要解释每个标记, 只需要相信我的话.


准备工作

为了能够正常工作, 我们应该配置此函数库. 访问 “...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()));

这个函数在"logs"文件夹下创建了一个名为"log1.html"的html文件. 第二个参数是文件头部, 它将出现在文件的开头部分. 我们会晚些时候讨论最后一个参数, 本阶段忽略它, 因为使用了默认值.

现在一切准备就绪, 可以输出消息了. 开始吧:

WriteMsgLn("WriteMsgLn(). 测试信息");

此函数显示一条简单的文本信息. 您可以看到, 一切都很简单. 唯一的参数是消息文本. 简单性就会造成一些局限: 我们不能同时打开和使用多个文件. 很快我将告诉您如何解决这个小问题. 下一条信息会在新的一行显示. 函数名就告诉我们它的作用: Ln的意思是新的一行(Line New). 进一步:

WriteMsgLn("WriteMsgLn(). 警告消息","warning");

我们刚刚定义了第二个参数. 它说到这条消息应该以"警告"的方式显示. 意思是它的文字将是桃红色并且字体比普通字体略大一些. 这些显示参数在"default.css"文件中设置, 我们晚点再讲它. 我们按默认值设置"text"风格, 下面两个调用是一样的:

WriteMsgLn("WriteMsgLn(). 消息");
WriteMsgLn("WriteMsgLn(). 消息","text");

我们再测试不同的风格:

WriteMsgLn("WriteMsgLn(). 错误消息","error");

实际上是一样的, 只是"错误"风格. 文字将是红色的, 字体比之前的大一些. 现在, 让我们讲一下同时显示消息和时间的函数:

WriteMsgTimeLn("WriteMsgTimeLn(). 带有时间的消息");

除了消息之外, 当前时间也会显示. 它将被放置在一行的开头部分. 您也可以定义消息的风格, 和之前的方法一样:

WriteMsgTimeLn("WriteMsgTimeLn(). 带有时间的警告消息","warning");
WriteMsgTimeLn("WriteMsgTimeLn(). 带有时间的错误消息","error");

如果您想要在一行内显示多条消息, 使用WriteMsg()和WriteMsgTime()函数. 它们和之前的函数一样, 只是在一行之内显示消息:

WriteMsg("WriteMsg(). 文本");
WriteMsgTime("WriteMsgTime(). 带有时间的文本");
WriteMsg("WriteMsg(). 警告","warning");
WriteMsgTime("WriteMsgTime(). 错误","error");

在全部消息都显示完毕后, 关闭HTML文件:

CloseHtmlFile();

现在编译"html-file creation"脚本程序并在MetaTrader中运行. 访问logs文件夹, ...MetaTrader\experts\files\logs\ 并使用浏览器打开新的记录. 您可以看到, 使用这种方法显示数据更加灵活而且易懂. 如果您的喜好和我不同会有些问题. 让我们看看如何使用层叠式样表(CSS)来调整颜色和字体.


调整视图.

您可以看到一切都很简单. 在你学习如何使用函数库后, 让我们按照您的喜好调整记录的显式. 访问 “...MetaTrader/experts/files/logs/styles” 文件夹. 打开那里的唯一文件. 它包含了显式的设置 - CSS. 看看第一行:

#body

这是我们需要调整显示的样式的名称. 首先是 # 符号, 然后后面是名字. 此例中是文档的主体(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");

现在您可以创建新样式并使用它们了.


颜色.

使用以下的链接, 您可以找到颜色表. 我相信不是每个人都喜欢我的颜色设置.

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

如果表格中的颜色是使用16位表示的(例如 C34A2C), 在使用时您需要在它前面使用#符号, 例如:

#body
{
   background-color: #C34A2C;
}

创建您自己的样式文件.

要创建新的样式文件, 可以打开"default.css", 修改并使用新的名称来保存. 在创建文件时, 把最后一个参数定义指向您想使用的样式文件路径, 例如:

CreateHtmlFile("logs\log1.html","测试 generateHTML 函数库","logs\styles\myStyle.css ");

同时创建和使用多个记录文件.

在使用函数库时我们没有选择过将要使用的文件, 结果很简单. 但是问题来了: 我们应该怎样同时在多个记录文件中写消息呢?一切都很简单. 创建html文件的函数返回一个整数("int")数值. 它是文件的标识符. 我们也有一个全局变量“int htmlFileHandle”, 它表示当前使用的文件. 我们需要的就是记住所有这些记录文件的标识符, 并把它们的数值在必要的时候赋给"htmlFileHandle".

这就是我想告诉您的全部内容. 现在我们有了一个简单创建和高效显示数据的方法. 希望它会对很多交易者有用并使他们的工作更加轻松.


由MetaQuotes Software Corp.从英文翻译成
原始文章: https://www.mql5.com/en/articles/1432

附加的文件 |
generateHTML.mq4 (3.2 KB)
测试可视化: 人工交易 测试可视化: 人工交易

在历史中测试人工交易策略. 看您的交易算法怎样从简单摆设变成编程之精华!

分形线的构造 分形线的构造

本文讲述了使用趋势线和分形来构造各种类型的分形线.

在Linux桌面系统运行MetaTrader 4客户终端 在Linux桌面系统运行MetaTrader 4客户终端

本文讲述了使用非模拟器wine软件在Linux桌面系统上运行MetaTrader 4客户终端的详细设置步骤.

如何不陷入优化陷阱? 如何不陷入优化陷阱?

本文讲述了怎样更好地理解测试器优化结果的方法. 它也给出了一些避免"有害优化"的技巧.