Belkhayate's Center Of Gravity

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

Belkhayate's Center Of Gravity

Postby Nikolay.Gekht » Mon Apr 19, 2010 8:26 pm

The indicator can be used to detect the direction of the trade. Looks, for example the following trade system for details.

BELCOG.png


Download the indicator:
BELCOG.lua
(6.28 KiB) Downloaded 7481 times


See also the bigger time frame version

Code: Select all
-- Indicator profile initialization routine
-- Defines indicator profile properties and indicator parameters
function Init()
    indicator:name("Belkhayate's Center Of Gravity");
    indicator:description("");
    indicator:requiredSource(core.Bar);
    indicator:type(core.Indicator);

    indicator.parameters:addInteger("N", "Number of bars", "", 180);
    indicator.parameters:addInteger("O", "Order", "", 3);
    indicator.parameters:addDouble("E", "Eccart value", "", 1.61803399);
    indicator.parameters:addColor("L1_color", "Color of L1", "Color of L1", core.rgb(0, 0, 255));
    indicator.parameters:addColor("L2_color", "Color of L2", "Color of L2", core.rgb(127, 127, 127));
    indicator.parameters:addColor("L3_color", "Color of L3", "Color of L3", core.rgb(255, 0, 0));
    indicator.parameters:addColor("L4_color", "Color of L4", "Color of L4", core.rgb(255, 0, 0));
    indicator.parameters:addColor("L5_color", "Color of L5", "Color of L5", core.rgb(127, 127, 127));
    indicator.parameters:addColor("L6_color", "Color of L6", "Color of L6", core.rgb(0, 192, 0));
    indicator.parameters:addColor("L7_color", "Color of L7", "Color of L7", core.rgb(0, 192, 0));
end

-- Indicator instance initialization routine
-- Processes indicator parameters and creates output streams
-- Parameters block
local N;
local O;
local E;

local first;
local source = nil;

-- Streams block
local L1 = nil;
local L2 = nil;
local L3 = nil;
local L4 = nil;
local L5 = nil;
local L6 = nil;
local L7 = nil;

-- Routine
function Prepare()
    N = instance.parameters.N;
    O = instance.parameters.O;
    E = instance.parameters.E;

    source = instance.source;

    first = source:first();

    local name = profile:id() .. "(" .. source:name() .. ", " .. N .. ", " .. O .. ", " .. E .. ")";
    instance:name(name);
    L1 = instance:addStream("L1", core.Line, name .. ".L1", "L1", instance.parameters.L1_color, first);
    L2 = instance:addStream("L2", core.Line, name .. ".L2", "L2", instance.parameters.L2_color, first);
    L3 = instance:addStream("L3", core.Line, name .. ".L3", "L3", instance.parameters.L3_color, first);
    L4 = instance:addStream("L4", core.Line, name .. ".L4", "L4", instance.parameters.L4_color, first);
    L5 = instance:addStream("L5", core.Line, name .. ".L5", "L5", instance.parameters.L5_color, first);
    L6 = instance:addStream("L6", core.Line, name .. ".L6", "L6", instance.parameters.L6_color, first);
    L7 = instance:addStream("L7", core.Line, name .. ".L7", "L7", instance.parameters.L7_color, first);
end

local prevCandle = nil;

