FXCM Forex Trading

dailyFX news indicator (closed)

Here you can post and download custom indicators. PLEASE: Do not start topics unless you are posting your own indicator, they will be moved to appropriate section even if you do.

Moderator: admin

dailyFX news indicator (closed)

Postby Nikolay.Gekht » Sun Apr 11, 2010 7:58 pm

Note: The post is closed. Please read this topic viewtopic.php?f=17&t=1972 about new version of the indicator

The indicator shows dailyfx calendar (http://www.dailyfx.com/calendar/) event headlines on the chart.

The indicator takes only those events which are related to the currencies of the currently selected instrument.

The indicator shows a number of news for the bar. The green number above the bar is a positive news, a red number below the bar is negative news. If you move a mouse cursor over the number, the toolip with headlines will be shown.

The indicator also loads and shows the news for 300 further bars.

1) Only last 90 days events are loaded.
2) I do not recommend to use the indicator on 1-day and above chart. The news loading is synchronous and can "freeze" the marketscope for up to one minute, especially in case the internet connection is not pretty good.

Update: Aug, 02 2010. The new version of the dailyfx has been released.

a) you can choose whether you want to see all currencies or only currencies which the current currency pair consists of.
b) you can choose whether you want to see all importances, or Medium + High or High only news.
c) Actual and Forecast values are also shown in the tooltip.


Download the indicator:
(10.25 KiB) Downloaded 1761 times

Code: Select all
function Init()
    indicator:name("DailyFX News");
    indicator.parameters:addBoolean("ALL", "All instruments", "Choose true to see all news and false to see the news which are related with the current currency pair only", false);
    indicator.parameters:addString("IMP", "Importance of the new to show", "", "ALL");
    indicator.parameters:addStringAlternative("IMP", "All news", "", "ALL");
    indicator.parameters:addStringAlternative("IMP", "Medium or above", "", "MED");
    indicator.parameters:addStringAlternative("IMP", "High only", "", "HIGH");
    indicator.parameters:addInteger("S", "Font size in points", "", 8, 6, 20);
    indicator.parameters:addColor("clrN", "Negative news color", "", core.rgb(255, 0, 0));
    indicator.parameters:addColor("clrP", "Positive/Neutral news color", "", core.rgb(0, 255, 0));

local source;
local newsN;
local newsP;
local http;
local barSize;
local offset;
local extent;
local instr;
local barSizeInDays;
local ALL;
local IMP;

function Prepare()
    source = instance.source;
    barSize = source:barSize();
    instr = source:instrument();
    offset = core.host:execute("getTradingDayOffset");
    ALL = instance.parameters.ALL;
    IMP = instance.parameters.IMP;

    -- calculate the size of the candle
    local s, e;
    s, e = core.getcandle(source:barSize(), core.now(), offset);
    s = e - s;  -- length of candle in days
    if s > 1 then
        assert(false, "1-day is the largest chart which can be used to get news");
    barSizeInDays = s;
    -- number of candles to extent for 1 week.
    -- if source:isAlive() then
    if true then
        extent = math.floor(7 / s);
        if extent > 300 then
            extent = 300;
        extent = 0;
    local name = profile:id();
    newsN = instance:createTextOutput("N", "N", "Arial", instance.parameters.S, core.H_Center, core.V_Bottom, instance.parameters.clrN, extent);
    newsP = instance:createTextOutput("P", "P", "Arial", instance.parameters.S, core.H_Center, core.V_Top, instance.parameters.clrP, extent);
    http = core.makeHttpLoader();

local gWeekData = {};

function getweek(date)
    -- gets a week for the specified date
    local t = core.dateToTable(date);
    date = math.floor(date) - (t.wday - 1);
    t = core.dateToTable(date);
    return string.format("%02i-%02i-%04i", t.month, t.day, t.year), t.year;

--              date    time    TZ      curr    desc    imp     act     fore    prev
local pline = "([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)%c()";
local pdate = "%a%a%a%s(%a%a%a)%s(%d%d?)";
local ptime = "(%d%d?):(%d%d)";

