使用HTML和CSS替换的记录(Log)文件
Antoniuk Oleg | 28 一月, 2016
为什么要使用它或者问题在哪里呢?
任何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/
https://it.utexas.edu/
如果表格中的颜色是使用16位表示的(例如 C34A2C), 在使用时您需要在它前面使用#符号, 例如:
#body { background-color: #C34A2C; }
创建您自己的样式文件.
要创建新的样式文件, 可以打开"default.css", 修改并使用新的名称来保存. 在创建文件时, 把最后一个参数定义指向您想使用的样式文件路径, 例如:
CreateHtmlFile("logs\log1.html","测试 generateHTML 函数库","logs\styles\myStyle.css ");
同时创建和使用多个记录文件.
在使用函数库时我们没有选择过将要使用的文件, 结果很简单. 但是问题来了: 我们应该怎样同时在多个记录文件中写消息呢?一切都很简单. 创建html文件的函数返回一个整数("int")数值. 它是文件的标识符. 我们也有一个全局变量“int htmlFileHandle”, 它表示当前使用的文件. 我们需要的就是记住所有这些记录文件的标识符, 并把它们的数值在必要的时候赋给"htmlFileHandle".
这就是我想告诉您的全部内容. 现在我们有了一个简单创建和高效显示数据的方法. 希望它会对很多交易者有用并使他们的工作更加轻松.