-- Indicator calculation routine
function Update(period)
    if prevCandle ~= nil and source:serial(period) == prevCandle then
        return ;
    else
        prevCandle = source:serial(period);
    end

    if source:size() > 0 and (source:size() - source:first()) > N and period == source:size() - 1 then
        local s, i, j, k, a1, a2, a3, a4, v1, si, t;

        s = O + 1;

        -- init arrays
        a1 = {};
        for i = 0, s, 1 do
            a1[i] = {};
        end
        a2 = {};
        a3 = {};
        a4 = {};

        a2[1] = N + 1;
        for i = 1, (s - 1) * 2, 1 do
            v1 = 0;
            for j = 0, N, 1 do
                v1 = v1 + (math.pow(j, i));
            end
            a2[i + 1] = v1;
        end

        for j = 1, s, 1 do
            v1 = 0;
            for i = 0, N, 1 do
                if j == 1 then
                    v1 = v1 + (source.high[period - i] + source.low[period - i]) / 2;
                else
                    v1 = v1 + (source.high[period - i] + source.low[period - i]) / 2 * (math.pow(i, j - 1));
                end
            end
            a3[j] = v1;
        end

        for j = 1, s, 1 do
           for i = 1, s, 1 do
              a1[i][j] = a2[i + j - 1];
           end
        end

        for i = 1, s - 1, 1 do
            si = 0;
            v1 = 0;
            for j = i, s, 1 do
                if math.abs(a1[j][i]) > v1 then
                    v1 = math.abs(a1[j][i]);
                    si = j;
                end
            end
            if si == 0 then
                return ;
            end

            if si ~= i then
                for j = 1, s, 1 do
                    t = a1[i][j];
                    a1[i][j] = a1[si][j];
                    a1[si][j] = t;
                end
                t = a3[i];
                a3[i] = a3[si];
                a3[si] = t;
            end

            for j = i + 1, s, 1 do
                v1 = a1[j][i] / a1[i][i];
                for k = 1, s, 1 do
                    if k == i then
                        a1[j][k] = 0;
                    else
                        a1[j][k] = a1[j][k] - v1 * a1[i][k];
                    end
                end
                a3[j] = a3[j] - v1 * a3[i];
            end
        end

        a4[s] = a3[s] / a1[s][s];

        for i = s - 1, 1, -1 do
            v1 = 0;
            for j = 1, s - i, 1 do
                v1 = v1 + (a1[i][i + j]) * (a4[i + j]);
                a4[i] = 1 / a1[i][i] * (a3[i] - v1);
            end
        end

        for i = 0, N, 1 do
            v1 = 0;
            for j = 1, O, 1 do
                v1 = v1 + (a4[j + 1]) * (math.pow(i, j));
            end
            L1[period - i] = a4[1] + v1;
        end

        v2 = core.stdev(source.high, core.rangeTo(period, N)) * E;

        for i = 0, N, 1 do
            L4[period - i] = L1[period - i] + v2;
            L3[period - i] = L1[period - i] + (L4[period - i] - L1[period - i]) / 1.382;
            L2[period - i] = L1[period - i] + (L3[period - i] - L1[period - i]) / 1.618;
            L7[period - i] = L1[period - i] - v2;
            L6[period - i] = L1[period - i] - (L1[period - i] - L7[period - i]) / 1.382;
            L5[period - i] = L1[period - i] - (L1[period - i] - L6[period - i]) / 1.618;
        end
        for i = N + 1, N + 10, 1 do
            j = period - i;
            if j > source:first() then
                L1[j] = nil;
                L2[j] = nil;
                L3[j] = nil;
                L4[j] = nil;
                L5[j] = nil;
                L6[j] = nil;
                L7[j] = nil;
            end
        end
    end
end

BELCOG.png

Finite Belkhayates center of gravity can be located anywhere on chart.
Finite Belkhayates Center Of Gravity.lua
(10.49 KiB) Downloaded 1374 times
Nikolay.Gekht
FXCodeBase: Base Builder
 
Posts: 1222
Joined: Wed Dec 16, 2009 6:39 pm
Location: Cary, NC

Re: Belkhayate's Center Of Gravity

Postby barishn » Sun May 02, 2010 11:02 pm

Hi,

Thanks so much for this indicator, it works really well, my only query is how come it doesn't load for the entire length of a chart..it seems to only show for a short time length..is it suppose to be that way?

Thanks :)
barishn
 
Posts: 1
Joined: Sun May 02, 2010 10:58 pm

Re: Belkhayate's Center Of Gravity

Postby Nikolay.Gekht » Mon May 03, 2010 7:57 am

Yes. The indicator is drawn for the last N (where N is the first parameter of the indicator) bars only. Moreover, the indicator completely redraws all last N bars when a new bar appears.
Nikolay.Gekht
FXCodeBase: Base Builder
 
Posts: 1222
Joined: Wed Dec 16, 2009 6:39 pm
Location: Cary, NC

Bigger time frame version

Postby Nikolay.Gekht » Wed May 05, 2010 2:37 pm

The bigger time frame version of the indicator:

bf_belcog.png


BF_BELCOG.lua
(7.09 KiB) Downloaded 3188 times

(the BELCOG.lua must be also installed!)
Nikolay.Gekht
FXCodeBase: Base Builder
 
Posts: 1222
Joined: Wed Dec 16, 2009 6:39 pm
Location: Cary, NC

Re: Belkhayate's Center Of Gravity

Postby aarons_alive » Wed May 05, 2010 7:41 pm

Ahhhh yes. A 'selling into strength' system... just what my bank account needs!
aarons_alive
 
Posts: 13
Joined: Mon Apr 19, 2010 10:50 am

Re: Belkhayate's Center Of Gravity

Postby jefftrader » Tue Jul 13, 2010 4:20 pm

any possibility of getting a version of this indicator that doesn't repaint on every new bar?
jefftrader
 
Posts: 28
Joined: Tue Jul 13, 2010 4:13 pm

Re: Belkhayate's Center Of Gravity

Postby Nikolay.Gekht » Tue Jul 13, 2010 10:02 pm

No, because such class of the indicator (the same is, for example for any approximation indicators or to the wave analysis) always does it. It is specific of the method.
Nikolay.Gekht
FXCodeBase: Base Builder
 
Posts: 1222
Joined: Wed Dec 16, 2009 6:39 pm
Location: Cary, NC

Re: Belkhayate's Center Of Gravity

Postby Poupouille » Wed Nov 09, 2011 4:54 pm

Hello. I search the indicator "Belkhayate Timer" (and not Belkhayate Timing) with Marketscope 2.0 from FXCM ! Can you help me ?
Thanks.
Poupouille
 
Posts: 18
Joined: Fri Feb 04, 2011 8:19 am

Re: Belkhayate's Center Of Gravity