function parseCSV(response, year)
    local pos, date, time, tz, curr, desc, imp, act, fore, prev;
    local month, day, hour, minute, timemod
    local weekData = {};
    local idx = 1;
    pos = 1;
    while true do
        date, time, tz, curr, desc, imp, act, fore, prev, pos = string.match(response, pline, pos);
        if (date == nil) then

        if IMP == "ALL" or
           (IMP == "MED" and imp == "Medium" or imp == "High") or
           (IMP == "HIGH" and imp == "High") then

            -- process only those news, which are related with the currencies of
            -- the current instrument
            if (string.find(instr, string.upper(curr), 1, true) ~= nil) or ALL then
                month, day = string.match(date, pdate);
                hour, minute = string.match(time, ptime);
                if month ~= nil and hour ~= nil then
                    local ttime = {};
                    local skip = false;
                    if month == "Jan" then
                        ttime.month = 1;
                    elseif month == "Feb" then
                        ttime.month = 2;
                    elseif month == "Feb" then
                        ttime.month = 2;
                    elseif month == "Mar" then
                        ttime.month = 3;
                    elseif month == "Apr" then
                        ttime.month = 4;
                    elseif month == "May" then
                        ttime.month = 5;
                    elseif month == "Jun" then
                        ttime.month = 6;
                    elseif month == "Jul" then
                        ttime.month = 7;
                    elseif month == "Aug" then
                        ttime.month = 8;
                    elseif month == "Sep" then
                        ttime.month = 9;
                    elseif month == "Oct" then
                        ttime.month = 10;
                    elseif month == "Nov" then
                        ttime.month = 11;
                    elseif month == "Dec" then
                        ttime.month = 12;
                        skip = true;

                    if not(skip) then
                        ttime.day = tonumber(day);
                        ttime.hour = tonumber(hour);
                        ttime.min = tonumber(minute);
                        ttime.sec = 0;
                    ttime.year = year;

                    local news = {};
                    news.instrument = curr;
                    news.orgtime = date .. " " .. time;
                    news.gmt_time = core.tableToDate(ttime);
                    news.est_time = core.host:execute("convertTime", 2, 1, news.gmt_time);
                    ttime = core.dateToTable(core.host:execute("convertTime", 2, 4, news.gmt_time));
                    news.sdate = string.format("%02i/%02i %02i:%02i", ttime.month, ttime.day, ttime.hour, ttime.min);
                    -- get new's candle
                    local s, e;
                    s, e = core.getcandle(barSize, news.est_time, offset);
                    local n, e1;
                    news.orgcandles = s;
                    news.orgcandlee = e;
                    -- check whether candle is a nontraing candle
                    n, e1 = core.isnontrading(s, offset);
                    if n then
                        -- put the news to the first after-nontrading candle (2 day after the begin of the
                        -- non-trading period)
                        s, e = core.getcandle(barSize, e1 + 2, offset);
                    news.candles = s;
                    news.candlee = e;
                    news.subject = desc;
                    local posneg = "";
                    if act ~= "" then
                        posneg = act;
                    elseif fore ~= "" then
                        posneg = fore;
                    news.neg = (string.find(posneg, "-", 1, true) ~= nil);
                    news.act = act;
                    news.fore = fore;
                    news.imp = imp;
                    weekData[idx] = news;
                    idx = idx + 1;
    weekData.last = idx - 1;
    return weekData;

function loadweek(week, year)
    local url;

    --url = "/calendar/cal.csv?week=" .. week .. "&sort=dateDesc&timezone=GMT&currency=|&importance=|";
    url = "/files/Calendar-" .. week .. ".csv";
    http:load("www.dailyfx.com", 80, url, false);
    if http:successful() then
        return parseCSV(http:response(), year);
    return nil;

function ProcessCandle(period, date)
    local week, weekData, year;
    week, year = getweek(date);
    if gWeekData[week] == nil then
        weekData = loadweek(week, year);
        gWeekData[week] = weekData;
        weekData = gWeekData[week];

    if weekData ~= nil then
        local msgp = "";
        local cntp = 0;
        local msgn = "";
        local cntn = 0;
        for i = 1, weekData.last, 1 do
            local data = weekData[i];
            if (data.candles <= date and
                data.candlee > date) or
               (data.orgcandles <= date and
                data.orgcandlee > date)  then
                if data.neg then
                    if cntn > 0 then
                        msgn = msgn .. "\013\010";
                    msgn = msgn .. data.sdate .. " " .. data.subject .. "(" .. data.imp .. ")";
                    if data.act ~= "" then
                        msgn = msgn .. " Act=" .. data.act;
                    if data.fore ~= "" then
                        msgn = msgn .. " For=" .. data.fore;
                    cntn = cntn + 1;
                    if cntp > 0 then
                        msgp = msgp .. "\013\010";
                    msgp = msgp .. data.sdate .. " " .. data.subject .. "(" .. data.imp .. ")";
                    if data.act ~= "" then
                        msgp = msgp .. " Act=" .. data.act;
                    if data.fore ~= "" then
                        msgp = msgp .. " For=" .. data.fore;
                    cntp = cntp + 1;
        local pperiod;
        if period >= source:size() then
            pperiod = source:size() - 1;
            pperiod = period;
        if (cntn > 0) then
            newsN:set(period, source.low[pperiod], "(" .. cntn .. ")", msgn);
        if (cntp > 0) then
            newsP:set(period, source.high[pperiod], "(" .. cntp .. ")", msgp);

