-- http://vtsystems.com/resources/helps/0000/HTML_VTtrader_Help_Manual/index.html?ti_donchianchannel.html -- -- initializes the indicator function Init() -- indicator:fail() indicator:name("Donchian Channel") indicator:description("The simple trend-following indicator. Shows highest high and lowest low for the specified number of periods."); indicator:requiredSource(core.Bar); indicator:type(core.Indicator); indicator.parameters:addInteger("N", "Number of periods", "", 20, 2, 10000); indicator.parameters:addString("AC", "Analyze the current period", "", "yes"); indicator.parameters:addStringAlternative("AC", "no", "", "no"); indicator.parameters:addStringAlternative("AC", "yes", "", "yes"); indicator.parameters:addColor("clrDU", "Color of the Up line", "", core.rgb(255, 255, 0)); indicator.parameters:addColor("clrDN", "Color of the Down line", "", core.rgb(255, 255, 0)); indicator.parameters:addColor("clrDM", "Color of the middle line", "", core.rgb(255, 255, 0)); indicator.parameters:addString("SM", "Show middle line", "", "no"); indicator.parameters:addStringAlternative("SM", "no", "", "no"); indicator.parameters:addStringAlternative("SM", "yes", "", "yes"); end local first = 0; local n = 0; local ac = true; local sm = false; local source = nil; local dn = nil; local du = nil; local dm = nil; -- initializes the instance of the indicator function Prepare() source = instance.source; n = instance.parameters.N; ac = (instance.parameters.AC == "yes"); sm = (instance.parameters.SM == "yes"); first = n + source:first() - 1; if (not ac) then first = first + 1; end local name = profile:id() .. "(" .. source:name() .. "," .. n .. ")"; instance:name(name); dn = instance:addStream("DU", core.Line, name .. ".DU", "DU", instance.parameters.clrDU, first) du = instance:addStream("DN", core.Line, name .. ".DN", "DN", instance.parameters.clrDN, first) if (sm) then dm = instance:addStream("DM", core.Line, name .. ".DM", "DM", instance.parameters.clrDM, first) end end -- calculate the value function Update(period) if (period >= first) then local range; if (ac) then range = core.rangeTo(period, n); else range = core.rangeTo(period - 1, n); end du[period] = core.max(source.high, range); dn[period] = core.min(source.low, range); if (sm) then dm[period] = (du[period] + dn[period]) / 2; end end end