- Code: Select all
-- Indicator profile initialization routine
-- Defines indicator profile properties and indicator parameters
function Init()
indicator:name("ChandelierExit");
indicator:description("No description");
indicator:requiredSource(core.Bar);
indicator:type(core.Indicator);
indicator.parameters:addInteger("Range", "Range", "No description", 7);
indicator.parameters:addInteger("Shift", "No name", "No description", 0);
indicator.parameters:addInteger("ATRPeriod", "No name", "No description", 9);
indicator.parameters:addDouble("ATRMultipl", "ATRMultipl", "No description", 2.5);
indicator.parameters:addColor("Up_color", "Color of Up", "Color of Up", core.rgb(255, 0, 255));
indicator.parameters:addColor("Dn_color", "Color of Dn", "Color of Dn", core.rgb(255, 128, 64));
end
-- Indicator instance initialization routine
-- Processes indicator parameters and creates output streams
-- Parameters block
local Range;
local Shift;
local ATRPeriod;
local ATRMultipl;
local first;
local ATR;
local source = nil;
-- Streams block
local Up = nil;
local Dn = nil;
local B1, B2, D;
-- Routine
function Prepare()
Range = instance.parameters.Range;
Shift = instance.parameters.Shift;
ATRPeriod = instance.parameters.ATRPeriod;
ATRMultipl = instance.parameters.ATRMultipl;
source = instance.source;
ATR = core.indicators:create("ATR", source, ATRPeriod);
first = math.max(ATR.DATA:first(), source:first() + Range) + Shift;
local name = profile:id() .. "(" .. source:name() .. ", " .. Range .. ", " .. Shift .. ", " .. ATRPeriod .. ", " .. ATRMultipl .. ")";
instance:name(name);
Up = instance:addStream("Up", core.Line, name .. ".Up", "Up", instance.parameters.Up_color, first);
Dn = instance:addStream("Dn", core.Line, name .. ".Dn", "Dn", instance.parameters.Dn_color, first);
B1 = instance:addInternalStream(0, 0);
B2 = instance:addInternalStream(0, 0);
D = instance:addInternalStream(0, 0);
end
-- Indicator calculation routine
function Update(period, mode)
ATR:update(mode);
if period >= first then
local atr, hh, ll;
atr = ATR.DATA[period - Shift] * ATRMultipl;
ll, hh = core.minmax(source, core.rangeTo(period - Shift, Range));
B1[period] = hh - atr;
B2[period] = ll + atr;
D[period] = D[period - 1];
if source.close[period] > B2[period - 1] then
D[period] = 1;
elseif source.close[period] < B1[period - 1] then
D[period] = -1;
end
if D[period] == 1 then
if B1[period] < B1[period - 1] then
B1[period] = B1[period - 1];
end
Dn[period] = B1[period];
elseif D[period] == -1 then
if B2[period] > B2[period - 1] then
B2[period] = B2[period - 1];
end
Up[period] = B2[period];
end
else
D[period] = 0;
end
end