English Русский Español Deutsch 日本語 Português
显示新日历

显示新日历

MetaTrader 4示例 | 16 三月 2016, 15:36
2 248 1
Slobodov Gleb
Slobodov Gleb

简介

本文包含对编写简单快捷的指标的描述,该指标用于在工作区域显示来自外部网络资源的重大经济事件。指标的运算如下:
下面是指标的要求列表:
  • 指标应该独立的(没有用户的帮助下)下载当前周的必要的事件日历文件。
  • 指标应该从该文件以带新闻标题的竖行形式显示所有的事件(过去的和未来的)。
  • 指标应从外部资源追踪事件的更新状态。


技术部分

让我们使用网站 http://www.dailyfx.com/calendar/ 作为外部资源。该资源的便利性在于它允许下载带 .csv 扩展的日历,这样就避免了使用 html 文件的困难。下面是当前周的新闻链接:http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv. 现在我们来详述从网络下载文件的过程。这可以通过著名的 GetRight 程序实现。它可以从网址http://www.getright.com/get.html 或本文的附件列表下载。 下载程序后,设置 GetRight 以将文件下载到必要的目录下。它在你的交易终端文件夹的 \files\html\ 目录。为此,按 F8 并按照以下更改字段内的内容:


编写指标

在已经解决了一些问题后,我们可以开始编写指标。

extern string HtmlAdress = "http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv";
extern string GetrightAdress = "c:\progra~1\getright\getright.exe";
 
#include <Time.mqh>
#import "kernel32.dll"
int WinExec(string NameEx, int dwFlags);

只有两个外部变量:外部资源的地址(实际上,你不必更改这个参数)和 GetRight 程序的地址(如果你已经将程序下载在另一个目录,我建议更改指标内的初始值,以免每次启动指标时要更改变量的值)。要启动 GetRight.exe 文件,我们必须使用 WinExec 函数,可以从 Kernel32.dll 库导入。Time.mqh 库包含用于 GMT 的函数。

void DownloadCalendar()
{
 Print("Downloading "+HtmlAdress+" to experts\files\html\Calendar.csv");
 WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /FILE:Calendar.csv /W /O",0);
}

可见,由于使用了 GetRight 程序,从外部资源下载文件的函数看起来非常简单。/W 参数表示:除非文件下载结束,否则过程不会返回到程序。/O 参数表示:如果有同名的文件,将会被覆盖。记住:如果你已经正确更改了 GetRight 的设置,日历将下载到 \files\html\。下面是两个额外的函数:

datetime PerviousMonday(datetime d)
{
 datetime res = d - (TimeDayOfWeek(d)-1)*24*60*60;
 return(res);
}
datetime ToDate(string stDate,string stTime)  
{
 string WeekDay = StringSubstr(stDate,0,3);
 int WeekPlus = 0;
 if (WeekDay=="Mon") WeekPlus=0;
 if (WeekDay=="Tue") WeekPlus=1;
 if (WeekDay=="Wed") WeekPlus=2;
 if (WeekDay=="Thu") WeekPlus=3;
 if (WeekDay=="Fri") WeekPlus=4;
 if (WeekDay=="Sat") WeekPlus=5;
 if (WeekDay=="Sun") WeekPlus=-1;
 datetime Res = PerviousMonday(GetTimeGMT())+WeekPlus*24*60*60;
 datetime Tm = StrToTime(stTime);
 Res=Res+TimeHour(Tm )*60*60+TimeMinute(Tm )*60+TimeSeconds(Tm )
 -TimeHour(Res)*60*60-TimeMinute(Res)*60-TimeSeconds(Res);  
 if (StringFind(stTime,"PM")>=0)  
 Res+=12*60*60;
 Res=Res-GetShiftGMT();
 return (Res);
}

PerviousMonday() 函数返回当前周的起始日期。ToDate() 函数将日期和时间从日历格式转换为数据时间。

void GrabNews()  
{
 int file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,',');
 if (file==-1||FileSize(file)==0)
 return;
 int i=0;
 while (!FileIsEnding(file))
 {
 string stDate="";
 while (!FileIsEnding(file)&&stDate=="")
 stDate = FileReadString(file);
 string stTime = FileReadString(file);
 string stTimeZone = FileReadString(file);
 string stCurrency = FileReadString(file);
 string stDescription = FileReadString(file);
 string stImportance = FileReadString(file);
 string stActual = FileReadString(file);
 string stForecast = FileReadString(file);
 string stPrevious = FileReadString(file);
 datetime Date = ToDate(stDate,stTime);
 color c=Green;
 if (stImportance=="Low") c = Yellow;
 if (stImportance=="Medium") c = Orange;
 if (stImportance=="High") c = Red;
 ObjectCreate("CalendarText"+i, OBJ_TEXT, 0, Date, Close[0]);
 ObjectSet("CalendarText"+i, OBJPROP_COLOR, c);  
 ObjectSetText("CalendarText"+i, stDate + " : "+ stDescription, 8);  
 ObjectSet("CalendarText"+i, OBJPROP_ANGLE, 90);  
 ObjectCreate("CalendarLine"+i, OBJ_VLINE, 0, Date, Close[0]);
 ObjectSet("CalendarLine"+i, OBJPROP_COLOR, c);  
 ObjectSet("CalendarLine"+i, OBJPROP_STYLE, STYLE_DOT);  
 ObjectSet("CalendarLine"+i, OBJPROP_BACK, true);  
 ObjectSetText("CalendarLine"+i, stDescription, 8);  
 i++;
 }
 Max = i;
 if (file!=-1)
 FileClose(file);
}

