本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © fareidzulkifli
// Description :
// Mean Reversion Channel objective, based on Mean Reversion theory ( everything has a tendency to revert back to its mean), is to help visualizing:
// Inner Channel -> Dynamic Support and Resistance
// Outer Channel -> Overbought/Oversold Zone which may signal consolidation phase or potential reversal due to unsustainable move
// Details of each filtering type used for mean calculation can be read in Ehlers Technical Papers: "Swiss Army Knife Indicator" and/or his book "Cybernetics Analysis for Stock and Futures"
// Disclaimer:
// These study scripts was built only to test/visualize an idea to see its viability and if it can be used to optimize existing strategy.
// Any ideas to further improve this indicator are welcome :)
//@version=4
study("Mean Reversion Channel - MRI Variant", overlay=true)
//************************************************************************************************************//
// Parameter
//************************************************************************************************************//
length = input(200, title="Lookback Period",minval=1)
type = input(title="Filter Type", defval="SuperSmoother", options=["SuperSmoother", "Ehlers EMA", "Gaussian", "Butterworth", "BandStop", "SMA", "EMA", "RMA"])
source = input(hlc3, title="Price Source", type=input.source)
displayzone = input(true, title="Display Zone")
zonetransp = input(60, title="Zone Transparency", minval=0, maxval=100)
//************************************************************************************************************//
// Function
//************************************************************************************************************//
pi = 2 * asin(1)
mult = pi
mult2 = pi*2.415
//********************************************//
// Ehler SwissArmyKnife Function
//********************************************//
SAK_smoothing(_type, _src, _length) =>
c0 = 1.0
c1 = 0.0
b0 = 1.0
b1 = 0.0
b2 = 0.0
a1 = 0.0
a2 = 0.0
alpha = 0.0
beta = 0.0
gamma = 0.0
cycle = 2 * pi / _length
if _type == "Ehlers EMA"
alpha := (cos(cycle) + sin(cycle) - 1) / cos(cycle)
b0 := alpha
a1 := 1 - alpha
if _type == "Gaussian"
beta := 2.415 * (1 - cos(cycle))
alpha := -beta + sqrt((beta * beta) + (2 * beta))
c0 := alpha * alpha
a1 := 2 * (1 - alpha)
a2 := -(1 - alpha) * (1 - alpha)
if _type == "Butterworth"
beta := 2.415 * (1 - cos(cycle))
alpha := -beta + sqrt((beta * beta) + (2 * beta))
c0 := alpha * alpha / 4
b1 := 2
b2 := 1
a1 := 2 * (1 - alpha)
a2 := -(1 - alpha) * (1 - alpha)
if _type == "BandStop"
beta := cos(cycle)
gamma := 1 / cos(cycle*2*0.1) // delta default to 0.1. Acceptable delta -- 0.05<d<0.5
alpha := gamma - sqrt((gamma * gamma) - 1)
c0 := (1 + alpha) / 2
b1 := -2 * beta
b2 := 1
a1 := beta * (1 + alpha)
a2 := -alpha
if _type == "SMA"
c1 := 1 / _length
b0 := 1 / _length
a1 := 1
if _type == "EMA"
alpha := 2/(_length+1)
b0 := alpha
a1 := 1 - alpha
if _type == "RMA"
alpha := 1 / _length
b0 := alpha
a1 := 1 - alpha
_Input = _src
_Output = 0.0
_Output := (c0 * ((b0 * _Input) + (b1 * nz(_Input[1])) + (b2 * nz(_Input[2])))) + (a1 * nz(_Output[1])) + (a2 * nz(_Output[2])) - (c1 * nz(_Input[_length]))
//********************************************//
// SuperSmoother Function
//********************************************//
supersmoother(_src, _length) =>
s_a1 = exp(-sqrt(2) * pi / _length)
s_b1 = 2 * s_a1 * cos(sqrt(2) * pi / _length)
s_c3 = -pow(s_a1, 2)
s_c2 = s_b1
s_c1 = 1 - s_c2 - s_c3
ss = 0.0
ss := s_c1 * _src + s_c2 * nz(ss[1], _src[1]) + s_c3 * nz(ss[2], _src[2])
//************************************************************************************************************//
// Indicator
//************************************************************************************************************//
meanline = source
meanrange = supersmoother(tr, length)
if(type == "SuperSmoother")
meanline := supersmoother(source, length)
if(type != "SuperSmoother")
meanline := SAK_smoothing(type, source, length)
upband1 = meanline+(meanrange*mult)
loband1 = meanline-(meanrange*mult)
upband2 = meanline+(meanrange*mult2)
loband2 = meanline-(meanrange*mult2)
//************************************************************************************************************//
// Drawing
//************************************************************************************************************//
z = plot(meanline, color=#FFCD00, style=plot.style_line, title="Mean Line", linewidth=2)
x1 = plot(upband1, color=color.green, style=plot.style_circles, title="Upper Inner Channel", linewidth=1, transp=50)
x2 = plot(loband1, color=color.green, style=plot.style_circles, title="Lower Inner Channel", linewidth=1, transp=50)
y1 = plot(upband2, color=color.red, style=plot.style_line, title="Upper Outer Channel", linewidth=1, transp=50)
y2 = plot(loband2, color=color.red, style=plot.style_line, title="Lower Outer Channel", linewidth=1, transp=50)
//************************************************************************************************************//
// Draw zone (for fun)
//************************************************************************************************************//
//---
color1 = #FF0000
color2 = #FF4200
color3 = #FF5D00
color4 = #FF7400
color5 = #FF9700
color6 = #FFAE00
color7 = #FFC500
color8 = #FFCD00
//---
gradsize = 0.0
gradtransp = zonetransp
if(displayzone)
gradsize := 0.5
//---
upband2_1 = upband2 + (meanrange * gradsize * 4)
upband2_2 = upband2 + (meanrange * gradsize * 3)
upband2_3 = upband2 + (meanrange * gradsize * 2)
upband2_4 = upband2 + (meanrange * gradsize * 1)
upband2_5 = upband2 + (meanrange * gradsize * 0)
upband2_6 = upband2 + (meanrange * gradsize * -1)
upband2_7 = upband2 + (meanrange * gradsize * -2)
upband2_8 = upband2 + (meanrange * gradsize * -3)
upband2_9 = upband2 + (meanrange * gradsize * -4)
loband2_1 = loband2 - (meanrange * gradsize * 4)
loband2_2 = loband2 - (meanrange * gradsize * 3)
loband2_3 = loband2 - (meanrange * gradsize * 2)
loband2_4 = loband2 - (meanrange * gradsize * 1)
loband2_5 = loband2 - (meanrange * gradsize * 0)
loband2_6 = loband2 - (meanrange * gradsize * -1)
loband2_7 = loband2 - (meanrange * gradsize * -2)
loband2_8 = loband2 - (meanrange * gradsize * -3)
loband2_9 = loband2 - (meanrange * gradsize * -4)
//---
plot_upband2_1 = plot(upband2_1, color=na, transp=100, display=display.none)
plot_upband2_2 = plot(upband2_2, color=na, transp=100, display=display.none)
plot_upband2_3 = plot(upband2_3, color=na, transp=100, display=display.none)
plot_upband2_4 = plot(upband2_4, color=na, transp=100, display=display.none)
plot_upband2_5 = plot(upband2_5, color=na, transp=100, display=display.none)
plot_upband2_6 = plot(upband2_6, color=na, transp=100, display=display.none)
plot_upband2_7 = plot(upband2_7, color=na, transp=100, display=display.none)
plot_upband2_8 = plot(upband2_8, color=na, transp=100, display=display.none)
plot_upband2_9 = plot(upband2_9, color=na, transp=100, display=display.none)
plot_loband2_1 = plot(loband2_1, color=na, transp=100, display=display.none)
plot_loband2_2 = plot(loband2_2, color=na, transp=100, display=display.none)
plot_loband2_3 = plot(loband2_3, color=na, transp=100, display=display.none)
plot_loband2_4 = plot(loband2_4, color=na, transp=100, display=display.none)
plot_loband2_5 = plot(loband2_5, color=na, transp=100, display=display.none)
plot_loband2_6 = plot(loband2_6, color=na, transp=100, display=display.none)
plot_loband2_7 = plot(loband2_7, color=na, transp=100, display=display.none)
plot_loband2_8 = plot(loband2_8, color=na, transp=100, display=display.none)
plot_loband2_9 = plot(loband2_9, color=na, transp=100, display=display.none)
//---
fill(plot_upband2_1,plot_upband2_2, color=color1, transp=gradtransp)
fill(plot_upband2_2,plot_upband2_3, color=color2, transp=gradtransp)
fill(plot_upband2_3,plot_upband2_4, color=color3, transp=gradtransp)
fill(plot_upband2_4,plot_upband2_5, color=color4, transp=gradtransp)
fill(plot_upband2_5,plot_upband2_6, color=color5, transp=gradtransp)
fill(plot_upband2_6,plot_upband2_7, color=color6, transp=gradtransp)
fill(plot_upband2_7,plot_upband2_8, color=color7, transp=gradtransp)
fill(plot_upband2_8,plot_upband2_9, color=color8, transp=gradtransp)
fill(plot_loband2_1,plot_loband2_2, color=color1, transp=gradtransp)
fill(plot_loband2_2,plot_loband2_3, color=color2, transp=gradtransp)
fill(plot_loband2_3,plot_loband2_4, color=color3, transp=gradtransp)
fill(plot_loband2_4,plot_loband2_5, color=color4, transp=gradtransp)
fill(plot_loband2_5,plot_loband2_6, color=color5, transp=gradtransp)
fill(plot_loband2_6,plot_loband2_7, color=color6, transp=gradtransp)
fill(plot_loband2_7,plot_loband2_8, color=color7, transp=gradtransp)
fill(plot_loband2_8,plot_loband2_9, color=color8, transp=gradtransp)