Postby Apprentice » Wed Nov 09, 2011 5:53 pm

Can you provide me code for this indicator or a web reference.
User avatar
Apprentice
FXCodeBase: Confirmed User
 
Posts: 17357
Joined: Thu Dec 31, 2009 11:59 am
Location: Zagreb, Croatia

Re: Belkhayate's Center Of Gravity

Postby Karlo_Karlo » Mon Feb 27, 2012 3:33 pm

This indicator seems to work quite well. I tried to make a signal but my knowledge is not enough for this task. Here is the code which does not work correctly. It generates signals but not in the right places. Signals must be generated when price touches L3 (L4) or L6 (L7).

Dear Nikolay, maybe you can help?

Code: Select all
-- Indicator profile initialization routine
-- Defines indicator profile properties and indicator parameters
function Init()
    strategy:name("Gravity signal");
    strategy:description("Signals when Price hits Gravity Edges");

    strategy.parameters:addGroup("Gravity parameters");
    strategy.parameters:addInteger("N", "Number of bars", "", 120);
    strategy.parameters:addInteger("O", "Order", "", 3);
    strategy.parameters:addDouble("E", "Eccart value", "", 1.61803399);

    strategy.parameters:addGroup("Price parameters");
    strategy.parameters:addString("Period", "Time frame", "", "m1");
    strategy.parameters:setFlag("Period", core.FLAG_PERIODS);

    strategy.parameters:addGroup("Signal parameters");
    strategy.parameters:addBoolean("ShowAlert", "Show Alert", "", true);
    strategy.parameters:addBoolean("PlaySound", "Play Sound", "", false);
    strategy.parameters:addFile("SoundFile", "Sound file", "", "");
    strategy.parameters:setFlag("SoundFile", core.FLAG_SOUND);
    strategy.parameters:addBoolean("Recurrent", "RecurrentSound", "", false);

    strategy.parameters:addGroup("Email Parameters");
    strategy.parameters:addBoolean("SendEmail", "Send email", "", false);
    strategy.parameters:addString("Email", "Email address", "", "");
    strategy.parameters:setFlag("Email", core.FLAG_EMAIL);
end

-- Indicator instance initialization routine
-- Processes indicator parameters and creates output streams
-- Parameters block
local gSource;
local BELCOG;

local SoundFile;
local RecurrentSound;
local Email;
local ShowAlert;
local name;

local N;
local O;
local E;

-- Streams block
local L1;
local L2;
local L3;
local L4;
local L5;
local L6;
local L7;

-- Routine
function Prepare(onlyName)

    N = instance.parameters.N;
    O = instance.parameters.O;
    E = instance.parameters.E;


    ShowAlert = instance.parameters.ShowAlert;
    if instance.parameters.PlaySound then
        SoundFile = instance.parameters.SoundFile;
    else
        SoundFile = nil;
    end

    assert(not(PlaySound) or (PlaySound and SoundFile ~= ""), "Sound file must be specified");

    RecurrentSound = instance.parameters.Recurrent;
    local SendEmail = instance.parameters.SendEmail;
    if SendEmail then
        Email = instance.parameters.Email;
    else
        Email = nil;
    end
    assert(not(SendEmail) or (SendEmail and Email ~= ""), "Email address must be specified");


    name = profile:id() .. "(" .. instance.bid:instrument()  .. "," .. N .. "," .. O .. "," .. E .. ")";
    instance:name(name);

    if onlyName then
        return ;
    end

    assert(instance.parameters.Period ~= "t1", "Can't be applied on ticks!");

    gSource = ExtSubscribe(1, nil, instance.parameters.Period, true, "bar");
    BELCOG = core.indicators:create("BELCOG", gSource, N, O, E);

end

function ExtUpdate(id, source, period)
    if id == 1 then
        BELCOG:update(core.UpdateLast);

        if period >= BELCOG.DATA:first() + 1 then
            local message = nil;

            if core.crossesOver( gSource.high, BELCOG.L3, period) then
                message = "Gravity OverBought";
            elseif core.crossesUnder( gSource.low, BELCOG.L6, period) then
                message = "Gravity OverSold";
            end

            if message ~= nil then
               if ShowAlert then
                   terminal:alertMessage(instance.bid:instrument(), instance.bid[NOW], message, instance.bid:date(NOW));
               end

               if SoundFile ~= nil then
                   terminal:alertSound(SoundFile, RecurrentSound);
               end

               if Email ~= nil then
                   terminal:alertEmail(Email, name, name .. "(" .. core.formatDate(instance.bid:date(NOW)) .. ") : " .. message);
               end
            end
        end
    end
end

dofile(core.app_path() .. "\\strategies\\standard\\include\\helper.lua");
Last edited by Karlo_Karlo on Tue Feb 28, 2012 4:29 am, edited 1 time in total.
Karlo_Karlo
Karlo_Karlo
 
Posts: 11
Joined: Fri Jan 07, 2011 4:48 am

Next

Return to Custom Indicators

Who is online

Users browsing this forum: Google [Bot] and 11 guests

cron