Indicator · Pine Script v5 · Own pane

Standard Deviation Refurbished

by andreperez

Standard Deviation Refurbished plots the standard deviation of a chosen source in a separate pane, with optional smoothing using several moving average types and optional normalization to a 0 to 100 range.

View on GitHub

GitHub stars1on the repository
Pine versionv5runs as is
Lines of code318
Settings40inputs
LicenceNone statedfile: MPL-2.0
Last update3 years ago27 Nov 2022

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

318 lines of Pine Script v5 from Standard Deviation.pine, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

Standard Deviation.pine
// @version=5
// @License This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// @Author andre_007
// @description Standard Deviation Refurbished
// @Thanks and credits:
//      - TradingView (StDev and MAs)
//      - The_Caretaker (themes 'Spectrum Blue-Green-Red' and 'Spectrum Blue-Red')

indicator('Standard Deviation Refurbished', shorttitle='StDev Refurbished', format=format.price, precision=2, timeframe="", max_bars_back = 1000)

// ------------------------- Constants {
var string SMA          = 'Simple Moving Average'
var string EMA          = 'Exponential Moving Average'
var string HMA          = 'Hull Moving Average'
var string ALMA         = 'Arnaud Legoux Moving Average'
var string MEDIAN       = 'Median'
var string VWAP         = 'VWAP'
var color TRANSPARENT   = color.new(color.white, 100)
var string GROUP_1      = 'Standard Deviation'
var string GROUP_2      = 'Theme'
var string GROUP_3      = 'Moving Averages'
var color LIME          = color.new(#00FF29, 0)
var color PURPLE        = color.new(#e814ff, 0)

var arrayColorBGR = array.new_color(na)
var arrayColorBR = array.new_color(na)
if barstate.isfirst
    array.push ( arrayColorBGR, #0000FF )
    array.push ( arrayColorBGR, #000AFF ), array.push ( arrayColorBGR, #0014FF ), array.push ( arrayColorBGR, #001FFF ), array.push ( arrayColorBGR, #0029FF ), array.push ( arrayColorBGR, #0033FF ),
    array.push ( arrayColorBGR, #003DFF ), array.push ( arrayColorBGR, #0047FF ), array.push ( arrayColorBGR, #0052FF ), array.push ( arrayColorBGR, #005CFF ), array.push ( arrayColorBGR, #0066FF ),
    array.push ( arrayColorBGR, #0070FF ), array.push ( arrayColorBGR, #007AFF ), array.push ( arrayColorBGR, #0085FF ), array.push ( arrayColorBGR, #008FFF ), array.push ( arrayColorBGR, #0099FF ),
    array.push ( arrayColorBGR, #00A3FF ), array.push ( arrayColorBGR, #00ADFF ), array.push ( arrayColorBGR, #00B8FF ), array.push ( arrayColorBGR, #00C2FF ), array.push ( arrayColorBGR, #00CCFF ),
    array.push ( arrayColorBGR, #00D6FF ), array.push ( arrayColorBGR, #00E0FF ), array.push ( arrayColorBGR, #00EBFF ), array.push ( arrayColorBGR, #00F5FF ), array.push ( arrayColorBGR, #00FFFF ),
    array.push ( arrayColorBGR, #00FFF5 ), array.push ( arrayColorBGR, #00FFEB ), array.push ( arrayColorBGR, #00FFE0 ), array.push ( arrayColorBGR, #00FFD6 ), array.push ( arrayColorBGR, #00FFCC ),
    array.push ( arrayColorBGR, #00FFC2 ), array.push ( arrayColorBGR, #00FFB8 ), array.push ( arrayColorBGR, #00FFAD ), array.push ( arrayColorBGR, #00FFA3 ), array.push ( arrayColorBGR, #00FF99 ),
    array.push ( arrayColorBGR, #00FF8F ), array.push ( arrayColorBGR, #00FF85 ), array.push ( arrayColorBGR, #00FF7A ), array.push ( arrayColorBGR, #00FF70 ), array.push ( arrayColorBGR, #00FF66 ),
    array.push ( arrayColorBGR, #00FF5C ), array.push ( arrayColorBGR, #00FF52 ), array.push ( arrayColorBGR, #00FF47 ), array.push ( arrayColorBGR, #00FF3D ), array.push ( arrayColorBGR, #00FF33 ),
    array.push ( arrayColorBGR, #00FF29 ), array.push ( arrayColorBGR, #00FF1F ), array.push ( arrayColorBGR, #00FF14 ), array.push ( arrayColorBGR, #00FF0A ), array.push ( arrayColorBGR, #00FF00 ),
    array.push ( arrayColorBGR, #0AFF00 ), array.push ( arrayColorBGR, #14FF00 ), array.push ( arrayColorBGR, #1FFF00 ), array.push ( arrayColorBGR, #29FF00 ), array.push ( arrayColorBGR, #33FF00 ),
    array.push ( arrayColorBGR, #3DFF00 ), array.push ( arrayColorBGR, #47FF00 ), array.push ( arrayColorBGR, #52FF00 ), array.push ( arrayColorBGR, #5CFF00 ), array.push ( arrayColorBGR, #66FF00 ),
    array.push ( arrayColorBGR, #70FF00 ), array.push ( arrayColorBGR, #7AFF00 ), array.push ( arrayColorBGR, #85FF00 ), array.push ( arrayColorBGR, #8FFF00 ), array.push ( arrayColorBGR, #99FF00 ),
    array.push ( arrayColorBGR, #A3FF00 ), array.push ( arrayColorBGR, #ADFF00 ), array.push ( arrayColorBGR, #B8FF00 ), array.push ( arrayColorBGR, #C2FF00 ), array.push ( arrayColorBGR, #CCFF00 ),
    array.push ( arrayColorBGR, #D6FF00 ), array.push ( arrayColorBGR, #E0FF00 ), array.push ( arrayColorBGR, #EBFF00 ), array.push ( arrayColorBGR, #F5FF00 ), array.push ( arrayColorBGR, #FFFF00 ),
    array.push ( arrayColorBGR, #FFF500 ), array.push ( arrayColorBGR, #FFEB00 ), array.push ( arrayColorBGR, #FFE000 ), array.push ( arrayColorBGR, #FFD600 ), array.push ( arrayColorBGR, #FFCC00 ),
    array.push ( arrayColorBGR, #FFC200 ), array.push ( arrayColorBGR, #FFB800 ), array.push ( arrayColorBGR, #FFAD00 ), array.push ( arrayColorBGR, #FFA300 ), array.push ( arrayColorBGR, #FF9900 ),
    array.push ( arrayColorBGR, #FF8F00 ), array.push ( arrayColorBGR, #FF8500 ), array.push ( arrayColorBGR, #FF7A00 ), array.push ( arrayColorBGR, #FF7000 ), array.push ( arrayColorBGR, #FF6600 ),
    array.push ( arrayColorBGR, #FF5C00 ), array.push ( arrayColorBGR, #FF5200 ), array.push ( arrayColorBGR, #FF4700 ), array.push ( arrayColorBGR, #FF3D00 ), array.push ( arrayColorBGR, #FF3300 ),
    array.push ( arrayColorBGR, #FF2900 ), array.push ( arrayColorBGR, #FF1F00 ), array.push ( arrayColorBGR, #FF1400 ), array.push ( arrayColorBGR, #FF0000 ), array.push ( arrayColorBGR, #FF0000 )
    
    array.push ( arrayColorBR, #0000FF )
    array.push ( arrayColorBR, #0200FC ), array.push ( arrayColorBR, #0500F9 ), array.push ( arrayColorBR, #0700F7 ), array.push ( arrayColorBR, #0A00F4 ), array.push ( arrayColorBR, #0C00F2 ),
    array.push ( arrayColorBR, #0F00EF ), array.push ( arrayColorBR, #1100ED ), array.push ( arrayColorBR, #1400EA ), array.push ( arrayColorBR, #1600E8 ), array.push ( arrayColorBR, #1900E5 ),
    array.push ( arrayColorBR, #1C00E2 ), array.push ( arrayColorBR, #1E00E0 ), array.push ( arrayColorBR, #2100DD ), array.push ( arrayColorBR, #2300DB ), array.push ( arrayColorBR, #2600D8 ),
    array.push ( arrayColorBR, #2800D6 ), array.push ( arrayColorBR, #2B00D3 ), array.push ( arrayColorBR, #2D00D1 ), array.push ( arrayColorBR, #3000CE ), array.push ( arrayColorBR, #3300CC ),
    array.push ( arrayColorBR, #3500C9 ), array.push ( arrayColorBR, #3800C6 ), array.push ( arrayColorBR, #3A00C4 ), array.push ( arrayColorBR, #3D00C1 ), array.push ( arrayColorBR, #3F00BF ),
    array.push ( arrayColorBR, #4200BC ), array.push ( arrayColorBR, #4400BA ), array.push ( arrayColorBR, #4700B7 ), array.push ( arrayColorBR, #4900B5 ), array.push ( arrayColorBR, #4C00B2 ),
    array.push ( arrayColorBR, #4F00AF ), array.push ( arrayColorBR, #5100AD ), array.push ( arrayColorBR, #5400AA ), array.push ( arrayColorBR, #5600A8 ), array.push ( arrayColorBR, #5900A5 ),
    array.push ( arrayColorBR, #5B00A3 ), array.push ( arrayColorBR, #5E00A0 ), array.push ( arrayColorBR, #60009E ), array.push ( arrayColorBR, #63009B ), array.push ( arrayColorBR, #660099 ),
    array.push ( arrayColorBR, #680096 ), array.push ( arrayColorBR, #6B0093 ), array.push ( arrayColorBR, #6D0091 ), array.push ( arrayColorBR, #70008E ), array.push ( arrayColorBR, #72008C ),
    array.push ( arrayColorBR, #750089 ), array.push ( arrayColorBR, #770087 ), array.push ( arrayColorBR, #7A0084 ), array.push ( arrayColorBR, #7C0082 ), array.push ( arrayColorBR, #7F007F ),
    array.push ( arrayColorBR, #82007C ), array.push ( arrayColorBR, #84007A ), array.push ( arrayColorBR, #870077 ), array.push ( arrayColorBR, #890075 ), array.push ( arrayColorBR, #8C0072 ),
    array.push ( arrayColorBR, #8E0070 ), array.push ( arrayColorBR, #91006D ), array.push ( arrayColorBR, #93006B ), array.push ( arrayColorBR, #960068 ), array.push ( arrayColorBR, #990066 ),
    array.push ( arrayColorBR, #9B0063 ), array.push ( arrayColorBR, #9E0060 ), array.push ( arrayColorBR, #A0005E ), array.push ( arrayColorBR, #A3005B ), array.push ( arrayColorBR, #A50059 ),
    array.push ( arrayColorBR, #A80056 ), array.push ( arrayColorBR, #AA0054 ), array.push ( arrayColorBR, #AD0051 ), array.push ( arrayColorBR, #AF004F ), array.push ( arrayColorBR, #B2004C ),
    array.push ( arrayColorBR, #B50049 ), array.push ( arrayColorBR, #B70047 ), array.push ( arrayColorBR, #BA0044 ), array.push ( arrayColorBR, #BC0042 ), array.push ( arrayColorBR, #BF003F ),
    array.push ( arrayColorBR, #C1003D ), array.push ( arrayColorBR, #C4003A ), array.push ( arrayColorBR, #C60038 ), array.push ( arrayColorBR, #C90035 ), array.push ( arrayColorBR, #CC0033 ),
    array.push ( arrayColorBR, #CE0030 ), array.push ( arrayColorBR, #D1002D ), array.push ( arrayColorBR, #D3002B ), array.push ( arrayColorBR, #D60028 ), array.push ( arrayColorBR, #D80026 ),
    array.push ( arrayColorBR, #DB0023 ), array.push ( arrayColorBR, #DD0021 ), array.push ( arrayColorBR, #E0001E ), array.push ( arrayColorBR, #E2001C ), array.push ( arrayColorBR, #E50019 ),
    array.push ( arrayColorBR, #E80016 ), array.push ( arrayColorBR, #EA0014 ), array.push ( arrayColorBR, #ED0011 ), array.push ( arrayColorBR, #EF000F ), array.push ( arrayColorBR, #F2000C ),
    array.push ( arrayColorBR, #F4000A ), array.push ( arrayColorBR, #F70007 ), array.push ( arrayColorBR, #F90005 ), array.push ( arrayColorBR, #FC0002 ), array.push ( arrayColorBR, #FF0000 )    

// ------------------------- Inputs {
// Standard Deviation
float source = input.source(defval=close, title='Source', inline='1', group=GROUP_1)
var int len = input.int(defval=55, title='Length', minval=2, inline='1', group=GROUP_1)

// Smooth
var bool boolSmooth = input.bool(defval=true, title='Smooth indicator?', inline='10', group=GROUP_1)
var string typeMaSmooth = input.string(defval=ALMA, title='Type',
  options=[SMA, EMA, HMA, ALMA], inline='10', group=GROUP_1)
var int lenSmooth = input.int(defval=5, title='Length', inline='10', minval=1, group=GROUP_1)

// Normalization
var bool normalize =input.bool(defval=true, title='Normalize?', inline='15', group=GROUP_1)
var int lenNormal = input.int(defval=200, title='Length', inline='15', minval=1, group=GROUP_1)

// Theme
var string themeSt = input.string(defval='Spectrum Blue-Green-Red', title='Theme',
  options=['User', 'Deep Purple', 'Spectrum Blue-Green-Red', 'Spectrum Blue-Red'], inline='20', group=GROUP_2, 
  tooltip='When normalization is off, only User theme or Deep Purple apply')

var colorAboveMa = input.color(defval=color.new(#00A3FF, 0), title='Standard Deviation', tooltip='', inline='21', group=GROUP_1)
var colorBellowMa = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='21', group=GROUP_1)

// MA
var string typeMa = input.string(defval=ALMA, title='Type of Moving Averages', 
  options=[SMA, EMA, HMA, ALMA], inline='25', group=GROUP_3)
  
var bool showMarkers = input.bool(defval=true, title='Show markers when cross MA 1?', inline='26', group=GROUP_3)

var bool showMa1  = input.bool(defval=true, title='MA 1?', inline='30', group=GROUP_3)
var int lenMa1    = input.int(defval=5, title='Length', inline='30', minval=2, group=GROUP_3)
var colorMa1Up    = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='30', group=GROUP_3)
var colorMa1Dow   = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='30', group=GROUP_3)

var bool showMa2  = input.bool(defval=true, title='MA 2?', inline='32', group=GROUP_3)
var int lenMa2    = input.int(defval=10, title='Length', inline='32', minval=2, group=GROUP_3)
var colorMa2Up    = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='32', group=GROUP_3)
var colorMa2Dow   = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='32', group=GROUP_3)

var bool showMa3  = input.bool(defval=true, title='MA 3?', inline='34', group=GROUP_3)
var int lenMa3    = input.int(defval=15, title='Length', inline='34', minval=2, group=GROUP_3)
var colorMa3Up    = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='34', group=GROUP_3)
var colorMa3Dow   = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='34', group=GROUP_3)

var bool showMa4  = input.bool(defval=true, title='MA 4?', inline='36', group=GROUP_3)
var int lenMa4    = input.int(defval=20, title='Length', inline='36', minval=2, group=GROUP_3)
var colorMa4Up    = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='36', group=GROUP_3)
var colorMa4Dow   = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='36', group=GROUP_3)

var bool showMa5  = input.bool(defval=true, title='MA 5?', inline='38', group=GROUP_3)
var int lenMa5    = input.int(defval=25, title='Length', inline='38', minval=2, group=GROUP_3)
var colorMa5Up    = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='38', group=GROUP_3)
var colorMa5Dow   = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='38', group=GROUP_3)

var bool showMa6  = input.bool(defval=true, title='MA 6?', inline='40', group=GROUP_3)
var int lenMa6    = input.int(defval=30, title='Length', inline='40', minval=2, group=GROUP_3)
var colorMa6Up    = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='40', group=GROUP_3)
var colorMa6Dow   = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='40', group=GROUP_3)

var bool showMa7  = input.bool(defval=true, title='MA 7?', inline='42', group=GROUP_3)
var int lenMa7    = input.int(defval=35, title='Length', inline='42', minval=2, group=GROUP_3)
var colorMa7Up    = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='42', group=GROUP_3)
var colorMa7Dow   = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='42', group=GROUP_3)

var bool showMa8  = input.bool(defval=true, title='MA 8?', inline='44', group=GROUP_3)
var int lenMa8    = input.int(defval=40, title='Length', inline='44', minval=2, group=GROUP_3)
var colorMa8Up    = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='44', group=GROUP_3)
var colorMa8Dow   = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='44', group=GROUP_3)

var bool showMa9  = input.bool(defval=true, title='MA 9?', inline='46', group=GROUP_3)
var int lenMa9    = input.int(defval=45, title='Length', inline='46', minval=2, group=GROUP_3)
var colorMa9Up    = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='46', group=GROUP_3)
var colorMa9Dow   = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='46', group=GROUP_3)

var bool showMa10 = input.bool(defval=true, title='MA 10?', inline='48', group=GROUP_3)
var int lenMa10   = input.int(defval=50, title='Length', inline='48', minval=2, group=GROUP_3)
var colorMa10Up   = input.color(defval=color.new(#00A3FF, 0), title='', tooltip='', inline='48', group=GROUP_3)
var colorMa10Dow  = input.color(defval=color.new(#FFC200, 0), title='', tooltip='', inline='48', group=GROUP_3)
// ------------------------- }

// ------------------------- Normalization {
fNormalize(series float src, simple int len, simple float _lowerEnd, simple float _upperEnd) =>
    min = ta.lowest(source=src, length=len)
    max = ta.highest(source=src, length=len)
    valueNormal = _lowerEnd + ( (src - min) * (_upperEnd - _lowerEnd)/(max - min) )
// ------------------------- }

// ------------------------- Moving Average {
fCalcMa(series float src, simple string type, simple int len) =>
    maRet = switch type
        SMA => ta.sma(src, len)
        EMA => ta.ema(src, len)
        HMA => ta.hma(src, len)
        ALMA => ta.alma(src, len, 0.85, 6, false)
        MEDIAN => ta.median(src, len)
        VWAP => ta.vwap(src)
// ------------------------- }

// ------------------------- Standard Deviation {
float stDev = ta.stdev(source, len)
stDev := boolSmooth ? fCalcMa(stDev, typeMaSmooth, lenSmooth) : stDev

// Normalization
stDevNormalized = normalize ? fNormalize(src=stDev, len=lenNormal, _lowerEnd=0, _upperEnd=100) : stDev

// Moving Averages of StDev
float maStDev1  = showMa1  ? fCalcMa(stDevNormalized, typeMa, lenMa1)  : na
float maStDev2  = showMa2  ? fCalcMa(stDevNormalized, typeMa, lenMa2)  : na
float maStDev3  = showMa3  ? fCalcMa(stDevNormalized, typeMa, lenMa3)  : na
float maStDev4  = showMa4  ? fCalcMa(stDevNormalized, typeMa, lenMa4)  : na
float maStDev5  = showMa5  ? fCalcMa(stDevNormalized, typeMa, lenMa5)  : na
float maStDev6  = showMa6  ? fCalcMa(stDevNormalized, typeMa, lenMa6)  : na
float maStDev7  = showMa7  ? fCalcMa(stDevNormalized, typeMa, lenMa7)  : na
float maStDev8  = showMa8  ? fCalcMa(stDevNormalized, typeMa, lenMa8)  : na
float maStDev9  = showMa9  ? fCalcMa(stDevNormalized, typeMa, lenMa9)  : na
float maStDev10 = showMa10 ? fCalcMa(stDevNormalized, typeMa, lenMa10) : na
// ------------------------- }

// ------------------------- Colors {
fSetColor (value) =>
    if themeSt == 'User' or themeSt == 'Deep Purple'
        if value < maStDev1 and
          value < maStDev2 and 
          value < maStDev3 and
          value < maStDev4 and
          value < maStDev5 and
          value < maStDev6 and
          value < maStDev7 and
          value < maStDev8 and
          value < maStDev9 and
          value < maStDev10
            themeSt == 'User' ? colorBellowMa : PURPLE
        else
            themeSt == 'User' ? colorAboveMa : LIME
    else
        if normalize
            if themeSt == 'Spectrum Blue-Green-Red'
                array.get ( arrayColorBGR, math.round ( value ) )
            else if themeSt == 'Spectrum Blue-Red'
                array.get ( arrayColorBR, math.round ( value ) )
        else
            if value < maStDev1 and
              value < maStDev2 and 
              value < maStDev3 and
              value < maStDev4 and
              value < maStDev5 and
              value < maStDev6 and
              value < maStDev7 and
              value < maStDev8 and
              value < maStDev9 and
              value < maStDev10
                colorBellowMa
            else
                colorAboveMa
// ------------------------- }

// ------------------------- Plots {
colorStDev = fSetColor(stDevNormalized)

color colorMa1  = na
color colorMa2  = na
color colorMa3  = na
color colorMa4  = na
color colorMa5  = na
color colorMa6  = na
color colorMa7  = na
color colorMa8  = na
color colorMa9  = na
color colorMa10 = na

if themeSt == 'User'
    colorMa1  := stDevNormalized > maStDev1 ? colorMa1Up : colorMa1Dow
    colorMa2  := maStDev1 > maStDev2  ? colorMa2Up : colorMa2Dow
    colorMa3  := maStDev2 > maStDev3  ? colorMa3Up : colorMa3Dow
    colorMa4  := maStDev3 > maStDev4  ? colorMa4Up : colorMa4Dow
    colorMa5  := maStDev4 > maStDev5  ? colorMa5Up : colorMa5Dow
    colorMa6  := maStDev5 > maStDev6  ? colorMa6Up : colorMa6Dow
    colorMa7  := maStDev6 > maStDev7  ? colorMa7Up : colorMa7Dow
    colorMa8  := maStDev7 > maStDev8  ? colorMa8Up : colorMa8Dow
    colorMa9  := maStDev8 > maStDev9  ? colorMa9Up : colorMa9Dow
    colorMa10 := maStDev9 > maStDev10 ? colorMa10Up : colorMa10Dow
else if themeSt == 'Deep Purple'
    colorMa1  := stDevNormalized > maStDev1 ? LIME : PURPLE
    colorMa2  := maStDev1 > maStDev2  ? LIME : PURPLE
    colorMa3  := maStDev2 > maStDev3  ? LIME : PURPLE
    colorMa4  := maStDev3 > maStDev4  ? LIME : PURPLE
    colorMa5  := maStDev4 > maStDev5  ? LIME : PURPLE
    colorMa6  := maStDev5 > maStDev6  ? LIME : PURPLE
    colorMa7  := maStDev6 > maStDev7  ? LIME : PURPLE
    colorMa8  := maStDev7 > maStDev8  ? LIME : PURPLE
    colorMa9  := maStDev8 > maStDev9  ? LIME : PURPLE
    colorMa10 := maStDev9 > maStDev10 ? LIME : PURPLE 
else
    if normalize
        if themeSt == 'Spectrum Blue-Green-Red'
            colorMa1  := array.get ( arrayColorBGR, math.round ( maStDev1 ) )
            colorMa2  := array.get ( arrayColorBGR, math.round ( maStDev2 ) )
            colorMa3  := array.get ( arrayColorBGR, math.round ( maStDev3 ) )
            colorMa4  := array.get ( arrayColorBGR, math.round ( maStDev4 ) )
            colorMa5  := array.get ( arrayColorBGR, math.round ( maStDev5 ) )
            colorMa6  := array.get ( arrayColorBGR, math.round ( maStDev6 ) )
            colorMa7  := array.get ( arrayColorBGR, math.round ( maStDev7 ) )
            colorMa8  := array.get ( arrayColorBGR, math.round ( maStDev8 ) )
            colorMa9  := array.get ( arrayColorBGR, math.round ( maStDev9 ) )
            colorMa10 := array.get ( arrayColorBGR, math.round ( maStDev10 ) )
        else if themeSt == 'Spectrum Blue-Red'
            colorMa1  := array.get ( arrayColorBR, math.round ( maStDev1 ) )
            colorMa2  := array.get ( arrayColorBR, math.round ( maStDev2 ) )
            colorMa3  := array.get ( arrayColorBR, math.round ( maStDev3 ) )
            colorMa4  := array.get ( arrayColorBR, math.round ( maStDev4 ) )
            colorMa5  := array.get ( arrayColorBR, math.round ( maStDev5 ) )
            colorMa6  := array.get ( arrayColorBR, math.round ( maStDev6 ) )
            colorMa7  := array.get ( arrayColorBR, math.round ( maStDev7 ) )
            colorMa8  := array.get ( arrayColorBR, math.round ( maStDev8 ) )
            colorMa9  := array.get ( arrayColorBR, math.round ( maStDev9 ) )
            colorMa10 := array.get ( arrayColorBR, math.round ( maStDev10 ) )
    else
        colorMa1  := stDevNormalized > maStDev1 ? colorMa1Up : colorMa1Dow
        colorMa2  := maStDev1 > maStDev2  ? colorMa2Up : colorMa2Dow
        colorMa3  := maStDev2 > maStDev3  ? colorMa3Up : colorMa3Dow
        colorMa4  := maStDev3 > maStDev4  ? colorMa4Up : colorMa4Dow
        colorMa5  := maStDev4 > maStDev5  ? colorMa5Up : colorMa5Dow
        colorMa6  := maStDev5 > maStDev6  ? colorMa6Up : colorMa6Dow
        colorMa7  := maStDev6 > maStDev7  ? colorMa7Up : colorMa7Dow
        colorMa8  := maStDev7 > maStDev8  ? colorMa8Up : colorMa8Dow
        colorMa9  := maStDev8 > maStDev9  ? colorMa9Up : colorMa9Dow
        colorMa10 := maStDev9 > maStDev10 ? colorMa10Up : colorMa10Dow    

stDevPlot = plot(stDevNormalized, color=colorStDev, linewidth=3, title='Standard Deviation')
stDevMaPlot1  = plot(maStDev1, color=colorMa1,  linewidth=1, title='Moving Average 1')
stDevMaPlot2  = plot(maStDev2, color=colorMa2,  linewidth=1, title='Moving Average 2')
stDevMaPlot3  = plot(maStDev3, color=colorMa3,  linewidth=1, title='Moving Average 3')
stDevMaPlot4  = plot(maStDev4, color=colorMa4,  linewidth=1, title='Moving Average 4')
stDevMaPlot5  = plot(maStDev5, color=colorMa5,  linewidth=1, title='Moving Average 5')
stDevMaPlot6  = plot(maStDev6, color=colorMa6,  linewidth=1, title='Moving Average 6')
stDevMaPlot7  = plot(maStDev7, color=colorMa7,  linewidth=1, title='Moving Average 7')
stDevMaPlot8  = plot(maStDev8, color=colorMa8,  linewidth=1, title='Moving Average 8')
stDevMaPlot9  = plot(maStDev9, color=colorMa9,  linewidth=1, title='Moving Average 9')
stDevMaPlot10 = plot(maStDev10, color=colorMa10, linewidth=1, title='Moving Average 10')

crossUp = ta.crossover(source1=stDevNormalized, source2=maStDev1)
crossDown = ta.crossunder(source1=stDevNormalized, source2=maStDev1)

// -- Cross
plotshape(showMarkers and crossUp ? stDevNormalized : na, title="Crossover", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(#3af13c,0))
plotshape(showMarkers and crossDown ? stDevNormalized : na, title="Crossunder", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(#ff0000, 0))
// ------------------------- }

Overview

Up to ten moving averages of the standard deviation can be drawn, with markers where it crosses the first one. Several color themes, including spectrum gradients, are selectable. Length, smoothing type and normalization lookback are adjustable.

Details

Published by

andreperez on GitHub

Type

Indicator, Pine Script v5

Draws

Separate pane below the chart

Category

Volatility & bands

Markets

Any symbol

Timeframes

Any timeframe

Risk Notes

No repainting, lookahead or stacked entries were found in its code or README. That says nothing about how well it works: test it first.

Topics

pinescriptpinescript-algorithmspinescript-indicatorsstandard-deviationtechnical-analysistradingtradingview

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Sourcesourceclosesource
Lengthint55len
Smooth indicator?booltrueboolSmooth
TypestringALMAtypeMaSmooth
Lengthint5lenSmooth
Normalize?booltruenormalize
Lengthint200lenNormal
ThemestringSpectrum Blue-Green-RedthemeSt
Standard Deviationcolorcolor.new(#00A3FF, 0)colorAboveMa
colorBellowMacolorcolor.new(#FFC200, 0)colorBellowMa
Type of Moving AveragesstringALMAtypeMa
Show markers when cross MA 1?booltrueshowMarkers
Show all 40 settings
SettingTypeDefaultVariable
MA 1?booltrueshowMa1
Lengthint5lenMa1
colorMa1Upcolorcolor.new(#00A3FF, 0)colorMa1Up
colorMa1Dowcolorcolor.new(#FFC200, 0)colorMa1Dow
MA 2?booltrueshowMa2
Lengthint10lenMa2
colorMa2Upcolorcolor.new(#00A3FF, 0)colorMa2Up
colorMa2Dowcolorcolor.new(#FFC200, 0)colorMa2Dow
MA 3?booltrueshowMa3
Lengthint15lenMa3
colorMa3Upcolorcolor.new(#00A3FF, 0)colorMa3Up
colorMa3Dowcolorcolor.new(#FFC200, 0)colorMa3Dow
MA 4?booltrueshowMa4
Lengthint20lenMa4
colorMa4Upcolorcolor.new(#00A3FF, 0)colorMa4Up
colorMa4Dowcolorcolor.new(#FFC200, 0)colorMa4Dow
MA 5?booltrueshowMa5
Lengthint25lenMa5
colorMa5Upcolorcolor.new(#00A3FF, 0)colorMa5Up
colorMa5Dowcolorcolor.new(#FFC200, 0)colorMa5Dow
MA 6?booltrueshowMa6
Lengthint30lenMa6
colorMa6Upcolorcolor.new(#00A3FF, 0)colorMa6Up
colorMa6Dowcolorcolor.new(#FFC200, 0)colorMa6Dow
MA 7?booltrueshowMa7
Lengthint35lenMa7
colorMa7Upcolorcolor.new(#00A3FF, 0)colorMa7Up
colorMa7Dowcolorcolor.new(#FFC200, 0)colorMa7Dow
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

This indicator calculates the distribution of close-to-close percentage changes using rate of change on closing prices. It bins percentage changes into intervals of 0.25 percent increments from negative to positive values and plots a normalized cumulative hist

Indicator v4 Volatility & bands
Updated 11 days ago · GPL-3.0 GitHub repository of Close-to-Close % Change Distribution

This indicator plots a Supertrend-based trend-following setup in a separate pane and skips conditions it treats as a sideways market. A volatility range is built from an ATR value, with RMA, SMA, EMA, or WMA smoothing, or from a fixed point distance. Optional

Indicator v5 TrendVolatility & bands
Updated 1 year ago · MPL-2.0 GitHub repository of Trend Following Setup - Sideways Market Skipper
330 stars

This indicator plots candle range and open-to-close movement as percentages in a separate pane. Range is the high-low difference divided by the low, and change is the close-open difference divided by the open. Both series draw as columns. Teal columns show ran

Indicator v5 Volatility & bands
Updated 2 months ago · None stated GitHub repository of Percent & Volatility [Alorse]

Mojito v3 Strategy

by namuan
318 stars

The Mojito v3 Strategy indicator evaluates volatility term structure by calculating the ratio between front-month and second-month VIX futures contracts. It smooths this ratio using a configurable median filter and compares the result against user-defined uppe

Indicator v5 Volatility & bands
Updated 2 months ago · MIT GitHub repository of Mojito v3 Strategy

Function - Logistic Equation

by ricardosantos79
261 stars

Calculates dynamic modeling values by applying a mathematical logistic differential equation to price change over a specified lookback length. It measures price momentum relative to the recent high-low price range. The script plots positive and negative logist

Indicator v5 Oscillators & momentumVolatility & bands
Updated 4 years ago · None stated GitHub repository of Function - Logistic Equation

MACD-V

by harryguiacorn
219 stars

MACD-V is a volatility-normalized momentum indicator based on research by Alex Spiroglou. It calculates the standard MACD histogram and normalizes it by dividing by the Average True Range (ATR). Plotted in a separate pane as a colored histogram, it includes us

Indicator v5 Oscillators & momentumVolatility & bands
Updated 1 year ago · None stated GitHub repository of MACD-V

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers