Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //@version=6
- indicator("Whale Kit", shorttitle = "Whale Kit", overlay = true, max_labels_count = 500, max_lines_count = 500, max_bars_back = 500)
- string GRP_CANDLES = "Whale Candles"
- bool showCandles = input.bool(true, "Whale Candles", group = GRP_CANDLES, tooltip = "Colors every candle by its angle relative to previous movement to reveal trend strength and momentum shifts. Hide the default chart candles for the cleanest look.")
- int candleLen = input.int(5, "Angle Lookback", minval = 1, maxval = 100, group = GRP_CANDLES, tooltip = "Number of bars used to measure the candle angle.")
- int candleAtrLen = input.int(14, "Angle Normalization (ATR)", minval = 1, maxval = 200, group = GRP_CANDLES, tooltip = "ATR length used to normalize price change into a scale-free angle.")
- float candleStrong = input.float(20.0, "Strong Angle (°)", minval = 0.0, maxval = 89.0, step = 0.5, group = GRP_CANDLES, tooltip = "Angles at or beyond this value are painted with the strong color.")
- color colBullStrong = input.color(#E6E8F0, "Bullish Strong", inline = "cbull", group = GRP_CANDLES)
- color colBullWeak = input.color(#26A69A, "Weak", inline = "cbull", group = GRP_CANDLES)
- color colBearStrong = input.color(#E91E63, "Bearish Strong", inline = "cbear", group = GRP_CANDLES)
- color colBearWeak = input.color(#9C6ADE, "Weak", inline = "cbear", group = GRP_CANDLES)
- string GRP_SEQ = "Whale Sequential"
- bool showSeq = input.bool(true, "Whale Sequential", group = GRP_SEQ, tooltip = "Angle-based sequential that detects trend exhaustion and prints a 9.")
- int seqCompare = input.int(4, "Compare Bars Back", minval = 1, maxval = 20, group = GRP_SEQ, tooltip = "Each counted bar must close beyond the close this many bars back.")
- int seqAngleLen = input.int(4, "Trend Angle Length", minval = 1, maxval = 50, group = GRP_SEQ, tooltip = "Bars used to measure the slope of the trend for every counted bar.")
- int seqAtrLen = input.int(14, "Angle Normalization (ATR)", minval = 1, maxval = 200, group = GRP_SEQ)
- float seqMinAngle = input.float(3.0, "Minimum Trend Angle (°)", minval = 0.0, maxval = 45.0, step = 0.5, group = GRP_SEQ, tooltip = "A bar only counts if the trend angle exceeds this value in the direction of the count.")
- int seqTarget = input.int(9, "Sequential Count", minval = 3, maxval = 20, group = GRP_SEQ, tooltip = "Full count that marks trend exhaustion.")
- bool seqEarly = input.bool(true, "Early Exhaustion Detection", group = GRP_SEQ, tooltip = "Flags exhaustion before the full count when the trend angle fades from its peak.")
- int seqEarlyMin = input.int(6, "Early Detection From Count", minval = 2, maxval = 19, group = GRP_SEQ)
- float seqDecay = input.float(0.45, "Angle Fade Ratio", minval = 0.05, maxval = 0.95, step = 0.05, group = GRP_SEQ, tooltip = "Early exhaustion fires when the current angle falls below this fraction of the peak angle of the count.")
- bool showSeqMarks = input.bool(true, "Show Exhaustion Points (⊕)", group = GRP_SEQ)
- bool showSeqNine = input.bool(true, "Show 9 Prints", group = GRP_SEQ)
- bool showWhaleLabel = input.bool(true, "Show Whale Label", group = GRP_SEQ, tooltip = "Optional whale label above highs / below lows for better visibility of exhaustion.")
- bool whaleBandOnly = input.bool(true, "Whale Label Only In Band Zones", group = GRP_SEQ, tooltip = "Whale labels print only when exhaustion occurs inside the upper (bearish) or lower (bullish) Whale Fibonacci Band zone.")
- int seqMaxLabels = input.int(150, "Max Labels Kept", minval = 10, maxval = 240, group = GRP_SEQ)
- color colSeqBull = input.color(#C35CF0, "Bullish 9", inline = "s9", group = GRP_SEQ)
- color colSeqBear = input.color(#5C6FF0, "Bearish 9", inline = "s9", group = GRP_SEQ)
- color colSeqMark = input.color(#C77DFF, "Exhaustion Point", inline = "s9b", group = GRP_SEQ)
- color colWhale = input.color(#29B6F6, "Whale Label", inline = "s9b", group = GRP_SEQ)
- string GRP_BANDS = "Whale Fibonacci Bands"
- bool showBands = input.bool(true, "Whale Fibonacci Bands", group = GRP_BANDS, tooltip = "Adaptive channel built on a metallic-mean weighted average with Fibonacci deviations.")
- float bandSrc = input.source(hlc3, "Source", group = GRP_BANDS)
- int bandLen = input.int(200, "Length", minval = 10, maxval = 400, group = GRP_BANDS)
- string bandMetal = input.string("Golden", "Metallic Mean", options = ["Golden", "Silver", "Bronze"], group = GRP_BANDS, tooltip = "Golden = 1.618, Silver = 2.414, Bronze = 3.303. Higher means shift more weight to recent price.")
- float bandMult = input.float(1.0, "Deviation Multiplier", minval = 0.1, maxval = 10.0, step = 0.1, group = GRP_BANDS)
- int bandSmooth = input.int(20, "Band Smoothing", minval = 1, maxval = 100, group = GRP_BANDS)
- float fib1 = input.float(1.000, "Fib Level 1", minval = 0.1, step = 0.001, inline = "f1", group = GRP_BANDS)
- float fib2 = input.float(1.618, "Level 2", minval = 0.1, step = 0.001, inline = "f1", group = GRP_BANDS)
- float fib3 = input.float(2.618, "Fib Level 3", minval = 0.1, step = 0.001, inline = "f2", group = GRP_BANDS)
- float fib4 = input.float(3.618, "Level 4", minval = 0.1, step = 0.001, inline = "f2", group = GRP_BANDS)
- float fib5 = input.float(4.236, "Fib Level 5", minval = 0.1, step = 0.001, group = GRP_BANDS)
- bool showBasis = input.bool(false, "Show Basis", group = GRP_BANDS)
- color colUpperBand = input.color(#7B2CBF, "Upper Zone", inline = "bc", group = GRP_BANDS)
- color colLowerBand = input.color(#1E63B5, "Lower Zone", inline = "bc", group = GRP_BANDS)
- color colBasis = input.color(#8E8E9E, "Basis", inline = "bc", group = GRP_BANDS)
- string GRP_MA = "Moving Averages"
- bool showW9 = input.bool(true, "Whale 9 MA", inline = "w9", group = GRP_MA)
- color colW9 = input.color(#29B6F6, "", inline = "w9", group = GRP_MA)
- int w9Len = input.int(9, "Length", minval = 2, inline = "w9", group = GRP_MA)
- bool showW9Fill = input.bool(true, "Whale 9 MA Fill", inline = "w9f", group = GRP_MA)
- color colW9Fill = input.color(#9C27B0, "", inline = "w9f", group = GRP_MA)
- bool show200D = input.bool(true, "200 Day MA", inline = "d200", group = GRP_MA)
- color col200D = input.color(#A33BF0, "", inline = "d200", group = GRP_MA)
- int len200D = input.int(200, "Length", minval = 2, inline = "d200", group = GRP_MA)
- bool show200W = input.bool(true, "200 Week MA", inline = "w200", group = GRP_MA)
- color col200W = input.color(#FFB74D, "", inline = "w200", group = GRP_MA)
- int len200W = input.int(200, "Length", minval = 2, inline = "w200", group = GRP_MA)
- int maWidth200 = input.int(2, "Structural MA Width", minval = 1, maxval = 5, group = GRP_MA)
- string GRP_SCR = "Whale Screener"
- bool showScreener = input.bool(true, "Whale Screener", group = GRP_SCR, tooltip = "Scans the symbols below for active 9-counts, price vs Whale 9 MA, price vs 200 MA and Whale Band readings.")
- string scrTf = input.timeframe("D", "Screener Timeframe", group = GRP_SCR)
- int scrRecent = input.int(3, "Active 9 Within Bars", minval = 1, maxval = 20, group = GRP_SCR, tooltip = "A 9 stays 'active' in the screener for this many bars after it prints.")
- string scrPosStr = input.string("Bottom Right", "Position", options = ["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"], inline = "tp", group = GRP_SCR)
- string scrSizeStr = input.string("Small", "Size", options = ["Tiny", "Small", "Normal", "Large"], inline = "tp", group = GRP_SCR)
- color colScrBg = input.color(#131722, "Background", inline = "tc", group = GRP_SCR)
- color colScrHead = input.color(#2A1B3D, "Header", inline = "tc", group = GRP_SCR)
- color colScrText = input.color(#D1D4DC, "Text", inline = "tc", group = GRP_SCR)
- color colScrBull = input.color(#29B6F6, "Bullish", inline = "tb", group = GRP_SCR)
- color colScrBear = input.color(#C35CF0, "Bearish", inline = "tb", group = GRP_SCR)
- bool scrOn1 = input.bool(true, "", inline = "s1", group = GRP_SCR)
- string scrSym1 = input.symbol("EGX:PHDC", "Symbol 1", inline = "s1", group = GRP_SCR)
- bool scrOn2 = input.bool(true, "", inline = "s2", group = GRP_SCR)
- string scrSym2 = input.symbol("EGX:COMI", "Symbol 2", inline = "s2", group = GRP_SCR)
- bool scrOn3 = input.bool(true, "", inline = "s3", group = GRP_SCR)
- string scrSym3 = input.symbol("EGX:TMGH", "Symbol 3", inline = "s3", group = GRP_SCR)
- bool scrOn4 = input.bool(true, "", inline = "s4", group = GRP_SCR)
- string scrSym4 = input.symbol("EGX:HRHO", "Symbol 4", inline = "s4", group = GRP_SCR)
- bool scrOn5 = input.bool(true, "", inline = "s5", group = GRP_SCR)
- string scrSym5 = input.symbol("EGX:ETEL", "Symbol 5", inline = "s5", group = GRP_SCR)
- bool scrOn6 = input.bool(true, "", inline = "s6", group = GRP_SCR)
- string scrSym6 = input.symbol("EGX:SWDY", "Symbol 6", inline = "s6", group = GRP_SCR)
- bool scrOn7 = input.bool(true, "", inline = "s7", group = GRP_SCR)
- string scrSym7 = input.symbol("EGX:EAST", "Symbol 7", inline = "s7", group = GRP_SCR)
- bool scrOn8 = input.bool(true, "", inline = "s8", group = GRP_SCR)
- string scrSym8 = input.symbol("EGX:ABUK", "Symbol 8", inline = "s8", group = GRP_SCR)
- bool scrOn9 = input.bool(true, "", inline = "s9", group = GRP_SCR)
- string scrSym9 = input.symbol("EGX:FWRY", "Symbol 9", inline = "s9", group = GRP_SCR)
- bool scrOn10 = input.bool(true, "", inline = "s10", group = GRP_SCR)
- string scrSym10 = input.symbol("EGX:EFIH", "Symbol 10", inline = "s10", group = GRP_SCR)
- string GRP_ALERT = "Alerts"
- bool alSeq = input.bool(true, "Whale Sequential 9", group = GRP_ALERT)
- bool alW9 = input.bool(true, "Whale 9 MA Cross", group = GRP_ALERT)
- bool al200D = input.bool(true, "200 Day MA Cross", group = GRP_ALERT)
- bool alBands = input.bool(true, "Whale Band Touch", group = GRP_ALERT)
- float RAD_TO_DEG = 180.0 / math.pi
- string WHALE_ICON = "🐋"
- string MARK_CHAR = "⊕"
- int SCR_COLS = 6
- int SCR_ROWS = 13
- metallicMean(int n) =>
- (n + math.sqrt(n * n + 4.0)) / 2.0
- metalOrder(string s) =>
- switch s
- "Golden" => 1
- "Silver" => 2
- "Bronze" => 3
- => 1
- mmwa(series float src, int len, float m) =>
- float sumW = 0.0
- float sumV = 0.0
- for i = 0 to len - 1
- float v = src[i]
- if not na(v)
- float w = math.pow(m, -i * m / len)
- sumW += w
- sumV += v * w
- sumW > 0.0 ? sumV / sumW : na
- lowLag(series float src, int len) =>
- float e1 = ta.ema(src, len)
- float e2 = ta.ema(e1, len)
- float dema = 2.0 * e1 - e2
- ta.wma(dema, math.max(2, math.round(math.sqrt(len))))
- angleDeg(series float src, int len, int atrLen) =>
- float a = ta.atr(atrLen)
- float d = src - src[len]
- nz(a) > 0.0 ? math.atan(nz(d) / (a * len)) * RAD_TO_DEG : 0.0
- whaleSequential(series float src, int cmp, int angLen, int atrLen, float minAng, int target, bool early, int earlyMin, float decay) =>
- var int upCount = 0
- var int dnCount = 0
- var float upPeak = 0.0
- var float dnPeak = 0.0
- float ang = angleDeg(src, angLen, atrLen)
- bool upBar = src > nz(src[cmp], src) and ang > minAng
- bool dnBar = src < nz(src[cmp], src) and ang < -minAng
- upCount := upBar ? upCount + 1 : 0
- dnCount := dnBar ? dnCount + 1 : 0
- upPeak := upCount == 1 ? ang : upCount > 1 ? math.max(upPeak, ang) : 0.0
- dnPeak := dnCount == 1 ? ang : dnCount > 1 ? math.min(dnPeak, ang) : 0.0
- bool bearFull = upCount >= target
- bool bullFull = dnCount >= target
- bool bearEarly = early and not bearFull and upCount >= earlyMin and ang < upPeak * decay
- bool bullEarly = early and not bullFull and dnCount >= earlyMin and ang > dnPeak * decay
- int outUp = upCount
- int outDn = dnCount
- if bearFull or bearEarly
- upCount := 0
- upPeak := 0.0
- if bullFull or bullEarly
- dnCount := 0
- dnPeak := 0.0
- [outUp, outDn, bearFull, bullFull, bearEarly, bullEarly, ang]
- whaleBands(series float src, int len, float m, float mult, int smooth) =>
- float basis = mmwa(src, len, m)
- float dev = mmwa(math.abs(src - nz(basis, src)), len, m)
- float devS = ta.ema(dev, smooth) * mult
- [basis, devS]
- bandZone(float price, float basis, float dev) =>
- int z = 0
- if not na(basis) and not na(dev) and not na(price)
- z := price >= basis + dev * fib5 ? 5 : price >= basis + dev * fib4 ? 4 : price >= basis + dev * fib3 ? 3 : price >= basis + dev * fib2 ? 2 : price >= basis + dev * fib1 ? 1 : price <= basis - dev * fib5 ? -5 : price <= basis - dev * fib4 ? -4 : price <= basis - dev * fib3 ? -3 : price <= basis - dev * fib2 ? -2 : price <= basis - dev * fib1 ? -1 : 0
- z
- bandZoneText(int z) =>
- z > 0 ? "Upper " + str.tostring(z) : z < 0 ? "Lower " + str.tostring(math.abs(z)) : "Inside"
- screenerData() =>
- [sUp, sDn, sBearF, sBullF, sBearE, sBullE, sAng] = whaleSequential(close, seqCompare, seqAngleLen, seqAtrLen, seqMinAngle, seqTarget, seqEarly, seqEarlyMin, seqDecay)
- float sW9 = lowLag(close, w9Len)
- float sM200 = lowLag(close, len200D)
- [sBasis, sDev] = whaleBands(hlc3, bandLen, metallicMean(metalOrder(bandMetal)), bandMult, bandSmooth)
- int bearAgo = ta.barssince(sBearF or sBearE)
- int bullAgo = ta.barssince(sBullF or sBullE)
- int sigAct = not na(bearAgo) and bearAgo < scrRecent and (na(bullAgo) or bearAgo <= bullAgo) ? -1 : not na(bullAgo) and bullAgo < scrRecent ? 1 : 0
- int cnt = sUp > 0 ? sUp : sDn > 0 ? -sDn : 0
- int w9Rel = na(sW9) ? 0 : close > sW9 ? 1 : -1
- int m200Rel = na(sM200) ? 0 : close > sM200 ? 1 : -1
- [close, cnt, sigAct, w9Rel, m200Rel, bandZone(close, sBasis, sDev)]
- pushLabel(array<label> arr, label lb, int maxN) =>
- arr.push(lb)
- while arr.size() > maxN
- label.delete(arr.shift())
- tablePosition(string s) =>
- switch s
- "Top Left" => position.top_left
- "Top Center" => position.top_center
- "Top Right" => position.top_right
- "Middle Left" => position.middle_left
- "Middle Right" => position.middle_right
- "Bottom Left" => position.bottom_left
- "Bottom Center" => position.bottom_center
- => position.bottom_right
- tableSize(string s) =>
- switch s
- "Tiny" => size.tiny
- "Small" => size.small
- "Normal" => size.normal
- => size.large
- shortSymbol(string sym) =>
- array<string> parts = str.split(sym, ":")
- parts.size() > 0 ? parts.last() : sym
- drawScreenerRow(table t, int r, string sym, float px, int cnt, int sig, int w9Rel, int m200Rel, int z, string sz) =>
- string cntTxt = sig < 0 ? "9 ▼" : sig > 0 ? "9 ▲" : cnt > 0 ? "▲ " + str.tostring(cnt) : cnt < 0 ? "▼ " + str.tostring(math.abs(cnt)) : "–"
- color cntCol = sig < 0 ? colScrBear : sig > 0 ? colScrBull : cnt > 0 ? color.new(colScrBull, 35) : cnt < 0 ? color.new(colScrBear, 35) : colScrText
- color w9Col = w9Rel > 0 ? colScrBull : w9Rel < 0 ? colScrBear : colScrText
- color mCol = m200Rel > 0 ? colScrBull : m200Rel < 0 ? colScrBear : colScrText
- color zCol = z > 0 ? colScrBear : z < 0 ? colScrBull : colScrText
- color rowBg = r % 2 == 0 ? colScrBg : color.new(color.from_gradient(50, 0, 100, colScrBg, colScrHead), 0)
- t.cell(0, r, shortSymbol(sym), text_color = colScrText, bgcolor = rowBg, text_size = sz, text_halign = text.align_left)
- t.cell(1, r, na(px) ? "n/a" : str.tostring(px, "#,##0.00##"), text_color = colScrText, bgcolor = rowBg, text_size = sz)
- t.cell(2, r, cntTxt, text_color = cntCol, bgcolor = rowBg, text_size = sz)
- t.cell(3, r, w9Rel > 0 ? "Above" : w9Rel < 0 ? "Below" : "–", text_color = w9Col, bgcolor = rowBg, text_size = sz)
- t.cell(4, r, m200Rel > 0 ? "Above" : m200Rel < 0 ? "Below" : "–", text_color = mCol, bgcolor = rowBg, text_size = sz)
- t.cell(5, r, na(px) ? "–" : bandZoneText(z), text_color = zCol, bgcolor = rowBg, text_size = sz)
- float candleAngle = angleDeg(close, candleLen, candleAtrLen)
- float candleAccel = candleAngle - nz(candleAngle[1])
- [seqUp, seqDn, seqBearFull, seqBullFull, seqBearEarly, seqBullEarly, seqAngle] = whaleSequential(close, seqCompare, seqAngleLen, seqAtrLen, seqMinAngle, seqTarget, seqEarly, seqEarlyMin, seqDecay)
- float metalM = metallicMean(metalOrder(bandMetal))
- [bandBasis, bandDev] = whaleBands(bandSrc, bandLen, metalM, bandMult, bandSmooth)
- float up1 = bandBasis + bandDev * fib1
- float up2 = bandBasis + bandDev * fib2
- float up3 = bandBasis + bandDev * fib3
- float up4 = bandBasis + bandDev * fib4
- float up5 = bandBasis + bandDev * fib5
- float dn1 = bandBasis - bandDev * fib1
- float dn2 = bandBasis - bandDev * fib2
- float dn3 = bandBasis - bandDev * fib3
- float dn4 = bandBasis - bandDev * fib4
- float dn5 = bandBasis - bandDev * fib5
- int chartZone = bandZone(close, bandBasis, bandDev)
- float whale9MA = lowLag(close, w9Len)
- bool isDailyChart = timeframe.isdaily and timeframe.multiplier == 1
- bool isWeeklyChart = timeframe.isweekly and timeframe.multiplier == 1
- float ma200DLocal = lowLag(close, len200D)
- float ma200WLocal = lowLag(close, len200W)
- float ma200DHtf = request.security(syminfo.tickerid, "D", lowLag(close, len200D)[1], lookahead = barmerge.lookahead_on)
- float ma200WHtf = request.security(syminfo.tickerid, "W", lowLag(close, len200W)[1], lookahead = barmerge.lookahead_on)
- float ma200D = isDailyChart ? ma200DLocal : ma200DHtf
- float ma200W = isWeeklyChart ? ma200WLocal : ma200WHtf
- [scrPx1, scrCnt1, scrSig1, scrW91, scrM1, scrZ1] = request.security(scrSym1, scrTf, screenerData(), ignore_invalid_symbol = true)
- [scrPx2, scrCnt2, scrSig2, scrW92, scrM2, scrZ2] = request.security(scrSym2, scrTf, screenerData(), ignore_invalid_symbol = true)
- [scrPx3, scrCnt3, scrSig3, scrW93, scrM3, scrZ3] = request.security(scrSym3, scrTf, screenerData(), ignore_invalid_symbol = true)
- [scrPx4, scrCnt4, scrSig4, scrW94, scrM4, scrZ4] = request.security(scrSym4, scrTf, screenerData(), ignore_invalid_symbol = true)
- [scrPx5, scrCnt5, scrSig5, scrW95, scrM5, scrZ5] = request.security(scrSym5, scrTf, screenerData(), ignore_invalid_symbol = true)
- [scrPx6, scrCnt6, scrSig6, scrW96, scrM6, scrZ6] = request.security(scrSym6, scrTf, screenerData(), ignore_invalid_symbol = true)
- [scrPx7, scrCnt7, scrSig7, scrW97, scrM7, scrZ7] = request.security(scrSym7, scrTf, screenerData(), ignore_invalid_symbol = true)
- [scrPx8, scrCnt8, scrSig8, scrW98, scrM8, scrZ8] = request.security(scrSym8, scrTf, screenerData(), ignore_invalid_symbol = true)
- [scrPx9, scrCnt9, scrSig9, scrW99, scrM9, scrZ9] = request.security(scrSym9, scrTf, screenerData(), ignore_invalid_symbol = true)
- [scrPx10, scrCnt10, scrSig10, scrW910, scrM10, scrZ10] = request.security(scrSym10, scrTf, screenerData(), ignore_invalid_symbol = true)
- color candleCol = candleAngle >= candleStrong ? colBullStrong : candleAngle > 0 ? (candleAccel >= 0 ? colBullWeak : color.new(colBullWeak, 25)) : candleAngle <= -candleStrong ? colBearStrong : (candleAccel <= 0 ? colBearWeak : color.new(colBearWeak, 25))
- bool bearNine = showSeq and seqBearFull and barstate.isconfirmed
- bool bullNine = showSeq and seqBullFull and barstate.isconfirmed
- bool bearExhPt = showSeq and seqBearEarly and barstate.isconfirmed
- bool bullExhPt = showSeq and seqBullEarly and barstate.isconfirmed
- bool bearAny = bearNine or bearExhPt
- bool bullAny = bullNine or bullExhPt
- bool bearWhale = showWhaleLabel and bearAny and (not whaleBandOnly or high >= up1)
- bool bullWhale = showWhaleLabel and bullAny and (not whaleBandOnly or low <= dn1)
- bool w9CrossUp = ta.crossover(close, whale9MA) and barstate.isconfirmed
- bool w9CrossDn = ta.crossunder(close, whale9MA) and barstate.isconfirmed
- bool m200CrossUp = ta.crossover(close, ma200D) and barstate.isconfirmed
- bool m200CrossDn = ta.crossunder(close, ma200D) and barstate.isconfirmed
- bool upperTouch = ta.crossover(high, up1) and barstate.isconfirmed
- bool lowerTouch = ta.crossunder(low, dn1) and barstate.isconfirmed
- plotcandle(open, high, low, close, "Whale Candles", color = showCandles ? candleCol : na, wickcolor = showCandles ? candleCol : na, bordercolor = showCandles ? candleCol : na, editable = false)
- pUp1 = plot(showBands ? up1 : na, "Upper Band 1", na, editable = false)
- pUp2 = plot(showBands ? up2 : na, "Upper Band 2", na, editable = false)
- pUp3 = plot(showBands ? up3 : na, "Upper Band 3", na, editable = false)
- pUp4 = plot(showBands ? up4 : na, "Upper Band 4", na, editable = false)
- pUp5 = plot(showBands ? up5 : na, "Upper Band 5", na, editable = false)
- pDn1 = plot(showBands ? dn1 : na, "Lower Band 1", na, editable = false)
- pDn2 = plot(showBands ? dn2 : na, "Lower Band 2", na, editable = false)
- pDn3 = plot(showBands ? dn3 : na, "Lower Band 3", na, editable = false)
- pDn4 = plot(showBands ? dn4 : na, "Lower Band 4", na, editable = false)
- pDn5 = plot(showBands ? dn5 : na, "Lower Band 5", na, editable = false)
- fill(pUp1, pUp2, up2, up1, color.new(colUpperBand, 84), color.new(colUpperBand, 92), "Upper Zone 1")
- fill(pUp2, pUp3, up3, up2, color.new(colUpperBand, 74), color.new(colUpperBand, 84), "Upper Zone 2")
- fill(pUp3, pUp4, up4, up3, color.new(colUpperBand, 64), color.new(colUpperBand, 74), "Upper Zone 3")
- fill(pUp4, pUp5, up5, up4, color.new(colUpperBand, 55), color.new(colUpperBand, 64), "Upper Zone 4")
- fill(pDn1, pDn2, dn1, dn2, color.new(colLowerBand, 92), color.new(colLowerBand, 84), "Lower Zone 1")
- fill(pDn2, pDn3, dn2, dn3, color.new(colLowerBand, 84), color.new(colLowerBand, 74), "Lower Zone 2")
- fill(pDn3, pDn4, dn3, dn4, color.new(colLowerBand, 74), color.new(colLowerBand, 64), "Lower Zone 3")
- fill(pDn4, pDn5, dn4, dn5, color.new(colLowerBand, 64), color.new(colLowerBand, 55), "Lower Zone 4")
- pW9 = plot(showW9 ? whale9MA : na, "Whale 9 MA", colW9, 1)
- pPrice = plot(showW9 and showW9Fill ? close : na, "Whale 9 Price Anchor", na, editable = false)
- fill(pW9, pPrice, color = showW9 and showW9Fill ? color.new(colW9Fill, 75) : na, title = "Whale 9 MA Fill")
- plot(show200D ? ma200D : na, "200 Day MA", col200D, maWidth200)
- plot(show200W ? ma200W : na, "200 Week MA", col200W, maWidth200)
- var array<label> markLabels = array.new<label>()
- if showSeqMarks and bearExhPt
- pushLabel(markLabels, label.new(bar_index, high, MARK_CHAR, yloc = yloc.abovebar, color = color.new(colSeqMark, 100), style = label.style_label_down, textcolor = colSeqMark, size = size.small, tooltip = "Bearish exhaustion point"), seqMaxLabels)
- if showSeqMarks and bullExhPt
- pushLabel(markLabels, label.new(bar_index, low, MARK_CHAR, yloc = yloc.belowbar, color = color.new(colSeqMark, 100), style = label.style_label_up, textcolor = colSeqMark, size = size.small, tooltip = "Bullish exhaustion point"), seqMaxLabels)
- var array<label> seqLabels = array.new<label>()
- if showSeqNine and bearNine
- pushLabel(seqLabels, label.new(bar_index, high, str.tostring(seqTarget), yloc = yloc.abovebar, color = colSeqBear, style = label.style_arrowdown, textcolor = colSeqBear, size = size.small, tooltip = "Whale Sequential: bearish exhaustion (" + str.tostring(seqTarget) + ")"), seqMaxLabels)
- if showSeqNine and bullNine
- pushLabel(seqLabels, label.new(bar_index, low, str.tostring(seqTarget), yloc = yloc.belowbar, color = colSeqBull, style = label.style_arrowup, textcolor = colSeqBull, size = size.small, tooltip = "Whale Sequential: bullish exhaustion (" + str.tostring(seqTarget) + ")"), seqMaxLabels)
- if bearWhale
- pushLabel(seqLabels, label.new(bar_index, high + nz(ta.atr(14)) * 2.5, WHALE_ICON, color = colWhale, style = label.style_label_down, textcolor = color.white, size = size.normal, tooltip = "Whale exhaustion at highs"), seqMaxLabels)
- if bullWhale
- pushLabel(seqLabels, label.new(bar_index, low - nz(ta.atr(14)) * 2.5, WHALE_ICON, color = colWhale, style = label.style_label_up, textcolor = color.white, size = size.normal, tooltip = "Whale exhaustion at lows"), seqMaxLabels)
- array<bool> scrOnArr = array.from(scrOn1, scrOn2, scrOn3, scrOn4, scrOn5, scrOn6, scrOn7, scrOn8, scrOn9, scrOn10)
- array<int> scrW9Arr = array.from(scrW91, scrW92, scrW93, scrW94, scrW95, scrW96, scrW97, scrW98, scrW99, scrW910)
- array<int> scrMArr = array.from(scrM1, scrM2, scrM3, scrM4, scrM5, scrM6, scrM7, scrM8, scrM9, scrM10)
- array<int> scrSigArr = array.from(scrSig1, scrSig2, scrSig3, scrSig4, scrSig5, scrSig6, scrSig7, scrSig8, scrSig9, scrSig10)
- int statActive = 0
- int statBull = 0
- int statBear = 0
- int statNines = 0
- if barstate.islast
- for i = 0 to 9
- if scrOnArr.get(i)
- statActive += 1
- int w = nz(scrW9Arr.get(i))
- int m = nz(scrMArr.get(i))
- statBull += w > 0 and m > 0 ? 1 : 0
- statBear += w < 0 and m < 0 ? 1 : 0
- statNines += nz(scrSigArr.get(i)) != 0 ? 1 : 0
- var table scrTable = table.new(tablePosition(scrPosStr), SCR_COLS, SCR_ROWS, bgcolor = colScrBg, frame_color = color.new(colScrHead, 0), frame_width = 1, border_color = color.new(colScrHead, 40), border_width = 1)
- if barstate.islast and showScreener
- string sz = tableSize(scrSizeStr)
- scrTable.clear(0, 0, SCR_COLS - 1, SCR_ROWS - 1)
- scrTable.cell(0, 0, WHALE_ICON + " Whale Screener [" + scrTf + "]", text_color = colScrText, bgcolor = colScrHead, text_size = sz)
- scrTable.merge_cells(0, 0, SCR_COLS - 1, 0)
- array<string> heads = array.from("Symbol", "Price", str.tostring(seqTarget) + "-Count", "Whale 9 MA", "200 MA", "Whale Bands")
- for c = 0 to SCR_COLS - 1
- scrTable.cell(c, 1, heads.get(c), text_color = colScrText, bgcolor = color.new(colScrHead, 30), text_size = sz)
- int r = 2
- if scrOn1
- drawScreenerRow(scrTable, r, scrSym1, scrPx1, scrCnt1, scrSig1, scrW91, scrM1, scrZ1, sz)
- r += 1
- if scrOn2
- drawScreenerRow(scrTable, r, scrSym2, scrPx2, scrCnt2, scrSig2, scrW92, scrM2, scrZ2, sz)
- r += 1
- if scrOn3
- drawScreenerRow(scrTable, r, scrSym3, scrPx3, scrCnt3, scrSig3, scrW93, scrM3, scrZ3, sz)
- r += 1
- if scrOn4
- drawScreenerRow(scrTable, r, scrSym4, scrPx4, scrCnt4, scrSig4, scrW94, scrM4, scrZ4, sz)
- r += 1
- if scrOn5
- drawScreenerRow(scrTable, r, scrSym5, scrPx5, scrCnt5, scrSig5, scrW95, scrM5, scrZ5, sz)
- r += 1
- if scrOn6
- drawScreenerRow(scrTable, r, scrSym6, scrPx6, scrCnt6, scrSig6, scrW96, scrM6, scrZ6, sz)
- r += 1
- if scrOn7
- drawScreenerRow(scrTable, r, scrSym7, scrPx7, scrCnt7, scrSig7, scrW97, scrM7, scrZ7, sz)
- r += 1
- if scrOn8
- drawScreenerRow(scrTable, r, scrSym8, scrPx8, scrCnt8, scrSig8, scrW98, scrM8, scrZ8, sz)
- r += 1
- if scrOn9
- drawScreenerRow(scrTable, r, scrSym9, scrPx9, scrCnt9, scrSig9, scrW99, scrM9, scrZ9, sz)
- r += 1
- if scrOn10
- drawScreenerRow(scrTable, r, scrSym10, scrPx10, scrCnt10, scrSig10, scrW910, scrM10, scrZ10, sz)
- r += 1
- string footer = "Bullish " + str.tostring(statBull) + "/" + str.tostring(statActive) + " Bearish " + str.tostring(statBear) + "/" + str.tostring(statActive) + " Active 9s " + str.tostring(statNines)
- scrTable.cell(0, r, footer, text_color = colScrText, bgcolor = colScrHead, text_size = sz)
- scrTable.merge_cells(0, r, SCR_COLS - 1, r)
- else if barstate.islast and not showScreener
- scrTable.clear(0, 0, SCR_COLS - 1, SCR_ROWS - 1)
- string tk = syminfo.ticker + " (" + timeframe.period + ")"
- if alSeq and (bullNine or bullExhPt)
- alert("Whale Kit: Bullish Sequential 9 on " + tk + " at " + str.tostring(close, format.mintick), alert.freq_once_per_bar_close)
- if alSeq and (bearNine or bearExhPt)
- alert("Whale Kit: Bearish Sequential 9 on " + tk + " at " + str.tostring(close, format.mintick), alert.freq_once_per_bar_close)
- if alW9 and w9CrossUp
- alert("Whale Kit: " + tk + " crossed above the Whale 9 MA", alert.freq_once_per_bar_close)
- if alW9 and w9CrossDn
- alert("Whale Kit: " + tk + " crossed below the Whale 9 MA", alert.freq_once_per_bar_close)
- if al200D and m200CrossUp
- alert("Whale Kit: " + tk + " crossed above the 200 Day MA", alert.freq_once_per_bar_close)
- if al200D and m200CrossDn
- alert("Whale Kit: " + tk + " crossed below the 200 Day MA", alert.freq_once_per_bar_close)
- if alBands and upperTouch
- alert("Whale Kit: " + tk + " touched the upper Whale Fibonacci Band", alert.freq_once_per_bar_close)
- if alBands and lowerTouch
- alert("Whale Kit: " + tk + " touched the lower Whale Fibonacci Band", alert.freq_once_per_bar_close)
Advertisement
Add Comment
Please, Sign In to add comment