Stochastic Momentum Index (SMI) of Money Flow Index (MFI)

andre_007 · study · 404 行 · 点赞 4,911 · TradingView 原页

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

Pine Script

// @version=5
// @Author andre_007
// @Thanks and credits: 
//      - TradingView and PineCoders: for SMI, Moving Averages and MFI
//      - allanster: for Dynamic Zones
// @description Stochastic Momentum Index (SMI) of Money Flow Index (MFI).
// The Stochastic Momentum Index (SMI) is a technical analysis indicator that uses the difference between the current 
// closing price and the high or low price over a specific time period to measure price momentum. On the other hand, 
// the Money Flow Index (MFI) is an indicator that uses volume and price to measure buying and selling pressure. 
// When these two indicators are combined, they can provide a more comprehensive view of price direction and market strength.
indicator(title="Stochastic Momentum Index (SMI) of Money Flow Index (MFI)", shorttitle="SMI MFI", format=format.price, precision=2, timeframe="", timeframe_gaps=true)
 
import andre_007/MomentumIndicators/1 as MI
import andre_007/Utils/5 as UTIL
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Constants
 
var string TYPE_MA_TOOLTIP = '1 - Simple Moving Average\n' + 
 '2 - Exponential Moving Average\n' + 
 '3 - Weighted Moving Average\n' + 
 '4 - Volume Weighted Moving Average\n' + 
 '5 - Arnaud Legoux Moving Average\n' + 
 '6 - Hull Moving Average\n' + 
 '7 - Least Squares Moving Average\n' + 
 '8 - Relative Moving Average\n' + 
 '9 - Median'
 
var string THEME_TOOLTIP_TSI = '0 = User defined\n' +
  '1 = Spectrum Blue-Green-Red\n' +
  '2 = Monokai\n' +
  '3 = Green\n' +
  '4 = Purple\n' +
  '5 = Blue\n' +
  '6 = Red\n' +
  '7 = Green-Purple\n' +
  '8 = Blue-Red\n' +
  '9 = Blue-Yellow\n' +
  '10 = User defined with gradient'
 
var string THEME_TOOLTIP_HISTOGRAM = '0 = User defined\n' +
  '1 = Spectrum Blue-Green-Red\n' +
  '2 = Monokai\n' +
  '3 = Green\n' +
  '4 = Purple\n' +
  '5 = Blue\n' +
  '6 = Red\n' +
  '7 = Green-Purple\n' +
  '8 = Blue-Red\n' +
  '9 = Blue-Yellow'
 
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Inputs
 
mfiSourceInput = input.source(hl2, "Source", group="MFI Settings")
var mfiLengthInput = input.int(14, minval=1, title="MFI Length", group="MFI Settings")
 
// #region SMI
var string GRP_SMI = 'Stochastic Momentum Index'
var stochLongLen = input.int(13, minval=1, title="TSI Long Length", group=GRP_SMI, inline='TSI')
var stochShortLen = input.int(8, minval=1, title="TSI Short Length", group=GRP_SMI, inline='TSI')
var stochSigLen = input.int(8, minval=1, title="Signal Length", group=GRP_SMI, inline='Signal')
var int maTypeTSI = input.int(defval=2, title='Type of Smoothing (TSI)', options=[1, 2, 3, 4, 5, 6, 7, 8, 9], tooltip=TYPE_MA_TOOLTIP, group=GRP_SMI, inline='Smooth1')
var int maTypeSignal = input.int(defval=2, title='Type of Smoothing (Signal)', options=[1, 2, 3, 4, 5, 6, 7, 8, 9], tooltip=TYPE_MA_TOOLTIP, group=GRP_SMI, inline='Smooth2')
// #endregion
 
// #region Theme for TSI
var string GRP_THEME_TSI = 'Theme for TSI'
var int themeStoch_1 = input.int(defval=1, title='Theme',
  options=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], inline='61', group=GRP_THEME_TSI, tooltip=THEME_TOOLTIP_TSI)  
