Page 1 of 12

Posted: Wed Apr 21, 2010 4:37 am

Advanced, Fractal indicator allows you to change, length of time frame that is checked. The algorithm allows only odd numbers.

Changes in trend are registered as follows.

Up Trend.
The closing price is higher than the Up fractal.
Down Trend
The closing price is lower than the Down fractal.

Strategy based on Advanced Fractal Trend Overlay can be found here.
viewtopic.php?f=31&t=8283&p=18329#p18329

MT4/MQ4 version.
viewtopic.php?f=38&t=17244

Advanced fractal Labeling Tool will show you all the fractals, from 1 onwards,
and their weight.

1
3 Candles fractal
2
5 Candles fractal
3
7 Candles fractal
and so on.

AFBSR.lua

After first cross, support becomes resistance and vice versa.
After second cross line is not valid any more.

Posted: Wed Apr 21, 2010 2:52 pm
what exactly does the number of fractals (odd) mean? Thanks a lot!

Posted: Wed Apr 21, 2010 3:23 pm
is the length of time minutes or how does that work?

Posted: Wed Apr 21, 2010 4:18 pm
The fractal is usually found in terms of bars, not minutes.

The standard up fractal is the bar which has high higher than 2 previous and 2 next bars.
The standard down fractal is the bar which has low lower than 2 previous and 2 next bars.

It does not matter how long the bar is - a minute, an hour or a day.

So, as you can see the length of the "pattern" is 5 bars. Two bars before, two bars after and the tested bar itself.

Unlike the standard fractal indicator, the indicator above is able to check more than 2 bars before and after the testing bar. So, length of the pattern can be 5 (two before/two after/one tested), 7 (three before/three after/one tested), 9 (four before/four after/one tested) and so on...

So, because we have one bar to test and the same number of bars to test after and before, the length of the pattern will always an odd value (3, 5, 7, 9, 11 and so on), unlike even values (2, 4, 6, 8 and so on).

Posted: Thu Aug 12, 2010 4:24 pm
can you put a other time frame option??
example, if you are in a 5 min time frame, calculate the fractal in 15 min? and put this in
same graph?
thanks!! and good work!!

Posted: Sun Sep 05, 2010 10:40 pm
Other timeframe version of advanced fractal.

