大家好!今天我想和大家分享一个关于如何从ForexFactory.com获取高冲击经济事件的实用技巧,特别是当你在开发自己的交易系统(EA)时,这个功能可以让你更好地把握市场动态。
我目前正在为原油和布伦特油开发一个交易系统,想要获取'原油库存'报告的确切发布日期和时间。这份报告通常在每周三东部时间上午10:30发布,但如果遇到假期,发布的日期可能会有所变动。因此,确保获取到最新的发布信息对我的EA来说至关重要。
步骤一:配置WebRequest
首先,在你的EA选项中添加要使用的网站以进行Web请求,这里我们使用的是ForexFactory.com(见下图)。

步骤二:定义事件结构
接下来,我们需要在代码中定义一个结构来存储事件信息。这段代码需要放在你的代码顶部,以声明'DailyEvents'为一个全局变量,并由'MaxDailyEvents'变量定义最大存储事件数量。
// 定义事件结构 struct EVENTS { string time; string title; string currency; bool displayed; }; #define MaxDailyEvents 20 // 如果你认为将会有超过20个高冲击事件,请增加这个数字。 EVENTS DailyEvents[MaxDailyEvents];
步骤三:获取HTML代码并解析
接下来,我们需要从ForexFactory.com获取HTML代码并进行解析。如果你对HTML代码不太了解,不用担心,我会一步一步带你走过来!
首先,我们需要构建Web请求的URL。由于我只想要当天的日历,而不是默认的(整个星期),我们可以通过将请求的'day'参数设置为今天的日期来实现,然后发送请求。
string url="http://www.forexfactory.com/calendar.php?day="; url += MthName(Month()) + DoubleToStr(Day(), 0) + "." + DoubleToStr(Year(), 0);
然后我们发送请求,检查错误代码(如果有的话),并将返回的字符数组转换为字符串,以便更容易解析HTML代码。
// 发送Web请求 ResetLastError(); res = WebRequest("GET", url, cookie, NULL, timeout, post, 0, result, headers); // 检查错误 if(res == -1) { Print("WebRequest出错。错误代码 = ", GetLastError()); MessageBox("在'专家顾问'选项卡中将地址'http://forexfactory.com/'添加到允许的URL列表中", "错误", MB_ICONINFORMATION); return(false); }
如果没有错误,我们就可以将字符数组'result'转换为字符串,方便后续解析。
// 将字符数组转换为字符串 HTML = CharArrayToString(result);
步骤四:解析HTML并提取事件信息
接下来,我们要确保返回的HTML确实是今天的日期,并从中截取出我们需要的内容。我们需要解析每一行的表格,提取事件时间、货币、影响程度和事件标题,直到达到最大事件数量或日历结束。
// 解析每个事件的表格行 lasttime = NULL; cntr = 0; date = DoubleToStr(Year(), 0) + "." + DoubleToStr(Month(), 0) + "." + DoubleToStr(Day(), 0) +" "; do { // 获取事件信息 time = GetHTMLElement(HTML, "<td class=\"calendar__cell calendar__time time\">", "</td>"); //... 其他解析代码省略
解析完成后,我们就能将事件信息添加到DailyEvents结构中,并在图表上显示这些事件。如果事件是未来发生的,我会在图表上显示一条竖线,而如果是过去的事件,则不显示。
步骤五:通知即将到来的高冲击事件
如果即将发生的事件在当前时间的5分钟内,我会通过弹出窗口通知用户,并删除竖线。下面是如何在EA的'start()'函数中实现这一点的示例代码:
//+------------------------------------------------------------------+ //| EA启动函数 | //+------------------------------------------------------------------+ void start() { string event = NULL; // 检查未来5分钟内是否有高冲击事件 for(int i = 0; i < MaxDailyEvents; i++) { if(StringLen(DailyEvents[i].time) == 0) break; if(TimeCurrent() >= StrToTime(DailyEvents[i].time) - 300 && TimeCurrent() < StrToTime(DailyEvents[i].time) && !DailyEvents[i].displayed) { event += DailyEvents[i].title + " (" + DailyEvents[i].currency + "), "; DailyEvents[i].displayed = true; //... 删除竖线代码省略 } } //... 弹出窗口代码省略 }
最后,我们在OnInit()函数中添加一行代码来获取当天的事件。这些步骤看似简单,但却能大大提升你的交易效率。
//+------------------------------------------------------------------+ //| EA初始化函数 | //+------------------------------------------------------------------+ int OnInit() { // 获取今天的事件 GetHighImpactEvents(); return(INIT_SUCCEEDED); }
当然,你可以根据需要修改代码,以显示所有货币对的事件,或者添加参数来指定显示的影响程度(高、中、低),并在午夜时更新事件列表。希望这些信息能对大家有所帮助!
祝交易顺利!
- Claude