GrabNews() 的主要程序打开下载的 \Html\Calendar. csv 文件、读取所有的事件参数并为每个新闻创建两个对象:竖行和文本。事件日历每隔 15 分钟更新一次:

int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   if (TimeCurrent()>LastTimeDownloading+15*60)
     {
       DeleteObjects();
       DownloadCalendar();
       LastTimeDownloading = TimeCurrent();
       
       int file=-1;
       while (file==-1)
         file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,',');
       FileClose(file);
 
       GrabNews();
     }
//----
   return(0);
  }


总结

本文解释了如何利用外部资源在工作区域以竖行的形式显示事件日历。指标的编写刻意忽略了多余的参数,比如根据事件相关性或者一致性和当前窗口交易品种过滤新闻的参数。

附言:我要指出日历运行中的一个错误 http://www.dailyfx.com/calendar/。请注意:来自 http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv 的 .csv 文件中的事件有时跟 http://www.dailyfx.com/calendar/ 页面不一致。这可能出现于 00:00 到 01:00 (GMT) 发布的新闻。在 .csv 文件中,这种新闻在 12 个小时以后显示。

另需注意的是,指标使用外部 dll (kernell32.dll),所以不要忘记在指标设置中启用相应的参数。

CalendarArticle.mq4 文件应该存放在 \experts\indicators 文件夹中。Time.mq4 应存放在 expers\library, Time.mqh - in experts\include。

本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/1502

附加的文件 |
getright_setup.zip (4763.33 KB)
Time.mq4 (2.03 KB)
Time.mqh (0.73 KB)
最近评论 | 前往讨论 (1)
deyan yao
deyan yao | 12 7月 2020 在 06:50
这个日历的地址不能下载了。你们是这个情况吗?
懒惰是进步的动力。半自动标记模板 懒惰是进步的动力。半自动标记模板
在几十个关于如何使用图表的示例中,有一种手动标记模板的方法。趋势线、通道、支撑/阻力位等等,都放在图表上。无疑,有一些针对这种工作的特殊程序。每人自己决定采用哪种方法。本文中,我提供了可以供你考虑的方法,即手动标记并随后将一些重复性常规操作自动化。
Taichi 指标 - 一目平衡表指标值形式化的简单理念 Taichi 指标 - 一目平衡表指标值形式化的简单理念
一目平衡表指标信号是否难以解释?本文介绍了一些将一目平衡表指标信号及其数值形式化的原则。为了将使用方法可视化,作者根据自己的偏好选择了 EURUSD 货币对。不过,该指标可以用于任何货币对
面向初学者的 MQL4 语言。自定义指标(第 2 部分) 面向初学者的 MQL4 语言。自定义指标(第 2 部分)
这是&ldquo;面向初学者的 MQL4 语言&rdquo;系列的第五篇文章。今天我们将学习使用图形对象,这是个非常强大的开发工具,可以大幅拓宽指标的应用范围。此外,它们可以用于脚本和 Expert Advisor。我们将学习创建对象,更改其参数以及检查错误。当然,我不可能详细地描述所有对象,那也太多了。但你会获得让你能够自主学习这些对象的所有必要知识。本文还包含一个逐步引导你创建复杂信号指标的示例。在这里示例中,很多参数都是可调整的,这样就能轻松更改指标的外观。
面向初学者的 MQL4 语言。自定义指标(第 1 部分) 面向初学者的 MQL4 语言。自定义指标(第 1 部分)
这是&ldquo;面向初学者的 MQL4 语言&rdquo;系列的第四篇文章。今天我们将学习编写自定义指标。我们将熟悉指标特征的分类,了解这些特征如何影响指标,学习新函数和优化方法,最后就是编写我们自己的指标。此外,本文末尾处提供了有关编程风格的建议。如果这是你阅读的第一篇&ldquo;面向初学者&rdquo;文章,那你最好抽空读读之前的几篇文章。此外,确保你已经正确理解了之前学过的材料,因为本文不介绍基础知识。