本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。
// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
// © EliCobra
//@version=5
indicator("Standardized SuperTrend Oscillator", "{Ʌ} - Super Osc.", false)
type bar
float o = open
float h = high
float l = low
float c = close
type supertrend
float s = na
int d = na
float u = na
float l = na
method ha(bar b, simple bool p = true) =>
var bar x = bar.new()
x.c := (b.o + b.h + b.l + b.c) / 4
x := bar.new(
na(x.o[1]) ? (b.o + b.c) / 2 : (nz(x.o[1]) + nz(x.c[1])) / 2,
math.max(b.h, math.max(x.o, x.c)),
math.min(b.l, math.min(x.o, x.c)),
x.c)
p ? x : b
method hl2(bar b) =>
math.avg(b.h, b.l)
method oc2(bar b) =>
math.avg(b.o, b.c)
method atr(bar b, simple int len) =>
float tr =
na(b.h[1]) ?
b.h - b.l :
math.max(
math.max(
b.h - b.l,
math.abs(b.h - b.c[1])),
math.abs (b.l - b.c[1]))
len == 1 ? tr : ta.rma(tr, len)
method st(bar b, simple float factor, simple int len) =>
float atr = b.atr(len)
float up = b.hl2( ) + factor * atr
up := up < nz(up[1]) or b.c[1] > nz(up[1]) ? up : nz(up[1])
float dn = b.hl2( ) - factor * atr
dn := dn > nz(dn[1]) or b.c[1] < nz(dn[1]) ? dn : nz(dn[1])
float st = na
int dir = na
dir := switch
na(atr[1]) => 1
st[1] == nz(up[1]) => dir := b.c > up ? -1 : 1
=> dir := b.c < dn ? 1 : -1
st := dir == -1 ? dn : up
supertrend.new(st, dir, up, dn)
method sso(bar b, supertrend st, simple int len) =>
float std = ta.ema(st.u - st.l, len) / 100
bar x = bar.new(
(b.o - st.s) / std,
(b.h - st.s) / std,
(b.l - st.s) / std,
(b.c - st.s) / std)
x
var string tp = 'Source for SuperTrend -\n\n∙ On-> Heikin-Ashi candles\n∙ Off-> Regular candles'
var string g1 = "Oscillator Settings", var string g2 = "SuperTrend of Oscillator", var string gu = "UI Options"
base = input.bool (false , "Heikin-Ashi Source", tp , group = g1)
len1 = input.int (10 , "Length" , inline = '1', group = g1)
mlt1 = input.float (5. , "Factor" , 1, 10, 0.5 , inline = '1', group = g1)
len2 = input.int (10 , "Length" , inline = '2', group = g2)
mlt2 = input.float (3. , "Factor" , 1, 10, 0.5 , inline = '2', group = g2)
osc = input.string('Candles', "Oscillator Style" , ['Candles', 'Line'] , group = gu)
d_st = input.bool (true , "SuperTrend Of Osc.", group = gu)
d_rt = input.bool (true , "Reversion Tracer" , group = gu)
rlbl = input.string('None' , "Reversion Signals", ['None', 'OB' , 'OS' , 'Both'], group = gu)
clbl = input.string('None' , "Contrarian Signals", ['None', 'Buy', 'Sell', 'Both'], group = gu)
bar b = bar.new( ).ha(base)
supertrend t1 = b .st (mlt1 , len1)
bar sso = b .sso(t1 , len1).ha( )
supertrend t2 = sso.st (mlt2 , len2)
float rvt = ta .rsi(-t1.d, len1) * 2 - 100
var color colup = #22ab94
var color coldn = #ffdab9
var color colvt = #daa520
var color colut = color.new(#22ab94 , 60 )
var color coldt = color.new(#f23645 , 60 )
var color trnsp = color.new(chart.bg_color, 100)
color col = switch
sso.c > sso.o => colup
sso.c < sso.o => coldn
color cst = switch t2.d
1 => #ff4800
-1 => #1582ff
color cso = switch
sso.c > rvt and sso.c > 0 => #22ab94
sso.c < rvt and sso.c < 0 => #f23645
=> chart.fg_color
plotcandle(osc == 'Candles' ? sso.o : na, sso.h, sso.l, sso.c, 'SSO', col, col, bordercolor = col)
h = hline(0 , 'Mid-Line', chart.fg_color, hline.style_dotted)
o = plot (osc == 'Line' ? sso.c : na, 'SSO' , cso , 1, plot.style_line )
t = plot (d_st and t2.d > 0 ? t2.s : na, 'Bear ST' , cst , 1, plot.style_linebr )
d = plot (d_st and t2.d < 0 ? t2.s : na, 'Bull ST' , cst , 1, plot.style_linebr )
u = plot (d_rt and rvt > 0 ? rvt : na, 'Upper RT', colvt , 1, plot.style_linebr )
l = plot (d_rt and rvt < 0 ? rvt : na, 'Lower RT', colvt , 1, plot.style_linebr )
c = plot (osc == 'Candles' ? sso.oc2() : na, '' , display = display.none )
m = plot (0 , '' , display = display.none )
fill(m, o, 10 * mlt1, 10 , colut, trnsp)
fill(m, o, 10 , -10 * mlt1, trnsp, coldt)
fill(t, c, #ff480010)
fill(d, c, #1582ff10)
bool scon = (clbl == 'Sell' or clbl == 'Both') and math.sign (ta.change(t2.d)) == 1 ? true : false
bool bcon = (clbl == 'Buy' or clbl == 'Both') and math.sign (ta.change(t2.d)) == -1 ? true : false
bool ucon = (rlbl == 'OB' or rlbl == 'Both') and ta.crossover (sso.c, rvt < 0 ? rvt : na) ? true : false
bool dcon = (rlbl == 'OS' or rlbl == 'Both') and ta.crossunder(sso.c, rvt > 0 ? rvt : na) ? true : false
plotshape(scon ? t2.s + 5 : na, 'Sell Signal', shape.labeldown, location.absolute, #ff480075, 0, '𝓢' , chart.fg_color)
plotshape(bcon ? t2.s - 5 : na, 'Buy Signal' , shape.labelup , location.absolute, #1582ff75, 0, '𝓑' , chart.fg_color)
plotshape(dcon ? rvt + 15 : na, 'OB Signal' , shape.labeldown, location.absolute, #f2364575, 0, '𝓞𝓑', chart.fg_color)
plotshape(ucon ? rvt - 15 : na, 'OS Signal' , shape.labelup , location.absolute, #22ab9475, 0, '𝓞𝓢', chart.fg_color)