-- More information about this indicator can be found at: -- http://fxcodebase.com/code/viewtopic.php?f=17&t=6008 --+------------------------------------------------------------------+ --| Copyright © 2018, Gehtsoft USA LLC | --| http://fxcodebase.com | --+------------------------------------------------------------------+ --| Support our efforts by donating | --| Paypal: https://goo.gl/9Rj74e | --| BitCoin : 15VCJTLaz12Amr7adHSBtL9v8XomURo9RF | --| BitCoin Cash: 1BEtS465S3Su438Kc58h2sqvVvHK9Mijtg | --| Ethereum : 0x8C110cD61538fb6d7A2B47858F0c0AaBd663068D | --| LiteCoin : LLU8PSY2vsq7B9kRELLZQcKf5nJQrdeqwD | --+------------------------------------------------------------------+ function Init() indicator:name("Double Bollinger Bands"); indicator:description(""); indicator:requiredSource(core.Tick); indicator:type(core.Indicator); indicator:setTag("group", "Bollinger"); indicator.parameters:addGroup("Calculation"); indicator.parameters:addInteger("N", "Number of periods", "", 20, 1, 10000); indicator.parameters:addDouble("D1", "Deviation for inner band", "", 1.0, 0.00001, 10000); indicator.parameters:addDouble("D2", "Deviation for outer band", "", 2.0, 0.00001, 10000); indicator.parameters:addGroup("Style"); indicator.parameters:addInteger("MS", "Midline Style", "", core.LINE_SOLID); indicator.parameters:setFlag("MS", core.FLAG_LEVEL_STYLE); indicator.parameters:addInteger("MW", "Midline Width", "", 1, 1, 5); indicator.parameters:addColor("MC", "Midline Color", "", core.rgb(255, 0, 255)); indicator.parameters:addInteger("IS", "Inner Band Style", "", core.LINE_SOLID); indicator.parameters:setFlag("IS", core.FLAG_LEVEL_STYLE); indicator.parameters:addInteger("IW", "Inner Band Width", "", 1, 1, 5); indicator.parameters:addColor("IC", "Inner Band Color", "", core.rgb(127, 0, 0)); indicator.parameters:addInteger("OS", "Outer Band Style", "", core.LINE_SOLID); indicator.parameters:setFlag("OS", core.FLAG_LEVEL_STYLE); indicator.parameters:addInteger("OW", "Outer Band Width", "", 1, 1, 5); indicator.parameters:addColor("OC", "Outer Band Color", "", core.rgb(255, 128, 64)); indicator.parameters:addBoolean("HF", "Highlight Area Between Bands", "", true); indicator.parameters:addColor("HC", "Highligh Area Color", "", core.rgb(255, 255, 0)); indicator.parameters:addInteger("HT", "Highlight Area Trasnsparency", "0 - opaque, 100 - transparent", 80, 0, 100); end local N, D1, D2; local first; local source; local M, OU, OD, IU, ID, OU1, OD1, IU1, ID1; local HF; function Prepare(onlyName) local name = profile:id() .. "(" .. instance.source:name() .. "," .. instance.parameters.N .. "," .. instance.parameters.D1 .. "," .. instance.parameters.D2 .. ")"; instance:name(name); if onlyName then return ; end source = instance.source; N = instance.parameters.N; D1 = instance.parameters.D1; D2 = instance.parameters.D2; first = source:first() + N - 1; M = instance:addStream("Mid", core.Line, name .. ".Mid", "Mid", instance.parameters.MC, first); M:setStyle(instance.parameters.MS); M:setWidth(instance.parameters.MW); IU = instance:addStream("InUp", core.Line, name .. ".InUp", "InUp", instance.parameters.IC, first); IU:setStyle(instance.parameters.IS); IU:setWidth(instance.parameters.IW); ID = instance:addStream("InDn", core.Line, name .. ".InDn", "InDn", instance.parameters.IC, first); ID:setStyle(instance.parameters.IS); ID:setWidth(instance.parameters.IW); OU = instance:addStream("OutUp", core.Line, name .. ".OutUp", "OutUp", instance.parameters.OC, first); OU:setStyle(instance.parameters.OS); OU:setWidth(instance.parameters.OW); OD = instance:addStream("OutDn", core.Line, name .. ".OutDn", "OutDn", instance.parameters.OC, first); OD:setStyle(instance.parameters.OS); OD:setWidth(instance.parameters.OW); HF = instance.parameters.HF; if HF then IU1 = instance:addInternalStream(first, 0); ID1 = instance:addInternalStream(first, 0); OU1 = instance:addInternalStream(first, 0); OD1 = instance:addInternalStream(first, 0); instance:createChannelGroup("U", "U", OU1, IU1, instance.parameters.HC, 100 - instance.parameters.HT); instance:createChannelGroup("D", "D", ID1, OD1, instance.parameters.HC, 100 - instance.parameters.HT); end end function Update(period, mode) if period >= first then local m = core.avg(source, period - N + 1, period); local d = mathex.stdev(source, period - N + 1, period); M[period] = m; IU[period] = m + d * D1; ID[period] = m - d * D1; OU[period] = m + d * D2; OD[period] = m - d * D2; if HF then IU1[period] = m + d * D1; ID1[period] = m - d * D1; OU1[period] = m + d * D2; OD1[period] = m - d * D2; end end end