A collection of free Pine Script indicators for your charts. Pick one, copy the code or download the file, and add it to TradingView in seconds. Use them, tweak them however you like.
Three adaptive Gann medians (12, 27 and 56 periods) combined with the HiLo Activator and volume-spike detection. It helps you spot trend shifts and exhaustion zones right on your chart.
Open any chart and launch the Pine Editor at the bottom.
Create a new indicator, clear the content and paste the script.
Hit Save, then "Add to chart". Done.
//@version=4
study("Gann medians", overlay = true, max_bars_back=300)
method1 = input("Median", options=["EMA", "Median", "SMA"])
length1 = input(12)
mult1 = input(1, minval=0, maxval=1)
method2 = input("Median", options=["EMA", "Median", "SMA"])
length2 = input(27)
mult2 = input(1, minval=0, maxval=1)
method3 = input("Median", options=["EMA", "Median", "SMA"])
length3 = input(56)
mult3 = input(1, minval=0, maxval=1)
//----
Avg(x, length, method) =>
sma_1 = sma(x, length)
ema_1 = ema(x, length)
percentile_linear_interpolation_1 = percentile_linear_interpolation(x, length, 50)
method == "SMA" ? sma_1 :
method == "EMA" ? ema_1 : percentile_linear_interpolation_1
//----
a1 = highest(length1) - max(close, open)
b1 = min(close, open) - lowest(length1)
c1 = max(close, open) + a1 * mult1
d1 = min(close, open) - b1 * mult1
a2 = highest(length2) - max(close, open)
b2 = min(close, open) - lowest(length2)
c2 = max(close, open) + a2 * mult2
d2 = min(close, open) - b2 * mult2
a3 = highest(length3) - max(close, open)
b3 = min(close, open) - lowest(length3)
c3 = max(close, open) + a3 * mult3
d3 = min(close, open) - b3 * mult3
//----
e1 = Avg(c1, length1, method1)
f1 = Avg(d1, length1, method1)
g1 = 0
cross_1 = cross(close, f1)
g1 := cross(close, e1) ? 1 : cross_1 ? 0 : nz(g1[1])
e2 = Avg(c2, length2, method2)
f2 = Avg(d2, length2, method2)
g2 = 0
cross_2 = cross(close, f2)
g2 := cross(close, e2) ? 1 : cross_2 ? 0 : nz(g2[1])
e3 = Avg(c3, length3, method3)
f3 = Avg(d3, length3, method3)
g3 = 0
cross_3 = cross(close, f3)
g3 := cross(close, e3) ? 1 : cross_3 ? 0 : nz(g3[1])
//---
hilo1 = g1 * f1 + (1 - g1) * e1
css1 = g1 == 1 ? color.green : color.red
plot(hilo1, color=css1, style=plot.style_line, show_last=1, linewidth=1, transp=0, trackprice=true)
hilo2 = g2 * f2 + (1 - g2) * e2
css2 = g2 == 1 ? color.green : color.red
plot(hilo2, color=css2, style=plot.style_line, show_last=1, linewidth=1, transp=0, trackprice=true)
hilo3 = g3 * f3 + (1 - g3) * e3
css3 = g3 == 1 ? color.green : color.red
plot(hilo3, color=css3, style=plot.style_line, show_last=1, linewidth=1, transp=0, trackprice=true)
//end of this part
//@version=4
//study(title="HiLo Activator", overlay=true)
length = input(3, minval=1)
displace = input(0, minval=0)
highsma = sma(high, length)
lowsma = sma(low, length)
swing = iff(close > highsma[displace], 1, iff(close < lowsma[displace], -1, 0))
mah = highest(high, length)
mal = lowest(low, length)
var stop = 0.0
stop := iff(swing==1, mal, iff(swing==-1, mah, stop[1]))
linecolor = iff(stop < low, color.green, color.red)
plot(stop)
//end of this part
//study(title="TrapTrading (Study)", overlay=true)
// input
counterTrend = input(defval=false, title="Trade Mode (ON: Counter Trend OFF: Trend Following)", type=input.bool)
len1 = input(defval=20, title="Period (1-200)", type=input.integer, minval=1, maxval=200)
multiple = input(defval=0.7, title="Multiple", type=input.float)
m1 = close - close[len1]
lowest_1 = lowest(abs(m1), len1)
highest_1 = highest(abs(m1), len1)
controlPoint = counterTrend ? lowest_1 == abs(m1) : highest_1 == abs(m1)
baseLine = valuewhen(controlPoint, avg(close, close[len1]), 0)
// trap line
atr = valuewhen(controlPoint, highest(max(max(atr(len1), atr(len1 * 2)), atr(len1 * 3)), len1), 0)
line1Up = baseLine + atr * multiple
line2Up = baseLine + atr * 2 * multiple
line3Up = baseLine + atr * 3 * multiple
line4Up = baseLine + atr * 4 * multiple
line5Up = baseLine + atr * 5 * multiple
line6Up = baseLine + atr * 6 * multiple
line7Up = baseLine + atr * 7 * multiple
line8Up = baseLine + atr * 8 * multiple
line9Up = baseLine + atr * 9 * multiple
line10Up = baseLine + atr * 10 * multiple
line1Down = baseLine - atr * multiple
line2Down = baseLine - atr * 2 * multiple
line3Down = baseLine - atr * 3 * multiple
line4Down = baseLine - atr * 4 * multiple
line5Down = baseLine - atr * 5 * multiple
line6Down = baseLine - atr * 6 * multiple
line7Down = baseLine - atr * 7 * multiple
line8Down = baseLine - atr * 8 * multiple
line9Down = baseLine - atr * 9 * multiple
line10Down = baseLine - atr * 10 * multiple
// draw
//barcolor(controlPoint ? color.yellow : close >= baseLine ? color.teal : color.red, title="Candle Color")
// find which bar is 5 days away from the current time
milliseconds_in_5days = 1000 * 60 * 60 * 24 * 1 // millisecs * secs * min * hours * days
leftborder = (timenow - time) < milliseconds_in_5days // true or na when false
rightborder = barstate.islast
plot(baseLine, title="Base Line", color=color.purple, linewidth=1, style=plot.style_stepline, transp=0, trackprice=true)
//plot(leftborder?line1Up:na, title="1Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line2Up:na, title="2Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line3Up:na, title="3Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line4Up:na, title="4Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line5Up:na, title="5Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line6Up:na, title="6Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line7Up:na, title="7Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line8Up:na, title="8Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line9Up:na, title="9Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line10Up:na, title="10Up Line", color=color.red, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line1Down:na, title="1Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line2Down:na, title="2Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line3Down:na, title="3Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line4Down:na, title="4Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line5Down:na, title="5Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line6Down:na, title="6Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line7Down:na, title="7Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line8Down:na, title="8Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line9Down:na, title="9Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//plot(leftborder?line10Down:na, title="10Down Line", color=color.green, linewidth=1, style=plot.style_stepline, transp=0)
//end of this part
upperMult = input(title="Upper Deviation", defval=2)
lowerMult = input(title="Lower Deviation", defval=-2)
useUpperDev = input(title="Use Upper Deviation", defval=true)
useLowerDev = input(title="Use Lower Deviation", defval=true)
showPearson = input(title="Show Pearson's R", defval=true)
extendLines = input(title="Extend Lines", defval=false)
len = input(title="Count", defval=100)
src = input(title="Source", defval=close)
extend = extendLines ? extend.right : extend.none
calcSlope(src, len) =>
if not barstate.islast or len <= 1
[float(na), float(na), float(na)]
else
sumX = 0.0
sumY = 0.0
sumXSqr = 0.0
sumXY = 0.0
for i = 0 to len - 1
val = src[i]
per = i + 1.0
sumX := sumX + per
sumY := sumY + val
sumXSqr := sumXSqr + per * per
sumXY := sumXY + val * per
slope = (len * sumXY - sumX * sumY) / (len * sumXSqr - sumX * sumX)
average = sumY / len
intercept = average - slope * sumX / len + slope
[slope, average, intercept]
[s, aLR, i] = calcSlope(src, len)
startPrice = i + s * (len - 1)
endPrice = i
var line baseLineLR = na
if na(baseLineLR) and not na(startPrice)
baseLineLR := line.new(bar_index - len + 1, startPrice, bar_index, endPrice, width=4, extend=extend, color=color.red)
else
line.set_xy1(baseLineLR, bar_index - len + 1, startPrice)
line.set_xy2(baseLineLR, bar_index, endPrice)
na
calcDev(src, len, slope, average, intercept) =>
upDev = 0.0
dnDev = 0.0
stdDevAcc = 0.0
dsxx = 0.0
dsyy = 0.0
dsxy = 0.0
periods = len - 1
daY = intercept + (slope * periods) / 2
val = intercept
for i = 0 to periods
price = high[i] - val
if (price > upDev)
upDev := price
price := val - low[i]
if (price > dnDev)
dnDev := price
price := src[i]
dxt = price - average
dyt = val - daY
price := price - val
stdDevAcc := stdDevAcc + price * price
dsxx := dsxx + dxt * dxt
dsyy := dsyy + dyt * dyt
dsxy := dsxy + dxt * dyt
val := val + slope
stdDev = sqrt(stdDevAcc / (periods == 0 ? 1 : periods))
pearsonR = dsxx == 0 or dsyy == 0 ? 0 : dsxy / sqrt(dsxx * dsyy)
[stdDev, pearsonR, upDev, dnDev]
[stdDev, pearsonR, upDev, dnDev] = calcDev(src, len, s, aLR, i)
upperStartPrice = startPrice + (useUpperDev ? upperMult * stdDev : upDev)
upperEndPrice = endPrice + (useUpperDev ? upperMult * stdDev : upDev)
var line upper = na
lowerStartPrice = startPrice + (useLowerDev ? lowerMult * stdDev : -dnDev)
lowerEndPrice = endPrice + (useLowerDev ? lowerMult * stdDev : -dnDev)
var line lower = na
if na(upper) and not na(upperStartPrice)
upper := line.new(bar_index - len + 1, upperStartPrice, bar_index, upperEndPrice, width=4, extend=extend, color=#0000ff)
else
line.set_xy1(upper, bar_index - len + 1, upperStartPrice)
line.set_xy2(upper, bar_index, upperEndPrice)
na
if na(lower) and not na(lowerStartPrice)
lower := line.new(bar_index - len + 1, lowerStartPrice, bar_index, lowerEndPrice, width=4, extend=extend, color=#0000ff)
else
line.set_xy1(lower, bar_index - len + 1, lowerStartPrice)
line.set_xy2(lower, bar_index, lowerEndPrice)
na
// Pearson's R
var label r = na
transparent = color.new(color.white, 100)
label.delete(r[1])
if showPearson and not na(pearsonR)
r := label.new(bar_index - len + 1, lowerStartPrice, tostring(pearsonR, "#.################"), color=transparent, textcolor=#0000ff, size=size.normal, style=label.style_labelup)
//end of this part
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(10, "Backtest Start Month")
testStartDay = input(20, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testStartMin = input(0, "Backtest Start Minute")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,testStartMin)
testStopYear = input(2099, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
lenH = input(title='Length High', type=input.integer, defval=20, minval=1)
lenL = input(title='Length Low', type=input.integer, defval=20, minval=1)
fun(src, len, isHigh, _style, _yloc, _color) =>
p = nz(src[len])
isFound = true
for i = 0 to len * 2
if isHigh and src[i] > p
isFound := false
if not isHigh and src[i] < p
isFound := false
if isFound and testPeriod()
label.new(bar_index[len], p, tostring(p), style=_style, yloc=_yloc, color=_color)
line.new(bar_index[len], p, bar_index, p, extend=extend.right, color=_color)
fun(high, lenH, true, label.style_labeldown, yloc.abovebar, color.red)
fun(low, lenL, false, label.style_labelup, yloc.belowbar, color.green)
//end of this part
price = input(type=input.source, defval=ohlc4)
// Strategy vars setup here
Depth = input(56, title="Depth") // Depth
Deviation = input(5, title="Deviation") // Deviation
// main logic
// ZigZag
lastlow = 0.0, lasthigh = 0.0
lastlow := nz(lastlow[1])
lasthigh := nz(lasthigh[1])
data(x) =>
d = security(syminfo.tickerid, timeframe.period, x, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_on)
d
getLow(x, y, z, a) =>
lastlow = y
v = data(x)
m = v==lastlow or data(z) - v > a*syminfo.mintick
if v!=lastlow
lastlow := v
if m
v := 0.0
[v,lastlow]
getHigh(x, y, z, a) =>
lasthigh = y
v = data(x)
m = v==lasthigh or v - data(z) > a*syminfo.mintick
if v!=lasthigh
lasthigh := v
if m
v := 0.0
[v,lasthigh]
[v,e] = getLow(lowest(Depth), lastlow, low, Deviation)
lastlow := e
zBB = v != 0.0
[v1,ee1] = getHigh(highest(Depth), lasthigh, high, Deviation)
lasthigh := ee1
zSS = v1 != 0.0
zigzagDirection = -1
zigzagHigh = 0
zigzagLow = 0
zigzagDirection := zBB ? 0 : zSS ? 1 : nz(zigzagDirection[1], -1)
virtualLow = zigzagLow[1] + 1
if not zBB or (zBB and zigzagDirection == zigzagDirection[1] and low > low[virtualLow])
zigzagLow := nz(zigzagLow[1]) + 1
virtualHigh = zigzagHigh[1] + 1
if not zSS or (zSS and zigzagDirection == zigzagDirection[1] and high < high[virtualHigh])
zigzagHigh := nz(zigzagHigh[1]) + 1
a=bar_index-zigzagLow
b=bar_index-zigzagHigh
var color c = na, c := fixnan(a < b[1] ? color.lime : a > b[1] ? color.red : na)
//barcolor(color=color.lime)
line zigzag = line.new(bar_index-zigzagLow, low[zigzagLow], bar_index-zigzagHigh, high[zigzagHigh], color=c, style=line.style_solid, width=4)
if (zigzagDirection == zigzagDirection[1])
line.delete(zigzag[1])
l = label.new(bar_index-zigzagHigh, na)
label.set_text(l, "Sell")
label.set_color(l, color.red)
label.set_yloc(l, yloc.abovebar)
label.set_style(l, label.style_labeldown)
if (zigzagDirection == zigzagDirection[1])
label.delete(l[1])
l_b = label.new(bar_index-zigzagLow, na)
label.set_text(l_b, "Buy")
label.set_color(l_b, color.green)
label.set_yloc(l_b, yloc.belowbar)
label.set_style(l_b, label.style_labelup)
if (zigzagDirection == zigzagDirection[1])
label.delete(l_b[1])
zzPrevHigh = zigzagHigh[1]
zzPrevLow = zigzagLow[1]
if not na(zzPrevHigh[1])
zzPrevHigh := zzPrevHigh[1] + 1
if not na(zzPrevLow[1])
zzPrevLow := zzPrevLow[1] + 1
if zigzagDirection != zigzagDirection[1]
if zigzagDirection == 1
zzPrevHigh := zigzagHigh[1] + 1
if zigzagDirection == 0
zzPrevLow := zigzagLow[1] + 1
//end of this part
// RSI Settings for user
rsiSource = input(title="RSI Source", type=input.source, defval=close)
rsiLength = input(title="RSI Length", type=input.integer, defval=7)
rsiOverbought = input(title="RSI Overbought", type=input.integer, defval=70, minval=50, maxval=100)
rsiOvesold = input(title="RSI Oversold", type=input.integer, defval=30, minval=1, maxval=50)
// RSI value based on inbuilt RSI
rsiValue = rsi(rsiSource, rsiLength)
// Get the current state
isOverbought = rsiValue >= rsiOverbought
isOversold = rsiValue <= rsiOvesold
// State of the last extreme 0 for initialization, 1 = overbought, 2 = oversold
var laststate = 0
// Highest and Lowest prices since the last state change
var hh = low
var ll = high
// Labels
var label labelll = na
var label labelhh = na
// Swing lines
var line line_up = na
var line line_down = na
// We go from overbought straight to oversold NEW DRAWINGS CREATED HERE
if(laststate == 1 and isOversold)
ll := low
labelll := label.new(bar_index, low, style=label.style_label_up, color=color.green, size=size.tiny)
labelhh_low = label.get_x(labelhh)
labelhh_pos = label.get_y(labelhh)
line_down := line.new(bar_index, high, labelhh_low, labelhh_pos, width=2)
// We go from oversold straight to overbought NEW DRAWINGS CREATED HERE
if(laststate == 2 and isOverbought)
hh := high
labelhh := label.new(bar_index, high, style=label.style_label_down, color=color.red, size=size.tiny)
labelll_low = label.get_x(labelll)
labelll_pos = label.get_y(labelll)
line_up := line.new(bar_index, high, labelll_low, labelll_pos, width=2)
// If we are overbought
if(isOverbought)
if(high >= hh)
hh := high
label.set_x(labelhh, bar_index)
label.set_y(labelhh, high)
line.set_x1(line_up, bar_index)
line.set_y1(line_up, high)
laststate := 1
// If we are oversold
if(isOversold)
if(low <= ll)
ll := low
label.set_x(labelll, bar_index)
label.set_y(labelll, low)
line.set_x1(line_down, bar_index)
line.set_y1(line_down, low)
laststate := 2
// If last state was overbought and we are overbought
if(laststate == 1 and isOverbought)
if(hh <= high)
hh := high
label.set_x(labelhh, bar_index)
label.set_y(labelhh, high)
line.set_x1(line_up, bar_index)
line.set_y1(line_up, high)
//If we are oversold and the last state was oversold, move the drawings to the lowest price
if(laststate == 2 and isOversold)
if(low <= ll)
ll := low
label.set_x(labelll, bar_index)
label.set_y(labelll, low)
line.set_x1(line_down, bar_index)
line.set_y1(line_down, low)
// If last state was overbought
if(laststate == 1)
if(hh <= high)
hh := high
label.set_x(labelhh, bar_index)
label.set_y(labelhh, high)
line.set_x1(line_up, bar_index)
line.set_y1(line_up, high)
// If last stare was oversold
if(laststate == 2)
if(ll >= low)
ll := low
label.set_x(labelll, bar_index)
label.set_y(labelll, low)
line.set_x1(line_down, bar_index)
line.set_y1(line_down, low)
//end of this part
//@version=4
//study("momentum zigzag", overlay = true)
lengthZZZ = input(10, title = "High/Low length")
hZZZ = highest(high, lengthZZZ * 2 + 1)
lZZZ = lowest(low, lengthZZZ * 2 + 1)
f_isMin(len) =>
lZZZ == low[len]
f_isMax(len) =>
hZZZ == high[len]
var dirUp = false
var lastLow = high * 100
var lastHigh = 0.0
var timeLow = bar_index
var timeHigh = bar_index
var line li = na
f_drawLine() =>
_li_color = dirUp ? color.gray : color.gray
line.new(
timeHigh - lengthZZZ, lastHigh,
timeLow - lengthZZZ, lastLow,
xloc.bar_index, color=_li_color, width=1
)
if dirUp
if (f_isMin(lengthZZZ) and low[lengthZZZ] < lastLow)
lastLow := low[lengthZZZ]
timeLow := bar_index
line.delete(li)
li := f_drawLine()
if (f_isMax(lengthZZZ) and high[lengthZZZ] > lastLow)
lastHigh := high[lengthZZZ]
timeHigh := bar_index
dirUp := false
li := f_drawLine()
if not dirUp
if (f_isMax(lengthZZZ) and high[lengthZZZ] > lastHigh)
lastHigh := high[lengthZZZ]
timeHigh := bar_index
line.delete(li)
li := f_drawLine()
if f_isMin(lengthZZZ) and low[lengthZZZ] < lastHigh
lastLow := low[lengthZZZ]
timeLow := bar_index
dirUp := true
li := f_drawLine()
if (f_isMax(lengthZZZ) and high[lengthZZZ] > lastLow)
lastHigh := high[lengthZZZ]
timeHigh := bar_index
dirUp := false
li := f_drawLine()
//end of this part
use_alt_series = input(defval=false, title='Use alternative source?')
alt_src = input(defval=close, title='Alternative source:')
hSR = use_alt_series ? alt_src : high
lSR = use_alt_series ? alt_src : low
window = input(defval=14, title='lookback window :', type=input.integer)
percent_of_range_for_trade_zone = input(defval=15.0, title='Percent of the range to use for trade zone', type=input.float) * 0.01
short_term_top = valuewhen(hSR >= highest(hSR, window), hSR, 0)
short_term_bot = valuewhen(lSR <= lowest(lSR, window), lSR, 0)
short_term_resist = change(short_term_top) != 0 ? na : short_term_top
short_term_suport = change(short_term_bot) != 0 ? na : short_term_bot
short_term_resist_plot = plot(series=short_term_resist, title='STR', color=color.fuchsia, linewidth=2, style=plot.style_linebr, transp=0)
short_term_suport_plot = plot(series=short_term_suport, title='STS', color=color.aqua, linewidth=2, style=plot.style_linebr, transp=0)
fill(short_term_suport_plot,short_term_resist_plot, color=color.aqua, transp=95, title=" Trade Zone ")
// Calculate entry zone:
float short_term_resist_trade_limit = na
float short_term_suport_trade_limit = na
range = fixnan(short_term_resist) - fixnan(short_term_suport)
if not na(short_term_resist)
if not na(short_term_resist_trade_limit[1])
short_term_resist_trade_limit := short_term_resist_trade_limit[1]
else
short_term_resist_trade_limit := short_term_resist - range * percent_of_range_for_trade_zone
if not na(short_term_suport)
if not na(short_term_suport_trade_limit[1])
short_term_suport_trade_limit := short_term_suport_trade_limit[1]
else
short_term_suport_trade_limit := short_term_suport + range * percent_of_range_for_trade_zone
short_term_resist_trade_limit_plot = plot(series=short_term_resist_trade_limit, title='', color=color.red, linewidth=1, style=plot.style_linebr, transp=0)
short_term_suport_trade_limit_plot = plot(series=short_term_suport_trade_limit, title='', color=color.yellow, linewidth=1, style=plot.style_linebr, transp=0)
//end of this part
lookback = input(defval=20, title="# of Candles to Look Back", type=input.integer)
srcAA = "Close"
pivot_high = iff(srcAA == "Close", pivothigh(high, lookback, lookback), pivothigh(high, lookback, lookback))
pivot_low = iff(srcAA == "Close", pivotlow(low, lookback, lookback), pivotlow(low, lookback, lookback))
plot_high = iff(srcAA == "Close", valuewhen(pivot_high, high[lookback], 0), valuewhen(pivot_high, high[lookback], 0))
plot_low = iff(srcAA == "Close", valuewhen(pivot_low, low[lookback], 0), valuewhen(pivot_low, low[lookback], 0))
resistance = plot(plot_high, style=plot.style_line, title="Resistance Line", color=color.orange, show_last=1, linewidth=2, trackprice=true)
support = plot(plot_low, style=plot.style_line, title="Support Line", color=color.orange, show_last=1, linewidth=2, trackprice=true)
//end of this part
// - INPUTS
ShowPivots = input(true, title="Show Pivot Points")
ShowHHLL = input(true, title="Show HH,LL,LH,HL markers on Pivots Points")
left = input(5, minval=1, title="Pivot Length Left Hand Side")
right = input(5, minval=1, title="Pivot Length Right Hand Side")
//
var barCounter = 0
barCounter := barCounter + 1
f_draw_infopanel(_x, _y, _line, _text)=>
_rep_text = ""
if barstate.islast
for _l = 0 to _line
_rep_text := _rep_text + "\n"
_rep_text := _rep_text + _text
var label _la = na
//a = label.get_text(_la)
label.delete(_la)
_la := label.new(
x=_x, y=_y,
text=_rep_text, xloc=xloc.bar_time, yloc=yloc.price,
color=color.black, style=label.style_labelup, textcolor=color.silver, size=size.small)
// Determine pivots
pvtLenL = left
pvtLenR = right
// Get High and Low Pivot Points
pvthi_ = pivothigh(high, pvtLenL, pvtLenR)
pvtlo_ = pivotlow(low, pvtLenL, pvtLenR)
// Force Pivot completion before plotting.
pvthi = pvthi_
pvtlo = pvtlo_
// ||-----------------------------------------------------------------------------------------------------||
// ||--- Higher Highs, Lower Highs, Higher Lows, Lower Lows -------------------------------------------||
valuewhen_1 = valuewhen(pvthi, high[pvtLenR], 1)
valuewhen_2 = valuewhen(pvthi, high[pvtLenR], 0)
higherhigh = na(pvthi) ? na : valuewhen_1 < valuewhen_2 ? pvthi : na
valuewhen_3 = valuewhen(pvthi, high[pvtLenR], 1)
valuewhen_4 = valuewhen(pvthi, high[pvtLenR], 0)
lowerhigh = na(pvthi) ? na : valuewhen_3 > valuewhen_4 ? pvthi : na
valuewhen_5 = valuewhen(pvtlo, low[pvtLenR], 1)
valuewhen_6 = valuewhen(pvtlo, low[pvtLenR ], 0)
higherlow = na(pvtlo) ? na : valuewhen_5 < valuewhen_6 ? pvtlo : na
valuewhen_7 = valuewhen(pvtlo, low[pvtLenR], 1)
valuewhen_8 = valuewhen(pvtlo, low[pvtLenR ], 0)
lowerlow = na(pvtlo) ? na : valuewhen_7 > valuewhen_8 ? pvtlo : na
// If selected Display the HH/LL above/below candle.
plotshape(ShowHHLL ? higherhigh : na, title='HH', location=location.abovebar, color=color.green, text="HH", offset=-pvtLenR)
plotshape(ShowHHLL ? higherlow : na, title='HL', location=location.belowbar, color=color.green, text="HL", offset=-pvtLenR)
plotshape(ShowHHLL ? lowerhigh : na, title='LH', location=location.abovebar, color=color.red, text="LH", offset=-pvtLenR)
plotshape(ShowHHLL ? lowerlow : na, title='LL', location=location.belowbar, color=color.red, text="LL", offset=-pvtLenR)
useColors = input(title="Fill with colors?",defval=true)
isess = session.regular
t = tickerid(syminfo.prefix, syminfo.ticker, session=isess)
igaps = barmerge.gaps_off
yesterdayHigh = security(t,"D",high[1],gaps=igaps, lookahead=barmerge.lookahead_on)
yesterdayClose = security(t,"D",close[1],gaps=igaps, lookahead=barmerge.lookahead_on)
yesterdayLow = security(t,"D",low[1],gaps=igaps, lookahead=barmerge.lookahead_on)
// Plot the other time frame's data
aH= timeframe.isintraday ? yesterdayHigh : na
cL= timeframe.isintraday ? yesterdayLow: na
up5on = input(true, title="5 Minute Opening Range High")
down5on = input(true, title="5 Minute Opening Range Low")
is_newbar(res) => change(time(res)) != 0
adopt(r, s) => security(syminfo.ticker, r, s)
high_range = valuewhen(is_newbar('D'),high,0)
low_range = valuewhen(is_newbar('D'),low,0)
high_rangeL = valuewhen(is_newbar('D'),high,0)
low_rangeL = valuewhen(is_newbar('D'),low,0)
up5 =up5on ? adopt('5', high_rangeL): na
down5 =down5on ? adopt('5', low_rangeL): na
bColor = #000000
rColor = #ff0a02
sColor = #008f0e
pColor =#0900ff
mColor =color.maroon
myWidthMainLevels = input(title="Line width for Main levels", type=input.integer, defval=1, minval=1)
myStyle = plot.style_circles
//plot(aH, title="H", color=#008f0e, linewidth=myWidthMainLevels, style=myStyle)
//plot(cL, title="L", color=#ff0a02, linewidth=myWidthMainLevels, style=myStyle)
//plot(up5, title="UP", color=#000000, linewidth=myWidthMainLevels, style=myStyle)
//plot(down5, title="DOWN", color=#000000, linewidth=myWidthMainLevels, style=myStyle)
//end of this part
//----- User inputs ---------------------
Lookback1 = input(title="Lookback Left", type=input.integer, defval=200, minval=1)
Lookback2 = input(title="Lookback Right", type=input.integer, defval=0, minval=0)
VertLR = input(title="Show Vertical Left/Right", type=input.bool, defval=true)
VertHL = input(title="Show Vertical Highest/Lowest", type=input.bool, defval=true)
Count = input(title="Show Counts", type=input.bool, defval=true)
FullCount = input(title="Count All Bars", type=input.bool, defval=false)
Fibs = input(title="Show Fib Retrace Lines", type=input.bool, defval=false)
FibsExtHigh = input(title="Show Fib Ext Highs", type=input.bool, defval=false)
FibsExtLow = input(title="Show Fib Ext Lows", type=input.bool, defval=false)
//----- Main ---------------------
// Get left and right endpoints. Though user input says "left" and "right", they are interchangeable.
// The larger number is left, smaller number right.
leftHL = max(Lookback1, Lookback2)
rightHL = min(Lookback1, Lookback2)
// Total num bars. Must be > 0 for highest() and lowest() to work. Add 1 to left bar, if needed.
leftHL := leftHL - rightHL == 0 ? leftHL + 1 : leftHL
lengthHL = leftHL - rightHL
// Highest price, looking back between the left/right endpoints
highBack = highest(high[rightHL], lengthHL)
// Get # of bars back from present bar (offset).
// NOTE: highestbars() returns a negative integer. Thus, subtract the right endpoint to get
// offset from present (right-edge) bar
highOffset = highestbars(high[rightHL], lengthHL) - rightHL
// Lowest price, looking back
lowBack = lowest(low[rightHL], lengthHL)
lowOffset = lowestbars(low[rightHL], lengthHL) - rightHL
// Create a series of timestamps per bar. Needed to determine which bars are at the right edge,
// While "n" starts at zero (left-edge bar) and counts up to the right-edge bar, this timestamp
// (or tick) series counts the other way: max value at the left-edge, counting down to zero
// at the right-edge.
// This tick series is only valid while the indicator loads because "timenow" is the timestamp
// of loading and "time" is the timestamp of a bar. The difference between the two timestamps
// shrinks to zero as the righ-edge bar is processed. After loading, "timenow" and "time" are
// the same value. Thus, "tick" always equals zero as new bars appear. But, for this indicator
// this is sufficient behavior...
tick = round((timenow - time) / change(time)) // Each bar is a tick (float) in the timeline
// Make a boolean mask for bars between left and right endpoints
mask = FullCount ? true : tick < left and tick >= rightHL ? true : false
// Determine the value of n at the left endpoint, used for visual counts of bars in mask
nOffset = float(na)
nOffset := FullCount ? 0 : tick == leftHL ? bar_index : nz(nOffset[1])
// Note: It would be nice to count between the highest/lowest bars, instead of left/right bars,
// but this isn't possible because highOffset and lowOffset are moving around as the
// indicator loads. Thus, "mask" isn't accurate...
//---- Plotting ---------------------
// Horizontal Lines: Highest, Lowest dynamic lines
// Params trackprice and offset make the horizontal line dynamic, adjusting to new highs/lows
plot(highBack, title="Highest", color=color.red, linewidth=2, trackprice=true, offset=-9999)
plot(lowBack, title="Lowest", color=color.green, linewidth=2, trackprice=true, offset=-9999)
// Veritcal Lines
// Use barstate to paint/re-paint vertical lines, as new bars come into the data set.
// islast - True for right most bar in data set. Use this to paint vertical bar, then push it back
// in time with the offset parameter.
// isrealtime - False while indicator loads. True for the right most bar, after loading.
// isconfirmed - False while bar is not closed. True when close price appears.
// isrealtime and isconfirmed - While indicator loads, ignore isconfirmed. After loading, isconfirmed
// turns off the vertical line, as the bar closes. The next (new) bar is painted. This keeps
// the vertical bar moving forward, as new bars appear, erasing the old (previous) vertical bar.
VertLRShow = VertLR ? barstate.isrealtime and barstate.isconfirmed ? false :
barstate.islast ? true : false : false
// Can't use plot() with histogram/column because histbase can't accept "series" values
bgcolor(VertLRShow ? color.gray : na, title="Vertical Left", transp=60, offset=-leftHL + 1)
bgcolor(VertLRShow ? color.gray : na, title="Vertical Right", transp=60, offset=-rightHL)
// Show vertical highest/lowest lines?
VertHLShow = VertHL ? barstate.isrealtime and barstate.isconfirmed ? false :
barstate.islast ? true : false : false
bgcolor(VertHLShow ? color.red : na, title="Vertical Highest", transp=60, offset=highOffset)
bgcolor(VertHLShow ? color.green : na, title="Vertical Lowest", transp=60, offset=lowOffset)
// Fib levels extension and retracement
priceRange = highBack - lowBack
plot(FibsExtHigh ? lowBack + 3.618 * priceRange : na, title="3.618", color=color.lime, linewidth=2, trackprice=true, offset=-9999)
plot(FibsExtHigh ? lowBack + 2.618 * priceRange : na, title="2.618", color=color.lime, linewidth=2, trackprice=true, offset=-9999)
plot(FibsExtHigh ? lowBack + 1.618 * priceRange : na, title="1.618", color=color.lime, linewidth=2, trackprice=true, offset=-9999)
plot(FibsExtHigh ? lowBack + 1.1 * priceRange : na, color=#88888800, trackprice=true, offset=-9999, editable=false) // invisible line to work around pine plot bug
plot(Fibs ? lowBack + 1.1 * priceRange : na, color=#88888800, trackprice=true, offset=-9999, editable=false) // invisible line to work around pine plot bug
plot(Fibs ? lowBack + 0.786 * priceRange : na, title="0.786", color=color.aqua, linewidth=1, trackprice=true, offset=-9999)
plot(Fibs ? lowBack + 0.618 * priceRange : na, title="0.618", color=color.orange, linewidth=2, trackprice=true, offset=-9999)
plot(Fibs ? lowBack + 0.50 * priceRange : na, title="0.5", color=color.yellow, linewidth=2, trackprice=true, offset=-9999)
plot(Fibs ? lowBack + 0.382 * priceRange : na, title="0.382", color=color.orange, linewidth=2, trackprice=true, offset=-9999)
plot(Fibs ? lowBack + 0.236 * priceRange : na, title="0.236", color=color.aqua, linewidth=1, trackprice=true, offset=-9999)
plot(Fibs ? highBack - 1.1 * priceRange : na, color=#88888800, trackprice=true, offset=-9999, editable=false) // invisible line to work around pine plot bug
plot(FibsExtLow ? highBack - 1.1 * priceRange : na, color=#88888800, trackprice=true, offset=-9999, editable=false) // invisible line to work around pine plot bug
plot(FibsExtLow ? highBack - 1.618 * priceRange : na, title="1.618", color=color.fuchsia, linewidth=2, trackprice=true, offset=-9999)
plot(FibsExtLow ? highBack - 2.618 * priceRange : na, title="2.618", color=color.fuchsia, linewidth=2, trackprice=true, offset=-9999)
plot(FibsExtLow ? highBack - 3.618 * priceRange : na, title="3.618", color=color.fuchsia, linewidth=2, trackprice=true, offset=-9999)
// Lookback bar count
countMod = mask ? (bar_index - nOffset) % 10 : na
countInt = mask ? floor((bar_index - nOffset) / 10) % 10 : na
plotshape(Count and countMod != 0 ? true : na, style=shape.circle, text="-", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 0 ? true : na, style=shape.circle, text="0", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 1 ? true : na, style=shape.circle, text="1", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 2 ? true : na, style=shape.circle, text="2", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 3 ? true : na, style=shape.circle, text="3", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 4 ? true : na, style=shape.circle, text="4", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 5 ? true : na, style=shape.circle, text="5", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 6 ? true : na, style=shape.circle, text="6", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 7 ? true : na, style=shape.circle, text="7", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 8 ? true : na, style=shape.circle, text="8", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
plotshape(Count and countMod == 0 and countInt == 9 ? true : na, style=shape.circle, text="9", textcolor=color.gray, color=#88888800, location=location.bottom, size=size.auto, editable=false)
//end of this part
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LonesomeTheBlue
//@version=4
//study("Candlestick Reversal System", overlay = true)
pivotlbar = input(defval = 5, title ="Length to Highest/Lowest")
highleftempty = pivothigh(pivotlbar, 0)
lowleftempty = pivotlow(pivotlbar, 0)
// Wick Reversal System
l01 = input(true, title = "Enable Wick Reversal System")
wick_multiplier = input(title = "Wick Multiplier", defval = 2.5, step = 0.5, maxval = 20)
body_percentage = input(title = "Body Percentage", defval = 0.25, step = 0.1, maxval = 1)
O = open
C = close
H = high
L = low
Wlongsignal = (C > O) and (O - L) >= ((C - O) * wick_multiplier) and (H - C) <= ((H - L) * body_percentage) or
(C < O) and (C - L) >= ((O - C) * wick_multiplier) and (H - C) <= ((H - L) * body_percentage) or
(C == O and C != H) and (H - L) >= ((H - C) * wick_multiplier) and (H - C) <= ((H - L) * body_percentage) or
(O == H and C == H) and (H - L) >= sma((H - L), 50)
Wshortsignal = (C < O) and (H - O) >= ((O - C) * wick_multiplier) and (C - L) <= ((H - L) * body_percentage) or
(C > O) and (H - C) >= ((C - O) * wick_multiplier) and (C - L) <= ((H -L) * body_percentage) or
(C == O and C != L) and (H - L) >= ((C - L) * wick_multiplier) and (C - L) <= ((H - L) * body_percentage) or
(O == L and C == L) and (H - L) >= sma((H - L), 50)
// Exteme Reversal System
l02 = input(true, title = "Enable Exteme Reversal System")
bodysize = input(title = "Body Size", defval = 0.525, step = 0.05, maxval = 1)
barsback = input(title = "Bars Back", defval = 50, maxval = 50)
bodymultiplier = input(title = "Body Multiplier", defval = 2, step = 0.25, maxval = 5)
mybodysize = abs(C - O)
AverageBody = sma(mybodysize, barsback)
mycandlesize = (H - L)
AverageCandle = sma(mycandlesize, barsback)
Elongsignal = ((O[1] - C[1]) >= (bodysize * (H[1] - L[1]))) and ((H[1] - L[1]) > (AverageCandle * bodymultiplier)) and ((O[1] - C[1]) > AverageBody) and (C > O)
Eshortsignal = ((C[1] - O[1]) >= (bodysize * (H[1] - L[1]))) and ((H[1] - L[1]) > (AverageCandle * bodymultiplier)) and ((C[1] - O[1]) > AverageBody) and (O > C)
// outside Reversal System
l03 = input(true, title = "Enable Outside Reversal System")
BarMultiplier = input(title = "Body Multiplier", defval = 1.25, step = 0.05, maxval = 3.5)
BarsBack = input(title = "Bars Back", defval = 50, maxval = 250)
AverageCandle1 = sma(mycandlesize, BarsBack)
Olongsignal = L < L[1] and C > H[1] and (H - L) >= AverageCandle1 * BarMultiplier
Oshortsignal = H > H[1] and C < L[1] and (H - L) >= AverageCandle1 * BarMultiplier
// Doji Reversal System
l04 = input(true, title = "Enable Doji Reversal System")
percentage = input(title = "Body Percentage", defval = 0.10, step = 0.1, minval = 0.1)
frangehl = H[1] - L[1]
frangeco = abs(C[1] - O[1])
sma10 = sma(close, 10)
Dshortsignal = (frangeco <= frangehl * percentage and C < L[1] and L[1] > sma10 and C < O) or (C < L[2] and C[1] >= L[2] and frangeco <= frangeco * percentage and C < O and L[2] > sma10)
Dlongsignal = (frangeco <= frangehl * percentage and C > H[1] and H[1] < sma10 and C > O) or (C > H[2] and C[1] <= H[2] and frangeco <= frangeco * percentage and C > O and H[2] < sma10)
longsignal = lowleftempty and ((l01 and Wlongsignal) or (l02 and Elongsignal) or (l03 and Olongsignal) or (l04 and Dlongsignal))
shortsignal = highleftempty and ((l01 and Wlongsignal) or (l02 and Eshortsignal) or (l03 and Oshortsignal) or (l04 and Dshortsignal))
plotshape(longsignal, color = color.blue, location = location.belowbar, style = shape.triangleup, size = size.small)
plotshape(shortsignal, color = color.red, location = location.abovebar, style = shape.triangledown, size = size.small)
//end of this part
//end of this part
//@version=4
//
// @author LonesomeTheBlue
//
//study("Pivot High Low Points", overlay=true)
lb = input(6, title="Left Bars")
rb = input(6, title="Right Bars")
mb = lb + rb + 1
plot(iff(not na(high[mb]), iff(highestbars(mb) == -lb, high[lb], na), na), style=plot.style_cross, linewidth=3, color=color.blue, offset=-lb)
plot(iff(not na(low[mb]), iff(lowestbars(mb) == -lb, low[lb], na), na), style=plot.style_cross, linewidth=3, color=color.blue, offset=-lb)
//end of this part
//@version=4
//study("Fork Handles by @treypeng", overlay=true)
// modify / use / steal this script in any way you like idc
// user customisation input
showarrows = input(title="Show single pivot/swing arrows", type=input.bool, defval=true)
showcols = input(title="Show double pivot/swing bar colours", type=input.bool, defval=true)
// First determine which palette of hues we're going for
// if downcandle=true then we want reds, pinks, browns etc
// if updcandle=true then we want greens, blues, turqoise etc etc
downcandle = close[2] < open[2]
upcandle = close[2] > open[2]
// Do we have a double (five) candle swing?
ispivotlow = not na(pivotlow(low, 2, 2))
ispivothigh = not na(pivothigh(high, 2, 2))
// simple candle swings
pivotlow_1 = pivotlow(low, 1, 1)
pl2 = showarrows ? pivotlow_1 : na
pivothigh_1 = pivothigh(high, 1, 1)
ph2 = showarrows ? pivothigh_1 : na
// draw the simple swings
plotshape(pl2, style=shape.triangleup, location=location.belowbar, color=color.gray, size=size.tiny, offset=-1)
plotshape(ph2, style=shape.triangledown, location=location.abovebar, color=color.gray, size=size.tiny, offset=-1)
// add this line back in for cool text so your charts look confusing and professional to n00bs
//plotchar(pl2, title='CR', char='△', location=location.belowbar, color=gray, offset=-2, text='CR', textcolor=gray, size=size.tiny)
ispivotboth = ispivothigh and ispivotlow
ispivothighup = ispivothigh and upcandle
ispivothighdown = ispivothigh and downcandle
ispivotlowup = ispivotlow and upcandle
ispivotlowdown = ispivotlow and downcandle
ispivotbothup = ispivotboth and upcandle
ispivotbothdown = ispivotboth and downcandle
col = ispivotbothup ? color.white : ispivotbothdown ? color.gray :
ispivothighup ? color.lime : ispivothighdown ? color.red :
ispivotlowup ? color.blue : ispivotlowdown ? #D2691E : na
barcolor(showcols ? col : na, -2)
//end of this part
//@version=4
//study("VJ - Killer BS", overlay=true)
//======================================================================
//Jurij
h_left = input(title="h left", type=input.integer, defval=10)
h_right = input(title="h right", type=input.integer, defval=10)
show_ptz = input(title="Show PTZ", type=input.bool, defval=true)
show_channel = input(title="Show channel", type=input.bool, defval=true)
//barCount = nz(barCount[1]) + 1
//check history and realtime PTZ
h_left_low = lowest(h_left)
h_left_high = highest(h_left)
newlow = low <= h_left_low
newhigh = high >= h_left_high
//channel_high = plot(show_channel ? h_left_low : 0, color=silver)
//channel_low = plot (show_channel ? h_left_high : 0, color=silver)
central_bar_low = low[h_right + 1]
central_bar_high = high[h_right + 1]
full_zone_low = lowest(h_left + h_right + 1)
full_zone_high = highest(h_left + h_right + 1)
central_bar_is_highest = central_bar_high >= full_zone_high
central_bar_is_lowest = central_bar_low <= full_zone_low
plotchar(central_bar_is_highest ? -1 : 0, offset=-h_right - 1, color=color.red, text="Sell")
plotchar(central_bar_is_lowest ? 1 : 0, offset=-h_right - 1, location=location.belowbar, color=color.green, text="Buy")
//plot(close)
//end of this part
//@version=4
//study(title="Peaks&Valleys", shorttitle="P&V", overlay=true)
width = input(9)
p = 0
vc = 0
for i = 0 to width * 2 by 1
p := p + (i == width ? 0 : high[i] < high[width] ? 1 : 0)
v := vc + (i == width ? 0 : low[i] > low[width] ? 1 : 0)
v
plotshape(p == width * 2, offset=-width, style=shape.labeldown)
plotshape(vc == width * 2, offset=-width, style=shape.labelup, location=location.belowbar)
//end of this part
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LonesomeTheBlue
//@version=4
//study("Double Zig Zag with HHLL", overlay = true, max_bars_back = 500)
prdx1 = input(defval = 8, title="ZigZag Period 1", minval = 2, maxval = 20)
prdx2 = input(defval = 20, title="ZigZag Period 2", minval = 2, maxval = 50)
showzz = input(defval = "Show Both", title = "Show Zig Zags", options = ["Show Zig Zag 1", "Show Zig Zag 2", "Show Both", "Show None"])
showhhll = input(defval = "Show Both", title = "Show HHLL", options = ["Show HHLL 1", "Show HHLL 2", "Show Both", "Show None"])
upcol1 = input(defval = color.lime, title = "Zig Zag 1 Up Color")
dncol1 = input(defval = color.red, title = "Zig Zag 1 Down Color")
upcol2 = input(defval = color.blue, title = "Zig Zag 2 Up Color")
dncol2 = input(defval = color.purple, title = "Zig Zag 2 Down Color")
txtcol = input(defval = color.black, title = "Text Color")
zz1style = input(defval = "Dashed", title = "Zig Zag 1 Line Style", options = ["Dashed", "Dotted"])
zz1width = input(defval = 2, title = "Zig zag 1 Line Width", minval = 1, maxval = 4)
zz2width = input(defval = 3, title = "Zig zag 2 Line Width", minval = 1, maxval = 6)
float ph1x = highestbars(high, prdx1) == 0 ? high : na
float pl1x = lowestbars(low, prdx1) == 0 ? low : na
float ph2x = highestbars(high, prdx2) == 0 ? high : na
float pl2x = lowestbars(low, prdx2) == 0 ? low : na
var dir1 = 0
var dir2 = 0
dir1 := iff(ph1x and na(pl1x), 1, iff(pl1x and na(ph1x), -1, dir1))
dir2 := iff(ph2x and na(pl2x), 1, iff(pl2x and na(ph2x), -1, dir2))
var max_array_sizex = 10 // [5, 2] matrix
var zigzag1 = array.new_float(0)
var zigzag2 = array.new_float(0)
add_to_zigzagx(pointer, value, bindex)=>
array.unshift(pointer, bindex)
array.unshift(pointer, value)
if array.size(pointer) > max_array_sizex
array.pop(pointer)
array.pop(pointer)
update_zigzagx(pointer, value, bindex, dir)=>
if array.size(pointer) == 0
add_to_zigzagx(pointer, value, bindex)
else
if (dir == 1 and value > array.get(pointer, 0)) or (dir == -1 and value < array.get(pointer, 0))
array.set(pointer, 0, value)
array.set(pointer, 1, bindex)
0.
dir1changed = change(dir1)
if ph1x or pl1x
if dir1changed
add_to_zigzagx(zigzag1, dir1 == 1 ? ph1x : pl1x, bar_index)
else
update_zigzagx(zigzag1, dir1 == 1 ? ph1x : pl1x, bar_index, dir1)
dir2changed = change(dir2)
if ph2x or pl2x
if dir2changed
add_to_zigzagx(zigzag2, dir2 == 1 ? ph2x : pl2x, bar_index)
else
update_zigzagx(zigzag2, dir2 == 1 ? ph2x : pl2x, bar_index, dir2)
if array.size(zigzag1) >= 6
var line zzline1 = na
var label zzlabel1 = na
float val = array.get(zigzag1, 0)
int point = round(array.get(zigzag1, 1))
if change(val) or change(point)
float val1 = array.get(zigzag1, 2)
int point1 = round(array.get(zigzag1, 3))
if change(val1) == 0 and change(point1) == 0
line.delete(zzline1)
label.delete(zzlabel1)
if showzz == "Show Zig Zag 1" or showzz == "Show Both"
zzline1 := line.new(x1 = point, y1 = val, x2 = point1, y2 = val1, color = dir1 == 1 ? upcol1 : dncol1, width = zz1width, style = zz1style == "Dashed" ? line.style_dashed : line.style_dotted)
if showhhll == "Show HHLL 1" or showhhll == "Show Both"
hhlltxt = dir1 == 1 ? array.get(zigzag1, 0) > array.get(zigzag1, 4) ? "HH" : "LH" : array.get(zigzag1, 0) < array.get(zigzag1, 4) ? "LL" : "HL"
labelcol = dir1 == 1 ? array.get(zigzag1, 0) > array.get(zigzag1, 4) ? upcol1 : dncol1 : array.get(zigzag1, 0) < array.get(zigzag1, 4) ? dncol1 : upcol1
zzlabel1 := label.new(x = point, y = val, text = hhlltxt, color = labelcol, textcolor = txtcol, style = dir1 == 1 ? label.style_label_down : label.style_label_up)
if array.size(zigzag2) >= 6
var line zzline2 = na
var label zzlabel2 = na
float val = array.get(zigzag2, 0)
int point = round(array.get(zigzag2, 1))
if change(val) or change(point)
float val1 = array.get(zigzag2, 2)
int point1 = round(array.get(zigzag2, 3))
if change(val1) == 0 and change(point1) == 0
line.delete(zzline2)
label.delete(zzlabel2)
if showzz == "Show Zig Zag 2" or showzz == "Show Both"
zzline2 := line.new(x1 = point, y1 = val, x2 = point1, y2 = val1, color = dir2 == 1 ? upcol2 : dncol2, width = zz2width)
if showhhll == "Show HHLL 2" or showhhll == "Show Both"
hhlltxt = dir2 == 1 ? array.get(zigzag2, 0) > array.get(zigzag2, 4) ? "HH" : "LH" : array.get(zigzag2, 0) < array.get(zigzag2, 4) ? "LL" : "HL"
labelcol = dir2 == 1 ? array.get(zigzag2, 0) > array.get(zigzag2, 4) ? upcol2 : dncol2 : array.get(zigzag2, 0) < array.get(zigzag2, 4) ? dncol2 : upcol2
zzlabel2 := label.new(x = point, y = val, text = hhlltxt, color = labelcol, textcolor = txtcol, style = dir2 == 1 ? label.style_label_down : label.style_label_up)
//end of this part
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GokhanGoksin
//@version=4
//study("ENGUL",shorttitle="engulf",overlay=true)
x=input(title="çizgi/sağ uzat",type=input.integer,defval=5)
z=input(title="kaynak/seç/üst çizgi",type=input.source,defval=open)
y=input(title="kaynak/seç/alt çizgi",type=input.source,defval=close)
//****************************************************
en=close[1]<open[1] and close>open[1] and low[1] >low
plotshape(en,style=shape.arrowup,location=location.belowbar)
//****************************************************** enguluf destek
if en
li =line.new(time[1],y[1],time+x*(time-time[1]),y[1],xloc=xloc.bar_time,color=color.red,width=2)
if en
label.new(time+x*(time-time[1]),y[1],text="\n"+tostring(y[1]),xloc=xloc.bar_time,
style=label.style_none,size=size.normal,textcolor=color.white,yloc=yloc.price)
//********************************************************************** direnç
if en
line.new(time[1],z[1],time+x*(time-time[1]),z[1],xloc=xloc.bar_time,color=color.blue,width=2)
if en
l=label.new(time+x*(time-time[1]),z[1],text="\n"+tostring(z[1]),xloc=xloc.bar_time,
style=label.style_none,size=size.normal,textcolor=color.white,yloc=yloc.price)
//end of this part
// © weeklystockcharts
// @version=4
// Candle Type w/ only 3-1 Pine Script
//study("Candle Type w/only 3-1", overlay=true, precision=0)
// check for 3-1 inside + up buy
buyx = high[3] < high[2] and low[3] > low[2] and high[1] < high[2] and low[1] > low[2] and high > high[1] and (high[1] <= high[2] and low[1] >= low[2]) and not (low < low[1])
plotchar(buyx, title="Inside + Up Buy Label", text ="Up", location=location.belowbar, color=#4CAF50)
// check for 3-1 inside + dn sell
sellx = high[3] < high[2] and low[3] > low[2] and high[1] < high[2] and low[1] > low[2] and low < low[1] and (low[1] >= low[2] and high[1] <= high[2]) and not (high > high[1])
//end of this part
//@version=4
// ══════════════════════════════════════════════════════════════════════════════════════════════════ //
//# * ══════════════════════════════════════════════════════════════════════════════════════════════
//# *
//# * Study : Price Action - Support & Resistance
//# * - Support & Resistance based on Volume
//# * - Volume Weighted Colored Bars and Sign of Exhaustion Indication Add-On
//# * Author : @MCK
//# *
//# * Revision History
//# * Release : Jan 25, 2021
//# * Update : Jan 26, 2021 : User Request : Add price option for intruments with no volume data
//# * Update : Mar 18, 2021 : Ability to draw lines and cofigure alerts when volume spikes detected
//# * Update : Mar 21, 2021 : Ability to draw lines and cofigure alerts when high volatility detected
//# * - line customization abaility
//# *
//# * ══════════════════════════════════════════════════════════════════════════════════════════════
// ══════════════════════════════════════════════════════════════════════════════════════════════════ //
//study("Price Action - Support & Resistance by MCK", "S&R ʙʏ MCK", true, max_lines_count = 500)
// -Inputs ══════════════════════════════════════════════════════════════════════════════════════ //
// ---------------------------------------------------------------------------------------------- //
// Definitions ---------------------------------------------------------------------------------- //
group_support_and_resistance = "Consecutively Increasing Volume / Price"
tooltip_support_and_resistance = "Moments where\n" +
"- price is bullish or bearish consecutively for minimum 3 bars and on increasing volume with at least one bar's volume is above volume moving average\n" +
"or\n" +
"- price is bullish or bearish consecutively on increasing/decreasing price for minimum 3 bars"
group_volume_spike_sign_of_exhaustion = "Volume Spike - Sign of Exhaustion"
tooltip_volume_spike_sign_of_exhaustion = "Moments where\n" +
"huge volume detected : current volume is grater than the product of the theshold value and volume moving average\n" +
"presents idea : huge volume may be a sign of exhaustion and may lead to sharp reversals"
group_high_volatility = "High Volatility"
tooltip_high_volatility = "Moments where\n" +
"price range of the current bar is grater than the product of the theshold value and average true range value of defined period"
group_volume_weighted_colored_bars = "Volume Weighted Colored Bars"
tooltip_volume_weighted_colored_bars = "Colors bars based on the bar's volume relative to volume moving average\n" +
"trading tip : a potential breakout trading opportunity may occur when price moves above a resistance level or moves below a support level on increasing volume"
tooltip_volume_moving_average = "Volume simple moving average, serves as reference to\n" +
"- Support and Resistance,\n" +
"- Volume Weighted Colored Bars,\n" +
"- Volume Spike - Sign of Exhaustion\n" +
"calculations"
// User Input Declarations ---------------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------- //
// Volume Spike - Sign of Exhaustion ------------------------------------------------------------ //
i_vSpikeThresh = input(3 , "Volume Spike Theshold", minval = .1, step = .1 , inline = "SRS1", group = group_volume_spike_sign_of_exhaustion)
i_isSnRSpike = input(true , "S & R Lines" , inline = "SRS2", group = group_volume_spike_sign_of_exhaustion)
i_spLnColor = input(#ab47bc, "" , inline = "SRS2", group = group_volume_spike_sign_of_exhaustion)
i_spLnWidth = input(2 , "" , inline = "SRS2", group = group_volume_spike_sign_of_exhaustion)
i_spLnStyle = input("Solid" , "", options = ["Dashed", "Dotted", "Solid"] , inline = "SRS2", group = group_volume_spike_sign_of_exhaustion)
i_spLnBullLevel = input("High" , "Levels : Bullish", options = ["High", "Close", "Both"], inline = "SRS3", group = group_volume_spike_sign_of_exhaustion)
i_spLnBearLevel = input("Low" , " Bearish", options = ["Low" , "Close", "Both"] , inline = "SRS3", group = group_volume_spike_sign_of_exhaustion)
// ---------------------------------------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------- //
// Volume Moving Average : Base ----------------------------------------------------------------- //
i_vSMA = sma(nz(volume), input(90, "Volume Moving Average Length", group = "General Settings", tooltip = tooltip_volume_moving_average))
// -Calculations ════════════════════════════════════════════════════════════════════════════════ //
// ---------------------------------------------------------------------------------------------- //
// Definitions ---------------------------------------------------------------------------------- //
nzVolume = nz(volume)
risingVol = nzVolume >= nzVolume[1]
bullCandle = close > open
bearCandle = close < open
risingPrice = close > close[1]
fallingPrice = close < close[1]
lwstPrice = lowest (low , 3)
hstPrice = highest(high, 3)
ranged = abs(high - low)
x2 = timenow
// ---------------------------------------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------- //
// Volume Spike - Sign of Exhaustion ------------------------------------------------------------ //
exhaustVol = nzVolume > i_vSpikeThresh * i_vSMA
x1V = valuewhen(exhaustVol, time, 0)
// ---------------------------------------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------- //
// -Plotting ════════════════════════════════════════════════════════════════════════════════════ //
f_getStyle(_s) => _s == "Solid" ? line.style_solid : _s == "Dotted" ? line.style_dotted : line.style_dashed
// ---------------------------------------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------- //
// Volume Spike - Sign of Exhaustion ------------------------------------------------------------ //
var line spikeLine = na
var line spikeLine1 = na
var line spikeLine2 = na
var line spikeLine3 = na
if i_isSnRSpike and exhaustVol
if bullCandle
if i_spLnBullLevel == "High"
if exhaustVol == exhaustVol[1] and not bearCandle[1]
line.delete(spikeLine[1])
spikeLine := line.new(x1V, high , x2, high , xloc.bar_time, extend.none, i_spLnColor, f_getStyle(i_spLnStyle), i_spLnWidth)
else if i_spLnBullLevel == "Close"
if exhaustVol == exhaustVol[1] and not bearCandle[1]
line.delete(spikeLine[1])
spikeLine := line.new(x1V, close , x2, close , xloc.bar_time, extend.none, i_spLnColor, f_getStyle(i_spLnStyle), i_spLnWidth)
else
if exhaustVol == exhaustVol[1] and not bearCandle[1]
line.delete(spikeLine1[1])
line.delete(spikeLine2[1])
line.delete(spikeLine3[1])
spikeLine1 := line.new(x1V, close , x2, close , xloc.bar_time, extend.none, i_spLnColor, f_getStyle(i_spLnStyle), i_spLnWidth)
spikeLine2 := line.new(x1V, avg(high, close), x2, avg(high, close), xloc.bar_time, extend.none, i_spLnColor, f_getStyle("Dotted") , i_spLnWidth - 1)
spikeLine3 := line.new(x1V, high , x2, high , xloc.bar_time, extend.none, i_spLnColor, f_getStyle(i_spLnStyle), i_spLnWidth)
if bearCandle
if i_spLnBearLevel == "Low"
if exhaustVol == exhaustVol[1] and not bullCandle[1]
line.delete(spikeLine[1])
spikeLine := line.new(x1V, low , x2, low , xloc.bar_time, extend.none, i_spLnColor, f_getStyle(i_spLnStyle), i_spLnWidth)
else if i_spLnBearLevel == "Close"
if exhaustVol == exhaustVol[1] and not bullCandle[1]
line.delete(spikeLine[1])
spikeLine := line.new(x1V, close , x2, close , xloc.bar_time, extend.none, i_spLnColor, f_getStyle(i_spLnStyle), i_spLnWidth)
else
if exhaustVol == exhaustVol[1] and not bullCandle[1]
line.delete(spikeLine1[1])
line.delete(spikeLine2[1])
line.delete(spikeLine3[1])
spikeLine1 := line.new(x1V, low , x2, low , xloc.bar_time, extend.none, i_spLnColor, f_getStyle(i_spLnStyle), i_spLnWidth)
spikeLine2 := line.new(x1V, avg(low, close) , x2, avg(low, close) , xloc.bar_time, extend.none, i_spLnColor, f_getStyle("Dotted") , i_spLnWidth - 1)
spikeLine3 := line.new(x1V, close , x2, close , xloc.bar_time, extend.none, i_spLnColor, f_getStyle(i_spLnStyle), i_spLnWidth)
alertcondition(crossover(nzVolume, i_vSMA * i_vSpikeThresh), "Volume Spikes", "sign of exhaustion, huge volume increase detected\n{{exchange}}:{{ticker}}->\nOpen = {{open}}, Current = {{close}},\nTime = {{time}}")
// ---------------------------------------------------------------------------------------------- /Note: these indicators are educational material, not financial advice.