ajiim

🎁

Oct 18th, 2026
550
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.63 KB | None | 0 0
  1. //@version=6
  2. indicator("Whale Kit", shorttitle = "Whale Kit", overlay = true, max_labels_count = 500, max_lines_count = 500, max_bars_back = 500)
  3.  
  4. string GRP_CANDLES = "Whale Candles"
  5. 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.")
  6. int candleLen = input.int(5, "Angle Lookback", minval = 1, maxval = 100, group = GRP_CANDLES, tooltip = "Number of bars used to measure the candle angle.")
  7. 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.")
  8. 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.")
  9. color colBullStrong = input.color(#E6E8F0, "Bullish Strong", inline = "cbull", group = GRP_CANDLES)
  10. color colBullWeak = input.color(#26A69A, "Weak", inline = "cbull", group = GRP_CANDLES)
  11. color colBearStrong = input.color(#E91E63, "Bearish Strong", inline = "cbear", group = GRP_CANDLES)
  12. color colBearWeak = input.color(#9C6ADE, "Weak", inline = "cbear", group = GRP_CANDLES)
  13.  
  14. string GRP_SEQ = "Whale Sequential"
  15. bool showSeq = input.bool(true, "Whale Sequential", group = GRP_SEQ, tooltip = "Angle-based sequential that detects trend exhaustion and prints a 9.")
  16. 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.")
  17. 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.")
  18. int seqAtrLen = input.int(14, "Angle Normalization (ATR)", minval = 1, maxval = 200, group = GRP_SEQ)
  19. 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.")
  20. int seqTarget = input.int(9, "Sequential Count", minval = 3, maxval = 20, group = GRP_SEQ, tooltip = "Full count that marks trend exhaustion.")
  21. 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.")
  22. int seqEarlyMin = input.int(6, "Early Detection From Count", minval = 2, maxval = 19, group = GRP_SEQ)
  23. 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.")
  24. bool showSeqMarks = input.bool(true, "Show Exhaustion Points (⊕)", group = GRP_SEQ)
  25. bool showSeqNine = input.bool(true, "Show 9 Prints", group = GRP_SEQ)
  26. bool showWhaleLabel = input.bool(true, "Show Whale Label", group = GRP_SEQ, tooltip = "Optional whale label above highs / below lows for better visibility of exhaustion.")
  27. 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.")
  28. int seqMaxLabels = input.int(150, "Max Labels Kept", minval = 10, maxval = 240, group = GRP_SEQ)
  29. color colSeqBull = input.color(#C35CF0, "Bullish 9", inline = "s9", group = GRP_SEQ)
  30. color colSeqBear = input.color(#5C6FF0, "Bearish 9", inline = "s9", group = GRP_SEQ)
  31. color colSeqMark = input.color(#C77DFF, "Exhaustion Point", inline = "s9b", group = GRP_SEQ)
  32. color colWhale = input.color(#29B6F6, "Whale Label", inline = "s9b", group = GRP_SEQ)
  33.  
  34. string GRP_BANDS = "Whale Fibonacci Bands"
  35. bool showBands = input.bool(true, "Whale Fibonacci Bands", group = GRP_BANDS, tooltip = "Adaptive channel built on a metallic-mean weighted average with Fibonacci deviations.")
  36. float bandSrc = input.source(hlc3, "Source", group = GRP_BANDS)
  37. int bandLen = input.int(200, "Length", minval = 10, maxval = 400, group = GRP_BANDS)
  38. 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.")
  39. float bandMult = input.float(1.0, "Deviation Multiplier", minval = 0.1, maxval = 10.0, step = 0.1, group = GRP_BANDS)
  40. int bandSmooth = input.int(20, "Band Smoothing", minval = 1, maxval = 100, group = GRP_BANDS)
  41. float fib1 = input.float(1.000, "Fib Level 1", minval = 0.1, step = 0.001, inline = "f1", group = GRP_BANDS)
  42. float fib2 = input.float(1.618, "Level 2", minval = 0.1, step = 0.001, inline = "f1", group = GRP_BANDS)
  43. float fib3 = input.float(2.618, "Fib Level 3", minval = 0.1, step = 0.001, inline = "f2", group = GRP_BANDS)
  44. float fib4 = input.float(3.618, "Level 4", minval = 0.1, step = 0.001, inline = "f2", group = GRP_BANDS)
  45. float fib5 = input.float(4.236, "Fib Level 5", minval = 0.1, step = 0.001, group = GRP_BANDS)
  46. bool showBasis = input.bool(false, "Show Basis", group = GRP_BANDS)
  47. color colUpperBand = input.color(#7B2CBF, "Upper Zone", inline = "bc", group = GRP_BANDS)
  48. color colLowerBand = input.color(#1E63B5, "Lower Zone", inline = "bc", group = GRP_BANDS)
  49. color colBasis = input.color(#8E8E9E, "Basis", inline = "bc", group = GRP_BANDS)
  50.  
  51. string GRP_MA = "Moving Averages"
  52. bool showW9 = input.bool(true, "Whale 9 MA", inline = "w9", group = GRP_MA)
  53. color colW9 = input.color(#29B6F6, "", inline = "w9", group = GRP_MA)
  54. int w9Len = input.int(9, "Length", minval = 2, inline = "w9", group = GRP_MA)
  55. bool showW9Fill = input.bool(true, "Whale 9 MA Fill", inline = "w9f", group = GRP_MA)
  56. color colW9Fill = input.color(#9C27B0, "", inline = "w9f", group = GRP_MA)
  57. bool show200D = input.bool(true, "200 Day MA", inline = "d200", group = GRP_MA)
  58. color col200D = input.color(#A33BF0, "", inline = "d200", group = GRP_MA)
  59. int len200D = input.int(200, "Length", minval = 2, inline = "d200", group = GRP_MA)
  60. bool show200W = input.bool(true, "200 Week MA", inline = "w200", group = GRP_MA)
  61. color col200W = input.color(#FFB74D, "", inline = "w200", group = GRP_MA)
  62. int len200W = input.int(200, "Length", minval = 2, inline = "w200", group = GRP_MA)
  63. int maWidth200 = input.int(2, "Structural MA Width", minval = 1, maxval = 5, group = GRP_MA)
  64.  
  65. string GRP_SCR = "Whale Screener"
  66. 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.")
  67. string scrTf = input.timeframe("D", "Screener Timeframe", group = GRP_SCR)
  68. 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.")
  69. 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)
  70. string scrSizeStr = input.string("Small", "Size", options = ["Tiny", "Small", "Normal", "Large"], inline = "tp", group = GRP_SCR)
  71. color colScrBg = input.color(#131722, "Background", inline = "tc", group = GRP_SCR)
  72. color colScrHead = input.color(#2A1B3D, "Header", inline = "tc", group = GRP_SCR)
  73. color colScrText = input.color(#D1D4DC, "Text", inline = "tc", group = GRP_SCR)
  74. color colScrBull = input.color(#29B6F6, "Bullish", inline = "tb", group = GRP_SCR)
  75. color colScrBear = input.color(#C35CF0, "Bearish", inline = "tb", group = GRP_SCR)
  76. bool scrOn1 = input.bool(true, "", inline = "s1", group = GRP_SCR)
  77. string scrSym1 = input.symbol("EGX:PHDC", "Symbol 1", inline = "s1", group = GRP_SCR)
  78. bool scrOn2 = input.bool(true, "", inline = "s2", group = GRP_SCR)
  79. string scrSym2 = input.symbol("EGX:COMI", "Symbol 2", inline = "s2", group = GRP_SCR)
  80. bool scrOn3 = input.bool(true, "", inline = "s3", group = GRP_SCR)
  81. string scrSym3 = input.symbol("EGX:TMGH", "Symbol 3", inline = "s3", group = GRP_SCR)
  82. bool scrOn4 = input.bool(true, "", inline = "s4", group = GRP_SCR)
  83. string scrSym4 = input.symbol("EGX:HRHO", "Symbol 4", inline = "s4", group = GRP_SCR)
  84. bool scrOn5 = input.bool(true, "", inline = "s5", group = GRP_SCR)
  85. string scrSym5 = input.symbol("EGX:ETEL", "Symbol 5", inline = "s5", group = GRP_SCR)
  86. bool scrOn6 = input.bool(true, "", inline = "s6", group = GRP_SCR)
  87. string scrSym6 = input.symbol("EGX:SWDY", "Symbol 6", inline = "s6", group = GRP_SCR)
  88. bool scrOn7 = input.bool(true, "", inline = "s7", group = GRP_SCR)
  89. string scrSym7 = input.symbol("EGX:EAST", "Symbol 7", inline = "s7", group = GRP_SCR)
  90. bool scrOn8 = input.bool(true, "", inline = "s8", group = GRP_SCR)
  91. string scrSym8 = input.symbol("EGX:ABUK", "Symbol 8", inline = "s8", group = GRP_SCR)
  92. bool scrOn9 = input.bool(true, "", inline = "s9", group = GRP_SCR)
  93. string scrSym9 = input.symbol("EGX:FWRY", "Symbol 9", inline = "s9", group = GRP_SCR)
  94. bool scrOn10 = input.bool(true, "", inline = "s10", group = GRP_SCR)
  95. string scrSym10 = input.symbol("EGX:EFIH", "Symbol 10", inline = "s10", group = GRP_SCR)
  96.  
  97. string GRP_ALERT = "Alerts"
  98. bool alSeq = input.bool(true, "Whale Sequential 9", group = GRP_ALERT)
  99. bool alW9 = input.bool(true, "Whale 9 MA Cross", group = GRP_ALERT)
  100. bool al200D = input.bool(true, "200 Day MA Cross", group = GRP_ALERT)
  101. bool alBands = input.bool(true, "Whale Band Touch", group = GRP_ALERT)
  102.  
  103. float RAD_TO_DEG = 180.0 / math.pi
  104. string WHALE_ICON = "🐋"
  105. string MARK_CHAR = "⊕"
  106. int SCR_COLS = 6
  107. int SCR_ROWS = 13
  108.  
  109. metallicMean(int n) =>
  110. (n + math.sqrt(n * n + 4.0)) / 2.0
  111.  
  112. metalOrder(string s) =>
  113. switch s
  114. "Golden" => 1
  115. "Silver" => 2
  116. "Bronze" => 3
  117. => 1
  118.  
  119. mmwa(series float src, int len, float m) =>
  120. float sumW = 0.0
  121. float sumV = 0.0
  122. for i = 0 to len - 1
  123. float v = src[i]
  124. if not na(v)
  125. float w = math.pow(m, -i * m / len)
  126. sumW += w
  127. sumV += v * w
  128. sumW > 0.0 ? sumV / sumW : na
  129.  
  130. lowLag(series float src, int len) =>
  131. float e1 = ta.ema(src, len)
  132. float e2 = ta.ema(e1, len)
  133. float dema = 2.0 * e1 - e2
  134. ta.wma(dema, math.max(2, math.round(math.sqrt(len))))
  135.  
  136. angleDeg(series float src, int len, int atrLen) =>
  137. float a = ta.atr(atrLen)
  138. float d = src - src[len]
  139. nz(a) > 0.0 ? math.atan(nz(d) / (a * len)) * RAD_TO_DEG : 0.0
  140.  
  141. whaleSequential(series float src, int cmp, int angLen, int atrLen, float minAng, int target, bool early, int earlyMin, float decay) =>
  142. var int upCount = 0
  143. var int dnCount = 0
  144. var float upPeak = 0.0
  145. var float dnPeak = 0.0
  146. float ang = angleDeg(src, angLen, atrLen)
  147. bool upBar = src > nz(src[cmp], src) and ang > minAng
  148. bool dnBar = src < nz(src[cmp], src) and ang < -minAng
  149. upCount := upBar ? upCount + 1 : 0
  150. dnCount := dnBar ? dnCount + 1 : 0
  151. upPeak := upCount == 1 ? ang : upCount > 1 ? math.max(upPeak, ang) : 0.0
  152. dnPeak := dnCount == 1 ? ang : dnCount > 1 ? math.min(dnPeak, ang) : 0.0
  153. bool bearFull = upCount >= target
  154. bool bullFull = dnCount >= target
  155. bool bearEarly = early and not bearFull and upCount >= earlyMin and ang < upPeak * decay
  156. bool bullEarly = early and not bullFull and dnCount >= earlyMin and ang > dnPeak * decay
  157. int outUp = upCount
  158. int outDn = dnCount
  159. if bearFull or bearEarly
  160. upCount := 0
  161. upPeak := 0.0
  162. if bullFull or bullEarly
  163. dnCount := 0
  164. dnPeak := 0.0
  165. [outUp, outDn, bearFull, bullFull, bearEarly, bullEarly, ang]
  166.  
  167. whaleBands(series float src, int len, float m, float mult, int smooth) =>
  168. float basis = mmwa(src, len, m)
  169. float dev = mmwa(math.abs(src - nz(basis, src)), len, m)
  170. float devS = ta.ema(dev, smooth) * mult
  171. [basis, devS]
  172.  
  173. bandZone(float price, float basis, float dev) =>
  174. int z = 0
  175. if not na(basis) and not na(dev) and not na(price)
  176. 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
  177. z
  178.  
  179. bandZoneText(int z) =>
  180. z > 0 ? "Upper " + str.tostring(z) : z < 0 ? "Lower " + str.tostring(math.abs(z)) : "Inside"
  181.  
  182. screenerData() =>
  183. [sUp, sDn, sBearF, sBullF, sBearE, sBullE, sAng] = whaleSequential(close, seqCompare, seqAngleLen, seqAtrLen, seqMinAngle, seqTarget, seqEarly, seqEarlyMin, seqDecay)
  184. float sW9 = lowLag(close, w9Len)
  185. float sM200 = lowLag(close, len200D)
  186. [sBasis, sDev] = whaleBands(hlc3, bandLen, metallicMean(metalOrder(bandMetal)), bandMult, bandSmooth)
  187. int bearAgo = ta.barssince(sBearF or sBearE)
  188. int bullAgo = ta.barssince(sBullF or sBullE)
  189. int sigAct = not na(bearAgo) and bearAgo < scrRecent and (na(bullAgo) or bearAgo <= bullAgo) ? -1 : not na(bullAgo) and bullAgo < scrRecent ? 1 : 0
  190. int cnt = sUp > 0 ? sUp : sDn > 0 ? -sDn : 0
  191. int w9Rel = na(sW9) ? 0 : close > sW9 ? 1 : -1
  192. int m200Rel = na(sM200) ? 0 : close > sM200 ? 1 : -1
  193. [close, cnt, sigAct, w9Rel, m200Rel, bandZone(close, sBasis, sDev)]
  194.  
  195. pushLabel(array<label> arr, label lb, int maxN) =>
  196. arr.push(lb)
  197. while arr.size() > maxN
  198. label.delete(arr.shift())
  199.  
  200. tablePosition(string s) =>
  201. switch s
  202. "Top Left" => position.top_left
  203. "Top Center" => position.top_center
  204. "Top Right" => position.top_right
  205. "Middle Left" => position.middle_left
  206. "Middle Right" => position.middle_right
  207. "Bottom Left" => position.bottom_left
  208. "Bottom Center" => position.bottom_center
  209. => position.bottom_right
  210.  
  211. tableSize(string s) =>
  212. switch s
  213. "Tiny" => size.tiny
  214. "Small" => size.small
  215. "Normal" => size.normal
  216. => size.large
  217.  
  218. shortSymbol(string sym) =>
  219. array<string> parts = str.split(sym, ":")
  220. parts.size() > 0 ? parts.last() : sym
  221.  
  222. drawScreenerRow(table t, int r, string sym, float px, int cnt, int sig, int w9Rel, int m200Rel, int z, string sz) =>
  223. string cntTxt = sig < 0 ? "9 ▼" : sig > 0 ? "9 ▲" : cnt > 0 ? "▲ " + str.tostring(cnt) : cnt < 0 ? "▼ " + str.tostring(math.abs(cnt)) : "–"
  224. color cntCol = sig < 0 ? colScrBear : sig > 0 ? colScrBull : cnt > 0 ? color.new(colScrBull, 35) : cnt < 0 ? color.new(colScrBear, 35) : colScrText
  225. color w9Col = w9Rel > 0 ? colScrBull : w9Rel < 0 ? colScrBear : colScrText
  226. color mCol = m200Rel > 0 ? colScrBull : m200Rel < 0 ? colScrBear : colScrText
  227. color zCol = z > 0 ? colScrBear : z < 0 ? colScrBull : colScrText
  228. color rowBg = r % 2 == 0 ? colScrBg : color.new(color.from_gradient(50, 0, 100, colScrBg, colScrHead), 0)
  229. t.cell(0, r, shortSymbol(sym), text_color = colScrText, bgcolor = rowBg, text_size = sz, text_halign = text.align_left)
  230. t.cell(1, r, na(px) ? "n/a" : str.tostring(px, "#,##0.00##"), text_color = colScrText, bgcolor = rowBg, text_size = sz)
  231. t.cell(2, r, cntTxt, text_color = cntCol, bgcolor = rowBg, text_size = sz)
  232. t.cell(3, r, w9Rel > 0 ? "Above" : w9Rel < 0 ? "Below" : "–", text_color = w9Col, bgcolor = rowBg, text_size = sz)
  233. t.cell(4, r, m200Rel > 0 ? "Above" : m200Rel < 0 ? "Below" : "–", text_color = mCol, bgcolor = rowBg, text_size = sz)
  234. t.cell(5, r, na(px) ? "–" : bandZoneText(z), text_color = zCol, bgcolor = rowBg, text_size = sz)
  235.  
  236. float candleAngle = angleDeg(close, candleLen, candleAtrLen)
  237. float candleAccel = candleAngle - nz(candleAngle[1])
  238.  
  239. [seqUp, seqDn, seqBearFull, seqBullFull, seqBearEarly, seqBullEarly, seqAngle] = whaleSequential(close, seqCompare, seqAngleLen, seqAtrLen, seqMinAngle, seqTarget, seqEarly, seqEarlyMin, seqDecay)
  240.  
  241. float metalM = metallicMean(metalOrder(bandMetal))
  242. [bandBasis, bandDev] = whaleBands(bandSrc, bandLen, metalM, bandMult, bandSmooth)
  243. float up1 = bandBasis + bandDev * fib1
  244. float up2 = bandBasis + bandDev * fib2
  245. float up3 = bandBasis + bandDev * fib3
  246. float up4 = bandBasis + bandDev * fib4
  247. float up5 = bandBasis + bandDev * fib5
  248. float dn1 = bandBasis - bandDev * fib1
  249. float dn2 = bandBasis - bandDev * fib2
  250. float dn3 = bandBasis - bandDev * fib3
  251. float dn4 = bandBasis - bandDev * fib4
  252. float dn5 = bandBasis - bandDev * fib5
  253. int chartZone = bandZone(close, bandBasis, bandDev)
  254.  
  255. float whale9MA = lowLag(close, w9Len)
  256. bool isDailyChart = timeframe.isdaily and timeframe.multiplier == 1
  257. bool isWeeklyChart = timeframe.isweekly and timeframe.multiplier == 1
  258. float ma200DLocal = lowLag(close, len200D)
  259. float ma200WLocal = lowLag(close, len200W)
  260. float ma200DHtf = request.security(syminfo.tickerid, "D", lowLag(close, len200D)[1], lookahead = barmerge.lookahead_on)
  261. float ma200WHtf = request.security(syminfo.tickerid, "W", lowLag(close, len200W)[1], lookahead = barmerge.lookahead_on)
  262. float ma200D = isDailyChart ? ma200DLocal : ma200DHtf
  263. float ma200W = isWeeklyChart ? ma200WLocal : ma200WHtf
  264.  
  265. [scrPx1, scrCnt1, scrSig1, scrW91, scrM1, scrZ1] = request.security(scrSym1, scrTf, screenerData(), ignore_invalid_symbol = true)
  266. [scrPx2, scrCnt2, scrSig2, scrW92, scrM2, scrZ2] = request.security(scrSym2, scrTf, screenerData(), ignore_invalid_symbol = true)
  267. [scrPx3, scrCnt3, scrSig3, scrW93, scrM3, scrZ3] = request.security(scrSym3, scrTf, screenerData(), ignore_invalid_symbol = true)
  268. [scrPx4, scrCnt4, scrSig4, scrW94, scrM4, scrZ4] = request.security(scrSym4, scrTf, screenerData(), ignore_invalid_symbol = true)
  269. [scrPx5, scrCnt5, scrSig5, scrW95, scrM5, scrZ5] = request.security(scrSym5, scrTf, screenerData(), ignore_invalid_symbol = true)
  270. [scrPx6, scrCnt6, scrSig6, scrW96, scrM6, scrZ6] = request.security(scrSym6, scrTf, screenerData(), ignore_invalid_symbol = true)
  271. [scrPx7, scrCnt7, scrSig7, scrW97, scrM7, scrZ7] = request.security(scrSym7, scrTf, screenerData(), ignore_invalid_symbol = true)
  272. [scrPx8, scrCnt8, scrSig8, scrW98, scrM8, scrZ8] = request.security(scrSym8, scrTf, screenerData(), ignore_invalid_symbol = true)
  273. [scrPx9, scrCnt9, scrSig9, scrW99, scrM9, scrZ9] = request.security(scrSym9, scrTf, screenerData(), ignore_invalid_symbol = true)
  274. [scrPx10, scrCnt10, scrSig10, scrW910, scrM10, scrZ10] = request.security(scrSym10, scrTf, screenerData(), ignore_invalid_symbol = true)
  275.  
  276. color candleCol = candleAngle >= candleStrong ? colBullStrong : candleAngle > 0 ? (candleAccel >= 0 ? colBullWeak : color.new(colBullWeak, 25)) : candleAngle <= -candleStrong ? colBearStrong : (candleAccel <= 0 ? colBearWeak : color.new(colBearWeak, 25))
  277.  
  278. bool bearNine = showSeq and seqBearFull and barstate.isconfirmed
  279. bool bullNine = showSeq and seqBullFull and barstate.isconfirmed
  280. bool bearExhPt = showSeq and seqBearEarly and barstate.isconfirmed
  281. bool bullExhPt = showSeq and seqBullEarly and barstate.isconfirmed
  282. bool bearAny = bearNine or bearExhPt
  283. bool bullAny = bullNine or bullExhPt
  284. bool bearWhale = showWhaleLabel and bearAny and (not whaleBandOnly or high >= up1)
  285. bool bullWhale = showWhaleLabel and bullAny and (not whaleBandOnly or low <= dn1)
  286.  
  287. bool w9CrossUp = ta.crossover(close, whale9MA) and barstate.isconfirmed
  288. bool w9CrossDn = ta.crossunder(close, whale9MA) and barstate.isconfirmed
  289. bool m200CrossUp = ta.crossover(close, ma200D) and barstate.isconfirmed
  290. bool m200CrossDn = ta.crossunder(close, ma200D) and barstate.isconfirmed
  291.  
  292. bool upperTouch = ta.crossover(high, up1) and barstate.isconfirmed
  293. bool lowerTouch = ta.crossunder(low, dn1) and barstate.isconfirmed
  294.  
  295. plotcandle(open, high, low, close, "Whale Candles", color = showCandles ? candleCol : na, wickcolor = showCandles ? candleCol : na, bordercolor = showCandles ? candleCol : na, editable = false)
  296.  
  297. pUp1 = plot(showBands ? up1 : na, "Upper Band 1", na, editable = false)
  298. pUp2 = plot(showBands ? up2 : na, "Upper Band 2", na, editable = false)
  299. pUp3 = plot(showBands ? up3 : na, "Upper Band 3", na, editable = false)
  300. pUp4 = plot(showBands ? up4 : na, "Upper Band 4", na, editable = false)
  301. pUp5 = plot(showBands ? up5 : na, "Upper Band 5", na, editable = false)
  302. pDn1 = plot(showBands ? dn1 : na, "Lower Band 1", na, editable = false)
  303. pDn2 = plot(showBands ? dn2 : na, "Lower Band 2", na, editable = false)
  304. pDn3 = plot(showBands ? dn3 : na, "Lower Band 3", na, editable = false)
  305. pDn4 = plot(showBands ? dn4 : na, "Lower Band 4", na, editable = false)
  306. pDn5 = plot(showBands ? dn5 : na, "Lower Band 5", na, editable = false)
  307.  
  308. fill(pUp1, pUp2, up2, up1, color.new(colUpperBand, 84), color.new(colUpperBand, 92), "Upper Zone 1")
  309. fill(pUp2, pUp3, up3, up2, color.new(colUpperBand, 74), color.new(colUpperBand, 84), "Upper Zone 2")
  310. fill(pUp3, pUp4, up4, up3, color.new(colUpperBand, 64), color.new(colUpperBand, 74), "Upper Zone 3")
  311. fill(pUp4, pUp5, up5, up4, color.new(colUpperBand, 55), color.new(colUpperBand, 64), "Upper Zone 4")
  312. fill(pDn1, pDn2, dn1, dn2, color.new(colLowerBand, 92), color.new(colLowerBand, 84), "Lower Zone 1")
  313. fill(pDn2, pDn3, dn2, dn3, color.new(colLowerBand, 84), color.new(colLowerBand, 74), "Lower Zone 2")
  314. fill(pDn3, pDn4, dn3, dn4, color.new(colLowerBand, 74), color.new(colLowerBand, 64), "Lower Zone 3")
  315. fill(pDn4, pDn5, dn4, dn5, color.new(colLowerBand, 64), color.new(colLowerBand, 55), "Lower Zone 4")
  316.  
  317. pW9 = plot(showW9 ? whale9MA : na, "Whale 9 MA", colW9, 1)
  318. pPrice = plot(showW9 and showW9Fill ? close : na, "Whale 9 Price Anchor", na, editable = false)
  319. fill(pW9, pPrice, color = showW9 and showW9Fill ? color.new(colW9Fill, 75) : na, title = "Whale 9 MA Fill")
  320. plot(show200D ? ma200D : na, "200 Day MA", col200D, maWidth200)
  321. plot(show200W ? ma200W : na, "200 Week MA", col200W, maWidth200)
  322.  
  323. var array<label> markLabels = array.new<label>()
  324. if showSeqMarks and bearExhPt
  325. 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)
  326. if showSeqMarks and bullExhPt
  327. 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)
  328.  
  329. var array<label> seqLabels = array.new<label>()
  330.  
  331. if showSeqNine and bearNine
  332. 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)
  333. if showSeqNine and bullNine
  334. 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)
  335. if bearWhale
  336. 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)
  337. if bullWhale
  338. 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)
  339.  
  340. array<bool> scrOnArr = array.from(scrOn1, scrOn2, scrOn3, scrOn4, scrOn5, scrOn6, scrOn7, scrOn8, scrOn9, scrOn10)
  341. array<int> scrW9Arr = array.from(scrW91, scrW92, scrW93, scrW94, scrW95, scrW96, scrW97, scrW98, scrW99, scrW910)
  342. array<int> scrMArr = array.from(scrM1, scrM2, scrM3, scrM4, scrM5, scrM6, scrM7, scrM8, scrM9, scrM10)
  343. array<int> scrSigArr = array.from(scrSig1, scrSig2, scrSig3, scrSig4, scrSig5, scrSig6, scrSig7, scrSig8, scrSig9, scrSig10)
  344. int statActive = 0
  345. int statBull = 0
  346. int statBear = 0
  347. int statNines = 0
  348. if barstate.islast
  349. for i = 0 to 9
  350. if scrOnArr.get(i)
  351. statActive += 1
  352. int w = nz(scrW9Arr.get(i))
  353. int m = nz(scrMArr.get(i))
  354. statBull += w > 0 and m > 0 ? 1 : 0
  355. statBear += w < 0 and m < 0 ? 1 : 0
  356. statNines += nz(scrSigArr.get(i)) != 0 ? 1 : 0
  357.  
  358. 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)
  359.  
  360. if barstate.islast and showScreener
  361. string sz = tableSize(scrSizeStr)
  362. scrTable.clear(0, 0, SCR_COLS - 1, SCR_ROWS - 1)
  363. scrTable.cell(0, 0, WHALE_ICON + " Whale Screener [" + scrTf + "]", text_color = colScrText, bgcolor = colScrHead, text_size = sz)
  364. scrTable.merge_cells(0, 0, SCR_COLS - 1, 0)
  365. array<string> heads = array.from("Symbol", "Price", str.tostring(seqTarget) + "-Count", "Whale 9 MA", "200 MA", "Whale Bands")
  366. for c = 0 to SCR_COLS - 1
  367. scrTable.cell(c, 1, heads.get(c), text_color = colScrText, bgcolor = color.new(colScrHead, 30), text_size = sz)
  368. int r = 2
  369. if scrOn1
  370. drawScreenerRow(scrTable, r, scrSym1, scrPx1, scrCnt1, scrSig1, scrW91, scrM1, scrZ1, sz)
  371. r += 1
  372. if scrOn2
  373. drawScreenerRow(scrTable, r, scrSym2, scrPx2, scrCnt2, scrSig2, scrW92, scrM2, scrZ2, sz)
  374. r += 1
  375. if scrOn3
  376. drawScreenerRow(scrTable, r, scrSym3, scrPx3, scrCnt3, scrSig3, scrW93, scrM3, scrZ3, sz)
  377. r += 1
  378. if scrOn4
  379. drawScreenerRow(scrTable, r, scrSym4, scrPx4, scrCnt4, scrSig4, scrW94, scrM4, scrZ4, sz)
  380. r += 1
  381. if scrOn5
  382. drawScreenerRow(scrTable, r, scrSym5, scrPx5, scrCnt5, scrSig5, scrW95, scrM5, scrZ5, sz)
  383. r += 1
  384. if scrOn6
  385. drawScreenerRow(scrTable, r, scrSym6, scrPx6, scrCnt6, scrSig6, scrW96, scrM6, scrZ6, sz)
  386. r += 1
  387. if scrOn7
  388. drawScreenerRow(scrTable, r, scrSym7, scrPx7, scrCnt7, scrSig7, scrW97, scrM7, scrZ7, sz)
  389. r += 1
  390. if scrOn8
  391. drawScreenerRow(scrTable, r, scrSym8, scrPx8, scrCnt8, scrSig8, scrW98, scrM8, scrZ8, sz)
  392. r += 1
  393. if scrOn9
  394. drawScreenerRow(scrTable, r, scrSym9, scrPx9, scrCnt9, scrSig9, scrW99, scrM9, scrZ9, sz)
  395. r += 1
  396. if scrOn10
  397. drawScreenerRow(scrTable, r, scrSym10, scrPx10, scrCnt10, scrSig10, scrW910, scrM10, scrZ10, sz)
  398. r += 1
  399. string footer = "Bullish " + str.tostring(statBull) + "/" + str.tostring(statActive) + " Bearish " + str.tostring(statBear) + "/" + str.tostring(statActive) + " Active 9s " + str.tostring(statNines)
  400. scrTable.cell(0, r, footer, text_color = colScrText, bgcolor = colScrHead, text_size = sz)
  401. scrTable.merge_cells(0, r, SCR_COLS - 1, r)
  402. else if barstate.islast and not showScreener
  403. scrTable.clear(0, 0, SCR_COLS - 1, SCR_ROWS - 1)
  404.  
  405. string tk = syminfo.ticker + " (" + timeframe.period + ")"
  406. if alSeq and (bullNine or bullExhPt)
  407. alert("Whale Kit: Bullish Sequential 9 on " + tk + " at " + str.tostring(close, format.mintick), alert.freq_once_per_bar_close)
  408. if alSeq and (bearNine or bearExhPt)
  409. alert("Whale Kit: Bearish Sequential 9 on " + tk + " at " + str.tostring(close, format.mintick), alert.freq_once_per_bar_close)
  410. if alW9 and w9CrossUp
  411. alert("Whale Kit: " + tk + " crossed above the Whale 9 MA", alert.freq_once_per_bar_close)
  412. if alW9 and w9CrossDn
  413. alert("Whale Kit: " + tk + " crossed below the Whale 9 MA", alert.freq_once_per_bar_close)
  414. if al200D and m200CrossUp
  415. alert("Whale Kit: " + tk + " crossed above the 200 Day MA", alert.freq_once_per_bar_close)
  416. if al200D and m200CrossDn
  417. alert("Whale Kit: " + tk + " crossed below the 200 Day MA", alert.freq_once_per_bar_close)
  418. if alBands and upperTouch
  419. alert("Whale Kit: " + tk + " touched the upper Whale Fibonacci Band", alert.freq_once_per_bar_close)
  420. if alBands and lowerTouch
  421. 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