Code: Select all
`function Init()    indicator:name("Bigger timeframe advanced fractal");    indicator:description("");    indicator:requiredSource(core.Bar);    indicator:type(core.Indicator);    indicator.parameters:addGroup("Calculation");    indicator.parameters:addString("BS", "Time frame to calculate advanced fractal", "", "D1");    indicator.parameters:setFlag("BS", core.FLAG_PERIODS);    indicator.parameters:addInteger("Frame", "Number of fractals (Odd)", "Number of fractals (Odd)", 5, 5,99);    indicator.parameters:addGroup("Style");    indicator.parameters:addColor("UP", "Up fractal color", "Up fractal color", core.rgb(0,255,0));    indicator.parameters:addColor("DOWN", "Down fractal color", "Down fractal color", core.rgb(255,0,0));endlocal source;                   -- the sourcelocal bf_data = nil;          -- the high/low datalocal Frame;local BS;local bf_length;                 -- length of the bigger frame in secondslocal dates;                    -- candle dateslocal host;local day_offset;local week_offset;local extent;local up;local down;local Indout;local Shift;local TF_Coeff;function Prepare()    source = instance.source;    host = core.host;    day_offset = host:execute("getTradingDayOffset");    week_offset = host:execute("getTradingWeekOffset");    BS = instance.parameters.BS;    Frame = instance.parameters.Frame;    extent = 20;    local s, e, s1, e1;    s, e = core.getcandle(source:barSize(), core.now(), 0, 0);    s1, e1 = core.getcandle(BS, core.now(), 0, 0);    assert ((e - s) <= (e1 - s1), "The chosen time frame must be bigger than the chart time frame!");    bf_length = math.floor((e1 - s1) * 86400 + 0.5);    local name = profile:id() .. "(" .. source:name() .. "," .. BS .. "," .. Frame .. ")";    instance:name(name);    up = instance:createTextOutput ("Up", "Up", "Wingdings", 10, core.H_Center, core.V_Top, instance.parameters.UP, 0);    down = instance:createTextOutput ("Dn", "Dn", "Wingdings", 10, core.H_Center, core.V_Bottom, instance.parameters.DOWN, 0);    Indout = instance:addStream("out", core.Line, name .. ".Ind", "Ind", core.rgb(0,255,0), 0);    Shift=(Frame-1)/2;    TF_Coeff=(e1-s1)/(e-s);endlocal loading = false;local loadingFrom, loadingTo;local pday = nil;-- the function which is called to calculate the periodfunction Update(period, mode)    -- get date and time of the hi/lo candle in the reference data    local bf_candle;    bf_candle = core.getcandle(BS, source:date(period-Shift), day_offset, week_offset);    -- if data for the specific candle are still loading    -- then do nothing    if loading and bf_candle >= loadingFrom and (loadingTo == 0 or bf_candle <= loadingTo) then        return ;    end    -- if the period is before the source start    -- the do nothing    if period-Shift*(TF_Coeff+1) < source:first() then        return ;    end        -- if data is not loaded yet at all    -- load the data    if bf_data == nil then        -- there is no data at all, load initial data        local to, t;        local from;        if (source:isAlive()) then            -- if the source is subscribed for updates            -- then subscribe the current collection as well            to = 0;        else            -- else load up to the last currently available date            t, to = core.getcandle(BS, source:date(period-Shift), day_offset, week_offset);        end        from = core.getcandle(BS, source:date(source:first()), day_offset, week_offset);        Indout:setBookmark(1, period);        -- shift so the bigger frame data is able to provide us with the stoch data at the first period        from = math.floor(from * 86400 - (bf_length * extent) + 0.5) / 86400;        local nontrading, nontradingend;        nontrading, nontradingend = core.isnontrading(from, day_offset);        if nontrading then            -- if it is non-trading, shift for two days to skip the non-trading periods            from = math.floor((from - 2) * 86400 - (bf_length * extent) + 0.5) / 86400;        end        loading = true;        loadingFrom = from;        loadingTo = to;        bf_data = host:execute("getHistory", 1, source:instrument(), BS, loadingFrom, to, source:isBid());        return ;    end    -- check whether the requested candle is before    -- the reference collection start    if (bf_candle < bf_data:date(0)) then        Indout:setBookmark(1, period);        if loading then            return ;        end        -- shift so the bigger frame data is able to provide us with the stoch data at the first period        from = math.floor(bf_candle * 86400 - (bf_length * extent) + 0.5) / 86400;        local nontrading, nontradingend;        nontrading, nontradingend = core.isnontrading(from, day_offset);        if nontrading then            -- if it is non-trading, shift for two days to skip the non-trading periods            from = math.floor((from - 2) * 86400 - (bf_length * extent) + 0.5) / 86400;        end        loading = true;        loadingFrom = from;        loadingTo = bf_data:date(0);        host:execute("extendHistory", 1, bf_data, loadingFrom, loadingTo);        return ;    end    -- check whether the requested candle is after    -- the reference collection end    if (not(source:isAlive()) and bf_candle > bf_data:date(bf_data:size() - 1)) then        Indout:setBookmark(1, period);        if loading then            return ;        end        loading = true;        loadingFrom = bf_data:date(bf_data:size() - 1);        loadingTo = bf_candle;        host:execute("extendHistory", 1, bf_data, loadingFrom, loadingTo);        return ;    end    local p;    p = findDateFast(bf_data, bf_candle, true);    if p == -1 then        return ;    end    if p>bf_data:size()-1 then     return ;    end        local Fl=true;    for i=1,(Frame-1)/2,1 do     if bf_data.high[p-Shift]<bf_data.high[p-i-Shift] or bf_data.high[p-Shift]<bf_data.high[p+i-Shift] then      Fl=false;     end    end    if Fl==true then     up:set(period-Shift*(TF_Coeff+1), bf_data.high[p-Shift], "\226");--     up:set(period, bf_data.high[p-Shift], "\226");    end    Fl=true;    for i=1,(Frame-1)/2,1 do     if bf_data.low[p-Shift]>bf_data.low[p-i-Shift] or bf_data.low[p-Shift]>bf_data.low[p+i-Shift] then      Fl=false;     end    end    if Fl==true then     down:set(period-Shift*(TF_Coeff+1), bf_data.low[p-Shift], "\225");--     down:set(period, bf_data.low[p-Shift], "\225");    end    end-- the function is called when the async operation is finishedfunction AsyncOperationFinished(cookie)    local period;    pday = nil;    period = Indout:getBookmark(1);    if (period < 0) then        period = 0;    end    loading = false;    instance:updateFrom(period);endfunction findDateFast(stream, date, precise)    local datesec = nil;    local periodsec = nil;    local min, max, mid;    datesec = math.floor(date * 86400 + 0.5)    min = 0;    max = stream:size() - 1;    while true do        mid = math.floor((min + max) / 2);        periodsec = math.floor(stream:date(mid) * 86400 + 0.5);        if datesec == periodsec then            return mid;        elseif datesec > periodsec then            min = mid + 1;        else            max = mid - 1;        end        if min > max then            if precise then                return -1;            else                return min - 1;            end        end    endend`

Posted: Sat Oct 30, 2010 10:41 am
Hi,
Thank you for this excellent indicator Alexander.

Can you, please, help me with the following problems:
1) I have just installed the new Marketscope patch (the one posted here) and (as a result?) BF_Advanced_Fractal stopped working. I leave the the default settings, it does start loading but after a short while an "error" message appears in a bracket, on its label (see the pic in the attachment)

2) Why do the arrows representing fractals point in the directions opposite to the directions of the fractals they represent? That is to say, why is a fractal up represented by a down arrow, and a down fractal by an up arrow? Don't you think it's rather misleading?

I'll be much obliged for you help on those issues.
Cheers

Posted: Sun Oct 31, 2010 6:39 am
It is probably a bug in the indicators,
which platform previously have not detected.

Posted: Sun Oct 31, 2010 11:45 am
I cann't to repeat error.
Try to load indicator once again.