Mean Reversion Channel - MRI Variant

fareidzulkifli · study · 218 行 · 点赞 8,987 · TradingView 原页

本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。

Pine Script

// 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)

← 返回列表