function Update(period, mode)
    if source:hasData(period) then
        local date;
        date = source:date(period);
        -- the last 30
        if (core:now() - date) > 30 then
            return ;
        ProcessCandle(period, date);

    if extent > 0 and period == source:size() - 1 then
        local i, ccandle;

        ccandle = source:date(period);
        for i = 1, extent - 1, 1 do
            ccandle = ccandle + barSizeInDays;
            ProcessCandle(period + i, ccandle);
FXCodeBase: Base Builder
Posts: 1222
Joined: Wed Dec 16, 2009 6:39 pm
Location: Cary, NC

Re: dailyFX news indicator

Postby patick » Tue Apr 13, 2010 8:52 pm

Excellent work... as usual. You have been busy lately with all these updates; just wanted to pop in and say, thank very-very much!

I wish there was tip/donate button on this website so we could actually get a little extra $ in your hands.
Posts: 36
Joined: Tue Mar 30, 2010 2:11 pm

Re: dailyFX news indicator

Postby Nikolay.Gekht » Fri Apr 16, 2010 10:06 pm

I wish there was tip/donate button on this website so we could actually get a little extra $ in your hands.

Thank you very much for your generous proposal. Our team is really happy to make trader's life easier. Hopefully, money earned on the development and support of the Trading Station, Marketscope applications, the reporting system and Order2Go API (yeah, we are those "bastards" who developed all these client-related things) is enough to support this site. The expression of your satisfaction with these products (and, probably, not only at this site) is the most valuable result of our work. :-) So, if you like it - just do not hesitate to tell about it. It will be the best support of our work.
FXCodeBase: Base Builder
Posts: 1222
Joined: Wed Dec 16, 2009 6:39 pm
Location: Cary, NC

Re: dailyFX news indicator

Postby Laurus12 » Mon Apr 19, 2010 6:05 pm

Fantastic! I just want to say that I totally agree with Patick Nikolay. You should know that we do not take this for granted. I now have indicators for Marketscope that I for not too long ago could only dream about. By the way, thank you for the Value Charts indicator. I did not know about it at all until you posted it. I have noticed that besides of the basics the Value Charts indicator has some not immediately obvious properties that is very interesting and worth looking into I think.

Thank you very much :)
FXCodeBase: Confirmed User
Posts: 45
Joined: Tue Jan 26, 2010 6:49 pm
Location: Norway

Re: dailyFX news indicator

Postby costock » Wed Apr 21, 2010 1:39 pm

Hi Guys

I'm a relatively new trader and have only just found this board and custom indicator factility. I have installed the News Indicator, a simple but really useful tool. Install was simple but I notice that it local time does not seem to work or perhaps I'm missing something.

I'm in the UK on GMT +1. The news is not aligned to the correct candle and is 5 hours out e.g. 08:30 (GMT) news release aligns with the 13:30 candle.

Any ideas?

Posts: 3
Joined: Wed Apr 21, 2010 1:19 pm

Re: dailyFX news indicator

Postby Nikolay.Gekht » Wed Apr 21, 2010 4:32 pm

Thank for the report. It looks like the timezone-based request on dailyFX site is broken. :-( It returns the time in GMT even if the EST requested. I apologize for the inconvenience. Hopefully, now the Marketscope can convert data b/w timezone, so, I'll change the data requesting to GMT and will use the Marketscope's function to convert into EST (to find the proper candle) and to displayed data (to show the labels more convenient).

.... and already updated. :-)
FXCodeBase: Base Builder
Posts: 1222
Joined: Wed Dec 16, 2009 6:39 pm
Location: Cary, NC

Re: dailyFX news indicator [updated Apr, 21]

Postby faheem334 » Thu Apr 22, 2010 1:24 am

excellant work dear, i will also try this in order to earn money, please tell me that in how much time you reached this stage ?
Posts: 1
Joined: Thu Apr 22, 2010 1:20 am

Re: dailyFX news indicator [updated Apr, 21]

Postby barbs666 » Thu Apr 29, 2010 12:32 am

Thanks very much for your work, look forward to testing! :-)
Posts: 25
Joined: Thu Mar 04, 2010 5:24 am

Re: dailyFX news indicator [updated Apr, 21]

Postby thetruth » Wed Jun 30, 2010 1:58 pm

exelent work!!!
can you put some diferent color or something for low, medium and high importance,
Posts: 43
Joined: Thu Feb 25, 2010 3:39 pm

Re: dailyFX news indicator [updated Apr, 21]

Postby Nikolay.Gekht » Wed Jun 30, 2010 3:52 pm

This in our plans...

I apologize that preparing the new release takes so much my time, so I'm just not able to care about fxcodebase as before. I hope that I'll finish and will be completely back in a couple of week.
FXCodeBase: Base Builder
Posts: 1222
Joined: Wed Dec 16, 2009 6:39 pm
Location: Cary, NC


Return to Custom Indicators

Who is online

Users browsing this forum: Bing [Bot], fjasonfx, Google [Bot], oxbx99 and 5 guests