You can select either fibonacci or gann levels and how much lines to show (variants: 3, 5, 7 or 9).
Update Oct, 08 2010
1) New lines set 3 lines (alt) is added. 0/50%/100% levels are used.
2) Label now are options, you can switch them off.
3) Now you can see the level and the price by moving mouse cursor over the line and wait a bit until tooltip appears.
4) Styles and line width are added.
5) Indicator code is a bit optimized.
Download the new version of indicator:
Download the indicator (older version):
- Code: Select all
-- Indicator profile initialization routine
-- Defines indicator profile properties and indicator parameters
-- TODO: Add minimal and maximal value of numeric parameters and default color of the streams
function Init()
indicator:name("Automatic Fib or Gann levels on the base of H/L values");
indicator:description("");
indicator:requiredSource(core.Bar);
indicator:type(core.Indicator);
indicator.parameters:addGroup("Parameters");
indicator.parameters:addInteger("N", "Number of periods to find H/L", "", 50);
indicator.parameters:addString("M", "Lines Method", "", "F");
indicator.parameters:addStringAlternative("M", "Fibonacci", "", "F");
indicator.parameters:addStringAlternative("M", "Gann", "", "G");
indicator.parameters:addString("L", "Levels number", "", "3");
indicator.parameters:addStringAlternative("L", "3 Lines", "", "3");
indicator.parameters:addStringAlternative("L", "3 Lines (alt)", "", "3a");
indicator.parameters:addStringAlternative("L", "5 Lines", "", "5");
indicator.parameters:addStringAlternative("L", "7 Lines", "", "7");
indicator.parameters:addStringAlternative("L", "9 Lines", "", "9");
indicator.parameters:addInteger("E", "Number of bars to show lines after the latest bar char", "", 20, 1, 100);
indicator.parameters:addGroup("Style");
indicator.parameters:addColor("L_color", "Color of level lines", "", core.rgb(255, 255, 0));
indicator.parameters:addInteger("L_width", "Width of level lines", "", 1, 1, 5);
indicator.parameters:addInteger("L_style", "Style level lines", "", core.LINE_SOLID);
indicator.parameters:setFlag("L_style", core.FLAG_LINE_STYLE);
indicator.parameters:addColor("M_color", "Time marker color", "", core.rgb(255, 0, 0));
indicator.parameters:addInteger("M_width", "Width of level lines", "", 1, 1, 5);
indicator.parameters:addInteger("M_style", "Style level lines", "", core.LINE_DOT);
indicator.parameters:setFlag("M_style", core.FLAG_LINE_STYLE);
indicator.parameters:addBoolean("ShowLabels", "Show Line Labels", "", true);
end
-- Indicator instance initialization routine
-- Processes indicator parameters and creates output streams
-- TODO: Refine the first period calculation for each of the output streams.
-- TODO: Calculate all constants, create instances all subsequent indicators and load all required libraries
-- Parameters block
local N;
local M;
local L;
local E;
local L_color;
local L_width;
local L_style;
local M_color;
local M_width;
local M_style;
local ShowLabels;
--local T_color;
local first;
local source = nil;
local barSize;
local format;
-- Streams block
local D = nil;
-- Routine
function Prepare()
N = instance.parameters.N;
M = instance.parameters.M;
L = instance.parameters.L;
E = instance.parameters.E;
L_color = instance.parameters.L_color;
L_width = instance.parameters.L_width;
L_style = instance.parameters.L_style;
M_color = instance.parameters.M_color;
M_width = instance.parameters.M_width;
M_style = instance.parameters.M_style;
ShowLabels = instance.parameters.ShowLabels;
--T_color = instance.parameters.T_color;
source = instance.source;
local s, e;
s, e = core.getcandle(source:barSize(), core.now(), 0);
barSize = math.floor(((e - s) * 1440) + 0.5) / 1440;
first = source:first() + N;
local name = profile:id() .. "(" .. source:name() .. ", " .. N .. ", " .. M .. ", " .. L .. ")";
instance:name(name);
D = instance:addStream("D", core.Line, name, "D", instance.parameters.L_color, first, E);
format = "%.3f=%." .. source:getPrecision() .. "f";
end
local MIN = nil;
local MAX = nil;
local P = nil;
local levels = nil;
local index = nil;
-- Indicator calculation routine
function Update(period)
if period >= first and period == source:size() - 1 then
local min, max, minp, maxp, p, k, v, f, t, price, d, label;
min, max, minp, maxp = core.minmax(source, core.rangeTo(period, N));
p = math.min(minp, maxp);
if MIN == nil or
MIN ~= min or MAX ~= max or P ~= p then
MIN = min;
MAX = max;
d = max - min;
P = p;
if levels == nil then
CalcLevels();
end
local idx;
idx = index[L];
f = source:date(p);
t = source:date(source:size() - 1) + ((E - 1) * barSize);
for k, v in pairs(idx) do
price = min + d * levels[v];
label = string.format(format, levels[v], price);
core.host:execute("drawLine", k, f, price, t, price, L_color, L_style, L_width, label);
if ShowLabels then
core.host:execute("drawLabel", k, f, price, label);
end
end
core.host:execute("drawLine", 10, f, min, f, max, M_color, M_style, M_width);
end
end
end
function CalcLevels()
levels = {};
index = {};
if M == "F" then
levels[1] = -0.236;
levels[2] = 0;
levels[3] = 0.236;
levels[4] = 0.382;
levels[5] = 0.5;
levels[6] = 0.618;
levels[7] = 0.764;
levels[8] = 1;
levels[9] = 1.272;
index["3"] = {4, 5, 6};
index["3a"] = {2, 5, 8};
index["5"] = {2, 4, 5, 6, 8};
index["7"] = {2, 3, 4, 5, 6, 7, 8};
index["9"] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
else
levels[1] = 0;
levels[2] = 0.125;
levels[3] = 0.25;
levels[4] = 0.375;
levels[5] = 0.5;
levels[6] = 0.625;
levels[7] = 0.75;
levels[8] = 0.875;
levels[9] = 1;
index["3"] = {3, 5, 7};
index["3a"] = {1, 5, 9};
index["5"] = {1, 3, 5, 7, 9};
index["7"] = {1, 3, 4, 5, 6, 7, 9};
index["9"] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
end
end