Stoch script
unknown
plain_text
2 years ago
7.3 kB
41
Indexable
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Capitulation2023
//@version=5
// ---------------------------------------------------------------------------------------------- //
indicator("Clean Stoch on chart", "Clean - Stoch on chart", true, max_lines_count = 300, max_boxes_count = 300, max_bars_back = 300)
group_ocs = 'Plotting Settings - General ================'
oscLookbackLength = input.int(150, 'Display Length', minval = 10, step = 10, maxval = 300, group=group_ocs)
oscPlacement = input.string('Bottom', 'Placement', options = ['Top', 'Bottom'], group=group_ocs)
oscHight = 11 - input.int(7, 'Hight' , minval = 1, maxval = 10 , group=group_ocs )
oscVerticalOffset = input.int(3, "Vertical Offset", minval = -3, maxval = 10, group=group_ocs) / 10
highlight = input.bool(true, "Highlight Stoch/Signal Area")
highlightBreakouts = input(title='Highlight Overbought/Oversold Breakouts ?', defval=true)
highlightCrossovers = input(title='Highlight SMI/Signal Crossovers ?', defval=true)
group_macd = 'MACD Settings =============================='
//macdFastLength = input.int(12, "Fast Length", minval = 1, group=group_macd)
//macdSlowLength = input.int(26, "Slow Length", minval = 1, group=group_macd)
macdSource = input(close , "Source", group=group_macd)
macdSignalLength = input.int(12 , "Signal Smoothing", minval = 1, maxval = 50 , group=group_macd)
macdSourceMA = input.string("EMA", "Oscillator MA Type" , options=["SMA", "EMA"], group=group_macd)
macdSignalMA = input.string("EMA", "Signal Line MA Type", options=["SMA", "EMA"], group=group_macd)
q = input.int(title='Stochastic Lookback', defval=13, minval=1)
r = input.int(title='1st Smoothing Length', defval=25, minval=1)
s = input.int(title='2nd Smoothing Length', defval=2, minval=1)
src = input(title='Source', defval=close)
group_stoch = 'Stochastic Settings =========================='
//stochPeriodK = input.int(14, "%K Length", minval=1, group=group_stoch)
//stochSmoothK = input.int(1 , "%K Smoothing", minval=1, group=group_stoch)
//stochPeriodD = input.int(3 , "%D Smoothing", minval=1, group=group_stoch)
stochUpperBand = input.int(40, 'Upper Band', group=group_stoch)
stochLowerBand = input.int(-40, 'Lower Band', group=group_stoch)
stochUpperBandMax = input.int(75, 'Max Upper Band', group=group_stoch)
stochLowerBandMin = input.int(-75, 'Min Lower Band', group=group_stoch)
// Inputs -------------------------------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------- //
// Calculations -------------------------------------------------------------------------------- //
hh = ta.highest(q)
ll = ta.lowest(q)
numerator = ta.ema(ta.ema(src - 0.5 * (hh + ll), r), s)
denominator = 0.5 * ta.ema(ta.ema(hh - ll, r), s)
smi = 100 * numerator / denominator
signal = ta.ema(smi, macdSignalLength)
hist = smi - signal
histColor = hist >= 0 ? hist[1] < hist ? #26A69A : #B2DFDB : hist[1] < hist ? #FFCDD2 : #EF5350
// Plotting ------------------------------------------------------------------------------------ //
var a_lines = array.new_line()
var a_hist = array.new_box()
var a_fill = array.new_linefill()
priceHighest = ta.highest(high, oscLookbackLength)
priceLowest = ta.lowest (low , oscLookbackLength)
priceChangeRate = (priceHighest - priceLowest) / priceHighest
priceLowest := priceLowest * (1 - priceChangeRate * oscVerticalOffset)
priceHighest := priceHighest * (1 + priceChangeRate * oscVerticalOffset)
oscHighest = ta.highest(smi, oscLookbackLength)
hight = priceChangeRate / oscHight
if barstate.islast
if array.size(a_lines) > 0
for i = 1 to array.size(a_lines)
line.delete(array.shift(a_lines))
if array.size(a_hist) > 0
for i = 1 to array.size(a_hist)
box.delete(array.shift(a_hist))
if array.size(a_fill) > 0
for i = 1 to array.size(a_fill)
linefill.delete(array.shift(a_fill))
for barIndex = 0 to oscLookbackLength - 1
if array.size(a_lines) < 498
array.push(a_hist , box.new (bar_index[barIndex], oscPlacement == 'Top' ? priceHighest : priceLowest,
bar_index[barIndex], (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + hist[barIndex] / oscHighest * hight), histColor[barIndex], 2))
array.push(a_lines, line.new(bar_index[barIndex], (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + smi[barIndex] / oscHighest * hight),
bar_index[barIndex + 1], (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + smi[barIndex + 1] / oscHighest * hight), xloc.bar_index, extend.none, color.green, line.style_solid, 1))
array.push(a_lines, line.new(bar_index[barIndex], (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + signal[barIndex] / oscHighest * hight),
bar_index[barIndex + 1], (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + signal[barIndex + 1] / oscHighest * hight), xloc.bar_index, extend.none, color.red, line.style_solid, 1))
if highlight
array.push(a_fill, linefill.new(array.get(a_lines, 2 * barIndex), array.get(a_lines, 2 * barIndex + 1), smi[barIndex] > signal[barIndex] and highlightBreakouts ? color.new(color.green,50) : color.new(color.red,50)))
//
obLevel = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + stochUpperBand / oscHighest * hight)
osLevel = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + stochLowerBand / oscHighest * hight)
obLevelMax = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + stochUpperBandMax / oscHighest * hight)
osLevelMin = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + stochLowerBandMin / oscHighest * hight)
array.push(a_lines, line.new(bar_index[oscLookbackLength], obLevel , bar_index, obLevel , xloc.bar_index, extend.none, color.green, line.style_dotted, 2))
array.push(a_lines, line.new(bar_index[oscLookbackLength], osLevel , bar_index, osLevel , xloc.bar_index, extend.none, color.red, line.style_dotted, 2))
array.push(a_lines, line.new(bar_index[oscLookbackLength], obLevelMax , bar_index, obLevelMax , xloc.bar_index, extend.none, color.green, line.style_solid, 2))
array.push(a_lines, line.new(bar_index[oscLookbackLength], osLevelMin , bar_index, osLevelMin , xloc.bar_index, extend.none, color.red, line.style_solid, 2))
//array.push(a_fill, linefill.new(array.get(a_lines, 0), array.get(a_lines, 1), fillColor))
//midLevel = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + midLine / oscHighest * hight)
//array.push(a_lines, line.new(bar_index[oscLookbackLength], midLevel , bar_index, midLevel , xloc.bar_index, extend.none, color.new(color.gray, 50) ,line.style_dashed, 1))
// Plotting ------------------------------------------------------------------------------------ //Editor is loading...