var color colorUpStoch_1 = input.color(color.new(color.blue, 0), title='Bull', group=GRP_THEME_TSI, inline='61')
var color colorDownStoch_1 = input.color(color.new(#ff1000, 0), title='Bear', group=GRP_THEME_TSI, inline='61')
var int opacityStoch_1 = input.int(0, minval=0, maxval=100, inline='61', title='Opacity', group=GRP_THEME_TSI)
// #endregion
 
// #region Theme for Stoch Signal
var string GRP_THEME_SIGNAL = 'Theme for Signal'
var int themeStoch_2 = input.int(defval=0, title='Theme',
  options=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], inline='63', group=GRP_THEME_SIGNAL, tooltip=THEME_TOOLTIP_TSI)
var color colorUpStoch_2 = input.color(color.new(color.blue, 0), title='Bull', group=GRP_THEME_SIGNAL, inline='63')
var color colorDownStoch_2 = input.color(color.new(#ff1000, 0), title='Bear', group=GRP_THEME_SIGNAL, inline='63')
var int opacityStoch_2 = input.int(0, minval=0, maxval=100, inline='63', title='Opacity', group=GRP_THEME_SIGNAL)
var int opacityStoch_3 = input.int(50, minval=0, maxval=100, inline='64', title='Opacity for fill', group=GRP_THEME_SIGNAL)
// #endregion
 
// #region Theme for Histogram above 0
var string GRP_THEME_HISTOGRAM_ABOVE = 'Theme for Histogram above 0'
var int themeHistoP = input.int(defval=0, title='Theme',
  options=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], inline='1', group='Theme for Histogram above 0', tooltip=THEME_TOOLTIP_HISTOGRAM)  
var colorHistogramUp_1 = input(color.new(#0064bb, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_ABOVE)
var colorHistogramUp_2 = input(color.new(#007ce9, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_ABOVE)
var colorHistogramUp_3 = input(color.new(#1893ff, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_ABOVE)
var colorHistogramUp_4 = input(color.new(#46a9ff, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_ABOVE)
var colorHistogramUp_5 = input(color.new(#75beff, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_ABOVE)
var colorHistogramUp_6 = input(color.new(#91c9fa, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_ABOVE)
// #endregion
 
// #region Theme for Histogram below 0
var string GRP_THEME_HISTOGRAM_BELOW = 'Theme for Histogram below 0'
var int themeHistoN = input.int(defval=0, title='Theme',
  options=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], inline='1', group='Theme for Histogram below 0')  
var colorHistogramDown_1 = input(color.new(#8e1031, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_BELOW)
var colorHistogramDown_2 = input(color.new(#be1642, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_BELOW)
var colorHistogramDown_3 = input(color.new(#e62356, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_BELOW)
var colorHistogramDown_4 = input(color.new(#eb527a, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_BELOW)
var colorHistogramDown_5 = input(color.new(#f1829f, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_BELOW)
var colorHistogramDown_6 = input(color.new(#f395ae, 0), "", inline="2", group=GRP_THEME_HISTOGRAM_BELOW)
// #endregion
 
// #region Dynamic Zone
var string GRP_DZ = 'Dynamic Zones'
var int dataSmple = input.int(defval=200, title="Sample Length", minval=1, group=GRP_DZ, inline='1')
var float pcntAbove = input.float(defval=90, title="High is Above X% of Sample", minval=0, maxval=100, step=1.0, group=GRP_DZ, inline='2')
var float pcntBelow = input.float(defval=90, title="Low is Below X% of Sample", minval=0, maxval=100, step=1.0, group=GRP_DZ, inline='2')
 
var lineDzoneTop = input.color(#7e58c0, 'Upper Line of Dynamic Zone', inline='3', group=GRP_DZ)
var lineDzoneBottom = input.color(#7e58c0, 'Lower Line of Dynamic Zone', inline='3', group=GRP_DZ)
var fillDzoneAbove = input.color(color.new(#3064fc, 50), 'Fill outside of DZone when above', inline='4', group=GRP_DZ)
var fillDzoneAbove2 = input.color(color.new(#3064fc, 80), 'Fill entire chart when above', inline='4', group=GRP_DZ)
var fillDzoneInside = input.color(color.new(#7e58c0, 95), 'Dynamic Zone', inline='5', group=GRP_DZ)
var fillDzoneBelow = input.color(color.new(#f03449, 50), 'Fill outside of DZone when below', inline='6', group=GRP_DZ)
var fillDzoneBelow2 = input.color(color.new(#f03449, 80), 'Fill entire chart when below', inline='6', group=GRP_DZ)
 
var string centerLineOptA = 'Center of Dynamic Zone (x = 50%)'
var string centerLineOptB = '50'
var string centerLine = input.string(defval=centerLineOptA, title='Center Line', options=[centerLineOptA, centerLineOptB], group=GRP_DZ, inline='7')
var color lineDzoneCenter = input.color(color.new(color.orange, 0), 'Center Line', inline='7', group=GRP_DZ)
var int lineDzoneCenterDensity = input.int(defval=2, title='Density', options=[1, 2, 3, 4, 5], inline='7', group=GRP_DZ, tooltip='Density for line.\n' + 
  '1 = 100% density (continuous line)\n' + 
  '2 = Dotted line flashing every 2 bars\n' + 
  '3 = Dotted line flashing every 3 bars\n' + 
  '4 = Dotted line flashing every 4 bars\n' + 
  '5 = Dotted line flashing every 5 bars')
// #endregion
 
// #region Cross Alerts
var string CROSS_ALERTS = 'Cross Alerts'
var string showAlerts    = input.string(title='Show alerts for cross?', defval='Show alerts with shape', options=['Don\'t show alerts', 'Show alerts with char', 'Show alerts with shape'], group=CROSS_ALERTS, inline='A')
var color colorAlertBull = input.color(color.new(#5b9cf6, 0), title='Bull', group=CROSS_ALERTS, inline='B')
var color colorAlertBear = input.color(color.new(#f77c80, 0), title='Bear', group=CROSS_ALERTS, inline='B')
 
var topAlertLine = input.int(50, title='Above', inline='B', group=CROSS_ALERTS)
var bottomAlertLine = input.int(-50, title='Below', inline='B', group=CROSS_ALERTS, tooltip='When Stochastic Oscillator above or below this levels' )
 
var showBarColorsCross = input.bool(true, title='Colorize bars?', group=CROSS_ALERTS, inline='C')
var color colorBarSignal = input.color(color.new(color.yellow, 0), title='', group=CROSS_ALERTS, inline='C')
// #endregion
 
// #region Trend Alerts
var string TREND_ALERTS = 'Trend Alerts'
var showBarColorsTrendHisto = input.bool(true, title='Colorize bars for histogram?', group=TREND_ALERTS, inline='A')
var color colorBarTrendBullHisto = input.color(color.new(color.blue, 0), title='', group=TREND_ALERTS, inline='A')
var color colorBarTrendBearHisto = input.color(color.new(#ff1000, 0), title='', group=TREND_ALERTS, inline='A', tooltip='When Histogram above or below 0')
var barColorsTrendHistoTheme = input.bool(true, title='Use same theme of Histogram?', group=TREND_ALERTS, inline='B', tooltip='Only applies when the above checkbox is checked')
 
var showBarColorsTrendTSI = input.bool(false, title='Colorize bars for TSI?', group=TREND_ALERTS, inline='C')
var color colorBarTrendBullTSI = input.color(color.new(color.blue, 0), title='', group=TREND_ALERTS, inline='C')
var color colorBarTrendBearTSI = input.color(color.new(#ff1000, 0), title='', group=TREND_ALERTS, inline='C', tooltip='When TSI above or below Signal')
var barColorsTrendTsiTheme = input.bool(false, title='Use same theme of TSI?', group=TREND_ALERTS, inline='D', tooltip='Only applies when the above checkbox is checked')
var showBarColorsTrendSignal = input.bool(false, title='Colorize bars for Signal?', group=TREND_ALERTS, inline='E')
var color colorBarTrendBullSignal = input.color(color.new(color.blue, 0), title='', group=TREND_ALERTS, inline='E')
var color colorBarTrendBearSignal = input.color(color.new(#ff1000, 0), title='', group=TREND_ALERTS, inline='E', tooltip='When Signal above or below TSI')
var barColorsTrendSignalTheme = input.bool(false, title='Use same theme of Signal?', group=TREND_ALERTS, inline='F', tooltip='Only applies when the above checkbox is checked')
// #endregion
 
// #region Custom Levels for TSI\'s Theme
var int level1TSI = input.int(defval=15, title="Level 1", minval=1, group='Custom Levels for TSI\'s Theme', inline='1')
var int level2TSI = input.int(defval=30, title="Level 2", minval=1, group='Custom Levels for TSI\'s Theme', inline='1')
var int level3TSI = input.int(defval=45, title="Level 3", minval=1, group='Custom Levels for TSI\'s Theme', inline='1')
var int level4TSI = input.int(defval=60, title="Level 4", minval=1, group='Custom Levels for TSI\'s Theme', inline='2')
var int level5TSI = input.int(defval=75, title="Level 5", minval=1, group='Custom Levels for TSI\'s Theme', inline='2')
// #endregion
 
// #region Custom Levels for Signal\'s Theme
var int level1Signal = input.int(defval=15, title="Level 1", minval=1, group='Custom Levels for Signal\'s Theme', inline='1')
var int level2Signal = input.int(defval=30, title="Level 2", minval=1, group='Custom Levels for Signal\'s Theme', inline='1')
var int level3Signal = input.int(defval=45, title="Level 3", minval=1, group='Custom Levels for Signal\'s Theme', inline='1')
var int level4Signal = input.int(defval=60, title="Level 4", minval=1, group='Custom Levels for Signal\'s Theme', inline='2')
var int level5Signal = input.int(defval=75, title="Level 5", minval=1, group='Custom Levels for Signal\'s Theme', inline='2')
// #endregion
 
// #region Custom Levels for Histogram\'s Theme
var int level1Histogram = input.int(defval=5, title="Level 1", minval=1, group='Custom Levels for Histogram\'s Theme', inline='1')
var int level2Histogram = input.int(defval=10, title="Level 2", minval=1, group='Custom Levels for Histogram\'s Theme', inline='1')
var int level3Histogram = input.int(defval=15, title="Level 3", minval=1, group='Custom Levels for Histogram\'s Theme', inline='1')
var int level4Histogram = input.int(defval=20, title="Level 4", minval=1, group='Custom Levels for Histogram\'s Theme', inline='2')
var int level5Histogram = input.int(defval=25, title="Level 5", minval=1, group='Custom Levels for Histogram\'s Theme', inline='2')
// #endregion
 
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Calculations
 
[tsi, signal, histogram] = MI.smiMFI(source=mfiSourceInput, length=mfiLengthInput, shortLengthTSI=stochShortLen, longLengthTSI=stochLongLen, maTypeTSI=maTypeTSI, maTypeSignal=maTypeSignal, smoothingLengthSignal=stochSigLen)
 
// Dynamic Zones
dZoneAbove = ta.percentile_nearest_rank(tsi, dataSmple, pcntAbove)
dZoneBelow = ta.percentile_nearest_rank(tsi, dataSmple, 100 - pcntBelow)
dZoneCenter = ta.percentile_nearest_rank(tsi, dataSmple, 100 - 50)
 
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Theme for Histogram
 
vcHistogram = UTIL.valueColorSpectrum.new()    
 
vcHistogram.currentValue         := histogram
vcHistogram.previousValue        := histogram[1]
 
UTIL.setCustomLevels(vcHistogram, level1Histogram, level2Histogram, level3Histogram, level4Histogram, level5Histogram)
 
if histogram >= 0         
    UTIL.setTheme(vcHistogram, themeHistoP)
    if themeHistoP == 0
        UTIL.setTheme(vcHistogram, colorHistogramUp_1, colorHistogramUp_2, colorHistogramUp_3, colorHistogramUp_4, colorHistogramUp_5, colorHistogramUp_6)
else        
    UTIL.setTheme(vcHistogram, themeHistoN)
    if themeHistoN == 0
        UTIL.setTheme(vcHistogram, colorHistogramDown_1, colorHistogramDown_2, colorHistogramDown_3, colorHistogramDown_4, colorHistogramDown_5, colorHistogramDown_6)
 
UTIL.setCurrentColorValue(vcHistogram)
color colorHistogram = vcHistogram.currentColorValue
 
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Theme for Oscillator
 
color colorStoch = if (themeStoch_1 != 0) and (themeStoch_1 != 10)       // Theme with 5 colors
    
    vcOscillator = UTIL.valueColorSpectrum.new()
    UTIL.setCustomLevels(vcOscillator, level1TSI, level2TSI, level3TSI, level4TSI, level5TSI)
    
    vcOscillator.currentValue         := tsi
    vcOscillator.previousValue        := tsi[1]
 
    UTIL.setTheme(vcOscillator, themeStoch_1)
    UTIL.setCurrentColorValue(vcOscillator)
    color.new(vcOscillator.currentColorValue, opacityStoch_1)
 
else                                                                    // Theme with 2 colors ('User' or 'Gradient')
    
    vcOscillator = UTIL.valueColor.new()
    
    vcOscillator.currentValue     := tsi
    vcOscillator.previousValue    := tsi[1]
    vcOscillator.colorUp          := colorUpStoch_1
    vcOscillator.colorDown        := colorDownStoch_1
    
    UTIL.setCurrentColorValue(vcOscillator, (themeStoch_1 == 10))
    color.new(vcOscillator.currentColorValue, opacityStoch_1)
 
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Theme for Signal
 
color colorMaStoch = if (themeStoch_2 != 0) and (themeStoch_2 != 10)     // Theme with 5 colors
    
    vcSignal = UTIL.valueColorSpectrum.new()
    UTIL.setCustomLevels(vcSignal, level1Signal, level2Signal, level3Signal, level4Signal, level5Signal)
    
    vcSignal.currentValue         := signal
    vcSignal.previousValue        := signal[1]
 
    UTIL.setTheme(vcSignal, themeStoch_2)
    UTIL.setCurrentColorValue(vcSignal)
    color.new(vcSignal.currentColorValue, opacityStoch_2)
 
else                                                                    // Theme with 2 colors ('User' or 'Gradient')
    
    vcSignal = UTIL.valueColor.new()
    
    vcSignal.currentValue     := signal
    vcSignal.previousValue    := signal[1]
    vcSignal.colorUp          := colorUpStoch_2
    vcSignal.colorDown        := colorDownStoch_2
    
    UTIL.setCurrentColorValue(vcSignal, (themeStoch_2 == 10))
    color.new(vcSignal.currentColorValue, opacityStoch_2)
 
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Theme for fill between Oscillator and Signal
 
color colorFill = if (themeStoch_2 != 0) and (themeStoch_2 != 10)        // Theme with 5 colors
    
    vcFillOscillator = UTIL.valueColorSpectrum.new()
    UTIL.setCustomLevels(vcFillOscillator, level1Signal, level2Signal, level3Signal, level4Signal, level5Signal)
    
    vcFillOscillator.currentValue         := tsi
    vcFillOscillator.previousValue        := signal
 
    UTIL.setTheme(vcFillOscillator, themeStoch_2)
 
    UTIL.setCurrentColorValue(vcFillOscillator)
    color.new(vcFillOscillator.currentColorValue, opacityStoch_3)
 
else                                                                    // Theme with 2 colors ('User' or 'Gradient')
    
    vcFillOscillator = UTIL.valueColor.new()
    
    vcFillOscillator.currentValue     := tsi
    vcFillOscillator.previousValue    := signal
    vcFillOscillator.colorUp          := colorUpStoch_2
    vcFillOscillator.colorDown        := colorDownStoch_2
    
    UTIL.setCurrentColorValue(vcFillOscillator, (themeStoch_2 == 10))    
    color.new(vcFillOscillator.currentColorValue, opacityStoch_3)
 
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Plots
 
// #region Stoch
p_tsi = plot(tsi, title="TSI", color=colorStoch, linewidth=2)
p_signal = plot(signal, title="Signal", color=colorMaStoch)
fill(p_tsi, p_signal, color=colorFill, title='Fill beetween Stoch and Signal', display=(opacityStoch_3 < 100 ? display.all : display.none) )
// #endregion
 
// #region Histogram
plot(histogram, color=colorHistogram, style=plot.style_histogram, title="SMI Ergodic Histogram")
// #endregion
 
// #region Dynamic Zones
hline(0, color = lineDzoneCenter, title="Fixed Center Line", linewidth=1, linestyle=hline.style_dashed, display=(centerLine==centerLineOptB ? display.all : display.none))
plot(dZoneCenter, title="Dynamic Zone: Center Line", color=UTIL.getPeriodicColor(lineDzoneCenter, lineDzoneCenterDensity), linewidth=1, style=plot.style_line, display=(centerLine==centerLineOptA ? display.all : display.none))
 
above     = plot(tsi > dZoneAbove ? tsi : dZoneAbove, title = "", color = color(na))
probOB    = plot(dZoneAbove, title = "Dynamic Zone: Top Line", color = lineDzoneTop, linewidth=1)
probOS    = plot(dZoneBelow, title = "Dynamic Zone: Bottom Line", color = lineDzoneBottom, linewidth=1)
below     = plot(tsi < dZoneBelow ? tsi : dZoneBelow, title = "", color = color(na))
 
fill(above,  probOB, color = fillDzoneAbove)
fill(probOB, probOS, color = fillDzoneInside)
fill(below,  probOS, color = fillDzoneBelow)
 
top = hline(100, "Top", color=color.red, linestyle=hline.style_solid, display=display.none)
bottom = hline(-100, "Bottom", color=color.blue, linestyle=hline.style_solid, display=display.none)
fill(top, bottom, tsi < dZoneBelow ? fillDzoneBelow2 : na, 'Fill background when below Dynamic Zone', display=display.all)
fill(top, bottom, tsi > dZoneAbove ? fillDzoneAbove2 : na, 'Fill background when above Dynamic Zone', display=display.all)
// #endregion
 
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Trend Alerts
 
_barcolor = (showBarColorsTrendHisto and (histogram >= 0) ? (barColorsTrendHistoTheme ? colorHistogram : colorBarTrendBullHisto) : na)
_barcolor := (showBarColorsTrendHisto and (histogram < 0) ? (barColorsTrendHistoTheme ? colorHistogram : colorBarTrendBearHisto) : _barcolor)
 
_barcolor := (showBarColorsTrendTSI and (tsi >= signal) ? (barColorsTrendTsiTheme ? colorStoch : colorBarTrendBullTSI) : _barcolor)
_barcolor := (showBarColorsTrendTSI and (tsi < signal) ? (barColorsTrendTsiTheme ? colorStoch : colorBarTrendBearTSI) : _barcolor)
 
_barcolor := (showBarColorsTrendSignal and (tsi >= signal) ? (barColorsTrendSignalTheme ? colorMaStoch : colorBarTrendBullSignal) : _barcolor)
_barcolor := (showBarColorsTrendSignal and (tsi < signal) ? (barColorsTrendSignalTheme ? colorMaStoch : colorBarTrendBearSignal) : _barcolor)
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
 
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— {
// #region Cross Alerts
 
bool crossUp = (tsi <= bottomAlertLine or signal <= bottomAlertLine) and ta.crossover(tsi, signal)
bool crossDown = (tsi >= topAlertLine or signal >= topAlertLine) and ta.crossunder(tsi, signal)
 
alertcondition(crossUp, title="Crossing upper line of Dynamic Zone", message="Stoch crossing Dynamic Zones above: Long\nSymbol: {{ticker}}\nPrice: {{close}}")
alertcondition(crossDown, title="Crossing down line of Dynamic Zone", message="Stoch crossing Dynamic Zones below: Long\nSymbol: {{ticker}}\nPrice: {{close}}")
 
plotchar(showAlerts == 'Show alerts with char' ? crossUp : na, title="Crossing up char", char='↑', location=location.bottom, color=colorAlertBull, size=size.small, offset=0)
plotchar(showAlerts == 'Show alerts with char' ? crossDown : na, title="Crossing down char",char='↓', location=location.top, color=colorAlertBear, size=size.small, offset=0)
 
plotshape(showAlerts == 'Show alerts with shape' and crossUp ? signal : na, title="Crossing up shape", location=location.absolute, style=shape.circle, size=size.tiny, color=colorAlertBull, offset=0)
plotshape(showAlerts == 'Show alerts with shape' and crossDown ? signal : na, title="Crossing down shape", location=location.absolute, style=shape.circle, size=size.tiny, color=colorAlertBear, offset=0)
 
_barcolor := (showBarColorsCross and (crossUp or crossDown) ? colorBarSignal : _barcolor)
 
// #endregion
// ———————————————————————————————————————————————————————————————————————————————————————————————————————————— }
 
barcolor(_barcolor)

← 返回列表