系统交易 게시글

如何从ForexFactory.com获取高冲击经济事件并在MetaTrader 4中显示

첨부파일
15505.zip (2.86 KB, 다운로드 0회)

大家好!今天我想和大家分享一个关于如何从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

연관 포스트

댓글 (0)