xmd79

PRIME - ShadoW ZoneZ with RSI Levels

Dec 11th, 2022
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 40.63 KB | None | 0 0
  1. // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
  2. // INTELLECTUAL PROPERTY OF © prim3associat3s and PRIME ASSOCIATES LLC. Use under HUMANITARIAN INTENT!
  3. // This script is provided to the public, free to use. Welcome to the table. Dee Prime
  4.  
  5. //@version=5
  6. indicator('PRIME - ShadoW ZoneZ with RSI Levels', 'ShadoW ZoneZ', true)
  7. // 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987
  8.  
  9. // INPUTS {{{
  10. var max_array_size = 21 // [6, 3] matrix
  11.  
  12. // TREND
  13. src = input.source(close, 'Source', group='Trend')
  14. small_period = input.int(8, 'Small Length', group='Trend')
  15. medium_period = input.int(21, 'Medium Length', group='Trend')
  16. trend_use_colors = input.bool(true, 'Use Color Coding', group='Trend')
  17. trend_color_default = input.color(color.white, 'Default', group='Trend')
  18.  
  19. // sight 1
  20. show_sight_small = input.bool(false, 'Show Small Sight', group='Small Sight')
  21. sight_small_width = input.int(2, 'Line width', minval=1, group='Small Sight')
  22. sight_small_styleI = input.string('Solid', 'Line style', options=['Solid', 'Dashed', 'Dotted'], group='Small Sight')
  23. sight_small_style = sight_small_styleI == 'Solid' ? line.style_solid : sight_small_styleI == 'Dashed' ? line.style_dashed : line.style_dotted
  24.  
  25. // sight 2
  26. show_sight_medium = input.bool(false, 'Show Medium Sight', group='Medium Sight')
  27. sight_medium_width = input.int(2, 'Line Width', minval=1, group='Medium Sight')
  28. sight_medium_styleI = input.string('Solid', 'Line style', options=['Solid', 'Dashed', 'Dotted'], group='Medium Sight')
  29. sight_medium_style = sight_medium_styleI == 'Solid' ? line.style_solid : sight_medium_styleI == 'Dashed' ? line.style_dashed : line.style_dotted
  30.  
  31. // Trend SECTION 1 (small)
  32. trend_s1_line_color_up = input.color(color.new(color.blue, 10), 'Uptrend', group='Trend Section 1', inline='TColor')
  33. trend_s1_line_color_dn = input.color(color.new(color.orange, 10), 'Downtrend', group='Trend Section 1', inline='TColor')
  34. trend_s1_line_width = input.int(4, 'Lines width', minval=1, group='Trend Section 1')
  35. trend_s1_line_styleI = input.string('Solid', 'Line style', options=['Solid', 'Dashed', 'Dotted'], group='Trend Section 1')
  36. trend_s1_line_style = trend_s1_line_styleI == 'Solid' ? line.style_solid : trend_s1_line_styleI == 'Dashed' ? line.style_dashed : line.style_dotted
  37. trend_s1_line_extend = input.bool(true, 'Extend Lines', group='Trend Section 1')
  38. trend_s1_xline_width = input.int(2, 'Lines width', minval=1, group='Trend Section 1')
  39. trend_s1_xline_styleI = input.string('Dashed', 'Line style', options=['Solid', 'Dashed', 'Dotted'], group='Trend Section 1')
  40. trend_s1_xline_style = trend_s1_xline_styleI == 'Solid' ? line.style_solid : trend_s1_xline_styleI == 'Dashed' ? line.style_dashed : line.style_dotted
  41.  
  42. // SECTION 2 (medium)
  43. trend_s2_line_color_up = input.color(color.new(color.green, 40), 'Uptrend', group='Trend Section 2', inline='TColor2')
  44. trend_s2_line_color_dn = input.color(color.new(color.red, 40), 'Downtrend', group='Trend Section 2', inline='TColor2')
  45. trend_s2_line_width = input.int(4, 'Lines width', minval=1, group='Trend Section 2')
  46. trend_s2_line_styleI = input.string('Solid', 'Line style', options=['Solid', 'Dashed', 'Dotted'], group='Trend Section 2')
  47. trend_s2_line_style = trend_s2_line_styleI == 'Solid' ? line.style_solid : trend_s2_line_styleI == 'Dashed' ? line.style_dashed : line.style_dotted
  48. trend_s2_line_extend = input.bool(true, 'Extend Lines', group='Trend Section 2')
  49. trend_s2_xline_width = input.int(2, 'Extend Lines width', minval=1, group='Trend Section 2')
  50. trend_s2_xline_styleI = input.string('Dashed', 'Extend Line style', options=['Solid', 'Dashed', 'Dotted'], group='Trend Section 2')
  51. trend_s2_xline_style = trend_s2_xline_styleI == 'Solid' ? line.style_solid : trend_s2_xline_styleI == 'Dashed' ? line.style_dashed : line.style_dotted
  52.  
  53. // FIBONACCI
  54. fib_reverse = input.bool(false, 'Reverse Levels', group='Fibonacci')
  55. show_fib_src_line = input.bool(false, 'Show from / to source line', group='Fibonacci')
  56. show_fib_src_label = input.bool(true, 'Show from / to source labels', group='Fibonacci')
  57. fib_use_colors = input.bool(false, 'Use Color Coding', group='Fibonacci')
  58. fib_color_resistance = input.color(#e91e63, 'Resistance', group='Fibonacci', inline='Color2')
  59. fib_color_support = input.color(#2196f3, 'Support', group='Fibonacci', inline='Color2')
  60. fib_color_default = input.color(color.white, 'Default', group='Fibonacci', inline='Color2')
  61. fib_lvl_line_width = input.int(2, 'Levels line width', minval=1, group='Fibonacci')
  62. fib_lvl_line_style_activeI = input.string('Solid', 'Levels line style: active', options=['Solid', 'Dashed', 'Dotted'], group='Fibonacci')
  63. fib_lvl_line_style_active = fib_lvl_line_style_activeI == 'Solid' ? line.style_solid : fib_lvl_line_style_activeI == 'Dashed' ? line.style_dashed : line.style_dotted
  64. fib_lvl_line_style_inactiveI = input.string('Dotted', 'Levels line style: inactive', options=['Solid', 'Dashed', 'Dotted'], group='Fibonacci')
  65. fib_lvl_line_style_inactive = fib_lvl_line_style_inactiveI == 'Solid' ? line.style_solid : fib_lvl_line_style_inactiveI == 'Dashed' ? line.style_dashed : line.style_dotted
  66. fib_lvl_line_length_left = input.int(24, 'Extend line left', minval=0, group='Fibonacci')
  67. fib_lvl_line_length_right = input.int(18, 'Extend line right', minval=0, group='Fibonacci')
  68.  
  69. // DATA
  70. show_sm_coord_labels = input.bool(false, 'Show SM Labels', group='H/L Data')
  71. show_md_coord_labels = input.bool(false, 'Show MD Labels', group='H/L Data')
  72. // show_dev = input(false, "Show DEV Labels", group="Devtools")
  73. // }}}
  74.  
  75. // FUNCTIONS {{{
  76.  
  77. // -- TIME {{{
  78. candle_size_ms = time - time[1] // milliseconds of a candle
  79.  
  80. toCandles(ms) => // {{{ total x units in ms
  81. int res = na
  82. int m = timeframe.multiplier
  83. if timeframe.isseconds
  84. res := ms / 1000 / m
  85. res
  86. if timeframe.isminutes
  87. res := ms / 1000 / 60 / m
  88. res
  89. if timeframe.isdaily
  90. res := ms / 1000 / 60 / 60 / 24 / m
  91. res
  92. if timeframe.isweekly
  93. res := ms / 1000 / 60 / 60 / 24 / 7 / m
  94. res
  95. if timeframe.ismonthly
  96. res := ms / 1000 / 60 / 60 / 24 / 7 / 4 / m
  97. res
  98. res
  99. // }}}
  100.  
  101. getCandleSize() => // ms of 1 candle {{{
  102. // get previous open x, get previous close x, substract return diff
  103. var int p1 = time[1]
  104. var int p2 = time[2]
  105. p1 - p2
  106. // }}}
  107. // }}}
  108.  
  109. // -- COORDS {{{
  110.  
  111. getHHLL(isUptrend, val1, val2) => // : string {{{
  112. isUptrend ? val1 > val2 ? 'HH' : 'LH' : val1 < val2 ? 'LL' : 'HL'
  113. // }}}
  114.  
  115. add_to_bag(bag_id, value, barTime, barPrice) => // {{{
  116. array.unshift(bag_id, barPrice)
  117. array.unshift(bag_id, barTime)
  118. array.unshift(bag_id, value)
  119. if array.size(bag_id) > max_array_size // {{{
  120. array.pop(bag_id)
  121. array.pop(bag_id)
  122. array.pop(bag_id)
  123. // }}}
  124. // }}}
  125.  
  126. update_bag(bag_id, value, barTime, barPrice, direction) => // {{{
  127. // if bag empty add first ball
  128. if array.size(bag_id) == 0 // {{{
  129. add_to_bag(bag_id, value, barTime, barPrice)
  130. else
  131. // }}}
  132. // {{{ if new is higher or lower than previous in current direction, swap ball 1
  133. if direction == 1 and value > array.get(bag_id, 0) or direction == -1 and value < array.get(bag_id, 0) // {{{
  134. array.set(bag_id, 0, value)
  135. array.set(bag_id, 1, barTime)
  136. array.set(bag_id, 2, barPrice)
  137. // }}}
  138. 0
  139. // }}}
  140. // }}}
  141.  
  142. calcMidpoint(x1, y1, x2, y2) => // [ x, y ] {{{
  143. var int x = na
  144. var float y = na
  145. x := (x1 + x2) / 2
  146. y := (y1 + y2) / 2
  147. [x, y]
  148. // }}}
  149.  
  150. getDirection(v1, v2) => // ( 1, 0, -1 ) {{{
  151. v1 < v2 ? 1 : v1 > v2 ? -1 : 0
  152. // }}}
  153.  
  154. // }}}
  155.  
  156. // -- FIBS {{{
  157.  
  158. buildArray(v1, v2, v3, v4, v5, v6, v7) => // [array] {{{
  159. _arr = array.new_float(0)
  160. array.push(_arr, v1)
  161. array.push(_arr, v2)
  162. array.push(_arr, v3)
  163. array.push(_arr, v4)
  164. array.push(_arr, v5)
  165. array.push(_arr, v6)
  166. array.push(_arr, v7)
  167. _arr
  168. // }}}
  169.  
  170. fibLevel(H, L, F) => // {{{
  171. fib_reverse ? (H - L) * F + L : H - (H - L) * F
  172. // }}}
  173.  
  174. getFibRetracements(dir, L, H) => // [fib array] {{{
  175. // 1, 23.6%, 38.2%, 50%, 61.8%, and 78.6%, 0
  176. _fibs = array.new_float(0)
  177. array.push(_fibs, H)
  178. array.push(_fibs, fibLevel(H, L, 23.6 / 100))
  179. array.push(_fibs, fibLevel(H, L, 38.2 / 100))
  180. array.push(_fibs, fibLevel(H, L, 50.0 / 100))
  181. array.push(_fibs, fibLevel(H, L, 61.8 / 100))
  182. array.push(_fibs, fibLevel(H, L, 78.6 / 100))
  183. array.push(_fibs, L)
  184. _fibs
  185. // }}}
  186.  
  187. getFibState(dir, prevlvl, thislvl, nextlvl) => // {{{
  188. // states: ----------------------------------
  189. // 0 = resistance actively moving up (yellow)
  190. // 1 = resistance far / crossed
  191. // 2 = resistance next
  192. // -- ($$PRRRIIICE$$)
  193. // 3 = support next
  194. // 4 = support far
  195. // 5 = support actively moving down (fuchsia)
  196. //-------------------------------------------
  197. state = dir == 1 and prevlvl == -1 ? thislvl == high ? 0 : close > thislvl ? 3 : close < nextlvl ? 1 : 2 : dir == 1 and nextlvl == -1 ? close < thislvl ? 2 : close > nextlvl ? 4 : 3 : dir == 1 ? close >= thislvl and close <= prevlvl ? 3 : close >= thislvl and close >= prevlvl ? 4 : close <= thislvl and close >= nextlvl ? 2 : close <= thislvl and close <= nextlvl ? 1 : -1 : dir == -1 and nextlvl == -1 ? close > thislvl ? 3 : close < prevlvl ? 1 : 2 : dir == -1 and prevlvl == -1 ? thislvl == low ? 5 : close < thislvl ? 2 : close > nextlvl ? 4 : 3 : dir == -1 ? close >= thislvl and close <= nextlvl ? 3 : close >= thislvl and close >= nextlvl ? 4 : close <= thislvl and close >= prevlvl ? 2 : close <= thislvl and close <= prevlvl ? 1 : -1 : -1
  198. state
  199. // source up top
  200. // source up bottom
  201. // source up non-edge ( towards next )
  202. // next support ( $ > T and $ < Prev ) 3
  203. // far support ( $ > T and $ > Prev ) 4
  204. // next resistance ( $ < T and $ > Next ) 2
  205. // far resistance ( $ < T and $ < Next ) 1
  206. // source down top
  207. // source down bottom
  208. // source down non-edge ( towards prev )
  209. // next support ( $ > T and $ < Prev ) 3
  210. // far support ( $ > T and $ > Prev ) 4
  211. // next resistance ( $ < T and $ > Next ) 2
  212. // far resistance ( $ < T and $ < Next ) 1
  213. // }}}
  214.  
  215. drawFibLvLine(v, state) => // {{{
  216. // plvl, state
  217. tfrom = time - candle_size_ms * fib_lvl_line_length_left
  218. tto = time + candle_size_ms * fib_lvl_line_length_right
  219. // states: ----------------------------------
  220. // 0 = resistance actively moving up (yellow)
  221. // 1 = resistance far / crossed
  222. // 2 = resistance next
  223. // 3 = support next
  224. // 4 = support far
  225. // 5 = support actively moving down (fuchsia)
  226. //-------------------------------------------
  227. // fib_use_colors
  228. // fib_color_resistance
  229. // fib_color_support
  230. // fib_color_default
  231. //-------------------------------------------
  232. state_width = fib_lvl_line_width
  233. state_style = state == 2 or state == 3 or state == 0 ? fib_lvl_line_style_active : fib_lvl_line_style_inactive
  234. state_color = fib_use_colors == false ? fib_color_default : state == 0 ? fib_color_default : state == 1 ? fib_color_resistance : state == 2 ? fib_color_resistance : state == 3 ? fib_color_support : state == 4 ? fib_color_support : state == 5 ? fib_color_default : fib_color_default
  235.  
  236. line.new(x1=tfrom, y1=v, x2=tto, y2=v, xloc=xloc.bar_time, style=state_style, color=state_color, width=state_width, extend=extend.none)
  237. // }}}
  238.  
  239. drawFibLvLabel(dir, pos, flvl, plvl, state) => // {{{
  240. // id, flvl, plvl
  241. // fib order | fib level | price at level
  242. // states: ----------------------------------
  243. // 0 = resistance actively moving up (yellow)
  244. // 1 = resistance far / crossed
  245. // 2 = resistance next
  246. // 3 = support next
  247. // 4 = support far
  248. // 5 = support actively moving down (fuchsia)
  249. //-------------------------------------------
  250. state_color = fib_use_colors == false ? fib_color_default : state == 0 ? fib_color_default : state == 1 ? fib_color_resistance : state == 2 ? fib_color_resistance : state == 3 ? fib_color_support : state == 4 ? fib_color_support : state == 5 ? fib_color_default : fib_color_default
  251. lbltxtcol = color.white
  252. lbltxt = '◄ ' // + flvl
  253. // other = "⁌ • ⚊ ⚟ ⚬ ❮ ↤ ⥰ "
  254. //flvl // tostring(flvl) // + " ( " + tostring(int(plvl)) + " )"
  255. tx = time + candle_size_ms * (fib_lvl_line_length_right + 1)
  256. //
  257. label.new(x=tx, y=plvl, text=lbltxt, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.white, 100), style=label.style_label_left, textcolor=state_color, size=size.normal, textalign=text.align_left, tooltip='Fib: ' + flvl + '\nPrice: ' + str.tostring(int(plvl)))
  258. // }}}
  259.  
  260. drawFibSrcLine(dir, x1, y1, x2, y2) => // passing in as L/H but still checking inside {{{
  261. // determine H and L inside here, since we need the direction to be passed in anyways
  262. _H = math.max(y1, y2) == y1 ? y1 : y2
  263. _L = math.min(y1, y2) == y1 ? y1 : y2
  264. //
  265. xH = _H == y1 ? x1 : x2
  266. yH = _H == y1 ? y1 : y2
  267. xL = _L == y1 ? x1 : x2
  268. yL = _L == y1 ? y1 : y2
  269. //
  270. col = fib_use_colors ? dir == 1 ? fib_color_support : fib_color_resistance : fib_color_default
  271. //
  272. line.new(dir == 1 ? xL : xH, dir == 1 ? yL : yH, dir == 1 ? xH : xL, dir == 1 ? yH : yL, extend=extend.none, xloc=xloc.bar_time, color=col, style=line.style_dotted, width=3)
  273. // }}}
  274.  
  275. drawFibSrcLabel(tf, pos, x, y) => // passing in as low high already {{{
  276. // show_fib_src_label
  277. _txtcol = fib_use_colors ? pos == 'H' ? fib_color_resistance : fib_color_support : fib_color_default
  278. _text = pos == 'H' ? 'H\n▼' : '▲\nL'
  279. _yloc = pos == 'H' ? yloc.abovebar : yloc.belowbar
  280. _style = pos == 'H' ? label.style_label_down : label.style_label_up
  281. _ttH = tf + ' Fib High \n$( ' + str.tostring(y) + ' )'
  282. _ttL = tf + ' Fib Low \n$( ' + str.tostring(y) + ' )'
  283. _tooltip = pos == 'H' ? _ttH : _ttL
  284. _clear = color.new(color.black, 100)
  285. //
  286. label.new(x, y, xloc=xloc.bar_time, yloc=_yloc, color=_clear, textcolor=_txtcol, style=_style, size=size.small, text=_text, tooltip=_tooltip)
  287. // }}}
  288.  
  289. // }}}
  290.  
  291. // }}}
  292.  
  293. // ----------------------------------------------- COORDENATES {{{
  294.  
  295. // -----> FIND COORDS - MD {{{
  296.  
  297. // MD - Declarations {{{
  298. md_coord_src = src
  299. md_coord_period = medium_period
  300. var float md_high_coord = na
  301. var float md_low_coord = na
  302. var bool md_is_new_md_high_coord = false
  303. var bool md_is_new_md_low_coord = false
  304. var md_coord_direction = 0
  305. var md_bag = array.new_float(0)
  306. var bool md_b1_changed = false
  307. var bool md_b2_changed = false
  308. var bool md_b3_changed = false
  309. var bool md_b4_changed = false
  310. var bool md_b5_changed = false
  311. var bool md_b6_changed = false
  312. var bool md_b7_changed = false
  313. var bool md_bag_ready = false
  314. var float md_now_v = na
  315. var int md_now_x = na
  316. var float md_now_y = na
  317. var float md_b1_v = na
  318. var int md_b1_x = na
  319. var float md_b1_y = na
  320. var float md_b2_v = na
  321. var int md_b2_x = na
  322. var float md_b2_y = na
  323. var float md_b3_v = na
  324. var int md_b3_x = na
  325. var float md_b3_y = na
  326. var float md_b4_v = na
  327. var int md_b4_x = na
  328. var float md_b4_y = na
  329. var float md_b5_v = na
  330. var int md_b5_x = na
  331. var float md_b5_y = na
  332. var float md_b6_v = na
  333. var int md_b6_x = na
  334. var float md_b6_y = na
  335. var float md_b7_v = na
  336. var int md_b7_x = na
  337. var float md_b7_y = na
  338. // }}}
  339.  
  340. // MD - Find new coord {{{
  341. md_now_v := md_coord_src
  342. md_now_x := time
  343. md_now_y := close
  344. md_high_coord := ta.highestbars(md_now_v, md_coord_period) == 0 ? md_now_v : na
  345. md_low_coord := ta.lowestbars(md_now_v, md_coord_period) == 0 ? md_now_v : na
  346. md_is_new_md_high_coord := md_high_coord and na(md_low_coord)
  347. md_is_new_md_low_coord := md_low_coord and na(md_high_coord)
  348. md_coord_direction := md_is_new_md_high_coord ? 1 : md_is_new_md_low_coord ? -1 : md_coord_direction
  349. // }}}
  350.  
  351. // MD - Update Bag {{{
  352. md_coord_direction_changed = ta.change(md_coord_direction)
  353. if md_coord_direction_changed
  354. add_to_bag(md_bag, md_coord_direction == 1 ? md_high_coord : md_low_coord, time, src)
  355. else
  356. update_bag(md_bag, md_coord_direction == 1 ? md_high_coord : md_low_coord, time, src, md_coord_direction)
  357. // }}}
  358.  
  359. // MD - Grab coords {{{
  360. md_bag_ready := array.size(md_bag) > 18 ? true : false
  361. md_b1_v := md_bag_ready ? math.round(array.get(md_bag, 0)) : na
  362. md_b1_x := md_bag_ready ? math.round(array.get(md_bag, 1)) : na
  363. md_b1_y := md_bag_ready ? array.get(md_bag, 2) : na
  364. md_b2_v := md_bag_ready ? math.round(array.get(md_bag, 3)) : na
  365. md_b2_x := md_bag_ready ? math.round(array.get(md_bag, 4)) : na
  366. md_b2_y := md_bag_ready ? array.get(md_bag, 5) : na
  367. md_b3_v := md_bag_ready ? math.round(array.get(md_bag, 6)) : na
  368. md_b3_x := md_bag_ready ? math.round(array.get(md_bag, 7)) : na
  369. md_b3_y := md_bag_ready ? array.get(md_bag, 8) : na
  370. md_b4_v := md_bag_ready ? math.round(array.get(md_bag, 9)) : na
  371. md_b4_x := md_bag_ready ? math.round(array.get(md_bag, 10)) : na
  372. md_b4_y := md_bag_ready ? array.get(md_bag, 11) : na
  373. md_b5_v := md_bag_ready ? math.round(array.get(md_bag, 12)) : na
  374. md_b5_x := md_bag_ready ? math.round(array.get(md_bag, 13)) : na
  375. md_b5_y := md_bag_ready ? array.get(md_bag, 14) : na
  376. md_b6_v := md_bag_ready ? math.round(array.get(md_bag, 15)) : na
  377. md_b6_x := md_bag_ready ? math.round(array.get(md_bag, 16)) : na
  378. md_b6_y := md_bag_ready ? array.get(md_bag, 17) : na
  379. md_b7_v := md_bag_ready ? math.round(array.get(md_bag, 18)) : na
  380. md_b7_x := md_bag_ready ? math.round(array.get(md_bag, 19)) : na
  381. md_b7_y := md_bag_ready ? array.get(md_bag, 20) : na
  382. // }}}
  383.  
  384. // MD - Watch changes {{{
  385. md_b1_changed := ta.change(md_b1_y) or ta.change(md_b1_x) or ta.change(md_b1_v) ? true : false
  386. md_b2_changed := ta.change(md_b2_y) or ta.change(md_b2_x) or ta.change(md_b2_v) ? true : false
  387. md_b3_changed := ta.change(md_b3_y) or ta.change(md_b3_x) or ta.change(md_b3_v) ? true : false
  388. md_b4_changed := ta.change(md_b4_y) or ta.change(md_b4_x) or ta.change(md_b4_v) ? true : false
  389. md_b5_changed := ta.change(md_b5_y) or ta.change(md_b5_x) or ta.change(md_b5_v) ? true : false
  390. md_b6_changed := ta.change(md_b6_y) or ta.change(md_b6_x) or ta.change(md_b6_v) ? true : false
  391. md_b7_changed := ta.change(md_b7_y) or ta.change(md_b7_x) or ta.change(md_b7_v) ? true : false
  392. // }}}
  393.  
  394. // }}}
  395.  
  396. // -----> FIND COORDS - SM {{{
  397.  
  398. // SM - Declarations {{{
  399. sm_coord_src = src
  400. sm_coord_period = small_period
  401. var float sm_high_ball = na
  402. var float sm_low_ball = na
  403. var bool sm_is_new_sm_high_ball = false
  404. var bool sm_is_new_sm_low_ball = false
  405. var sm_ball_direction = 0
  406. var sm_bag = array.new_float(0)
  407. var bool sm_b1_changed = false
  408. var bool sm_b2_changed = false
  409. var bool sm_b3_changed = false
  410. var bool sm_b4_changed = false
  411. var bool sm_b5_changed = false
  412. var bool sm_b6_changed = false
  413. var bool sm_b7_changed = false
  414. var bool sm_bag_ready = false
  415. var float sm_b1_v = na
  416. var int sm_b1_x = na
  417. var float sm_b1_y = na
  418. var float sm_b2_v = na
  419. var int sm_b2_x = na
  420. var float sm_b2_y = na
  421. var float sm_b3_v = na
  422. var int sm_b3_x = na
  423. var float sm_b3_y = na
  424. var float sm_b4_v = na
  425. var int sm_b4_x = na
  426. var float sm_b4_y = na
  427. var float sm_b5_v = na
  428. var int sm_b5_x = na
  429. var float sm_b5_y = na
  430. var float sm_b6_v = na
  431. var int sm_b6_x = na
  432. var float sm_b6_y = na
  433. var float sm_b7_v = na
  434. var int sm_b7_x = na
  435. var float sm_b7_y = na
  436. var float sm_now_v = na
  437. var int sm_now_x = na
  438. var float sm_now_y = na
  439. // }}}
  440.  
  441. // SM - Find New coords {{{
  442. sm_now_v := sm_coord_src
  443. sm_now_x := time
  444. sm_now_y := close
  445. sm_high_ball := ta.highestbars(sm_now_v, sm_coord_period) == 0 ? sm_now_v : na
  446. sm_low_ball := ta.lowestbars(sm_now_v, sm_coord_period) == 0 ? sm_now_v : na
  447. sm_is_new_sm_high_ball := sm_high_ball and na(sm_low_ball)
  448. sm_is_new_sm_low_ball := sm_low_ball and na(sm_high_ball)
  449. sm_ball_direction := sm_is_new_sm_high_ball ? 1 : sm_is_new_sm_low_ball ? -1 : sm_ball_direction
  450. // }}}
  451.  
  452. // SM - Update bag {{{
  453. sm_ball_direction_changed = ta.change(sm_ball_direction)
  454. if sm_ball_direction_changed
  455. add_to_bag(sm_bag, sm_ball_direction == 1 ? sm_high_ball : sm_low_ball, time, src)
  456. else
  457. update_bag(sm_bag, sm_ball_direction == 1 ? sm_high_ball : sm_low_ball, time, src, sm_ball_direction)
  458. // }}}
  459.  
  460. // SM - Grab coords {{{
  461. sm_bag_ready := array.size(sm_bag) > 18 ? true : false
  462. sm_b1_v := sm_bag_ready ? math.round(array.get(sm_bag, 0)) : na
  463. sm_b1_x := sm_bag_ready ? math.round(array.get(sm_bag, 1)) : na
  464. sm_b1_y := sm_bag_ready ? array.get(sm_bag, 2) : na
  465. sm_b2_v := sm_bag_ready ? math.round(array.get(sm_bag, 3)) : na
  466. sm_b2_x := sm_bag_ready ? math.round(array.get(sm_bag, 4)) : na
  467. sm_b2_y := sm_bag_ready ? array.get(sm_bag, 5) : na
  468. sm_b3_v := sm_bag_ready ? math.round(array.get(sm_bag, 6)) : na
  469. sm_b3_x := sm_bag_ready ? math.round(array.get(sm_bag, 7)) : na
  470. sm_b3_y := sm_bag_ready ? array.get(sm_bag, 8) : na
  471. sm_b4_v := sm_bag_ready ? math.round(array.get(sm_bag, 9)) : na
  472. sm_b4_x := sm_bag_ready ? math.round(array.get(sm_bag, 10)) : na
  473. sm_b4_y := sm_bag_ready ? array.get(sm_bag, 11) : na
  474. sm_b5_v := sm_bag_ready ? math.round(array.get(sm_bag, 12)) : na
  475. sm_b5_x := sm_bag_ready ? math.round(array.get(sm_bag, 13)) : na
  476. sm_b5_y := sm_bag_ready ? array.get(sm_bag, 14) : na
  477. sm_b6_v := sm_bag_ready ? math.round(array.get(sm_bag, 15)) : na
  478. sm_b6_x := sm_bag_ready ? math.round(array.get(sm_bag, 16)) : na
  479. sm_b6_y := sm_bag_ready ? array.get(sm_bag, 17) : na
  480. sm_b7_v := sm_bag_ready ? math.round(array.get(sm_bag, 18)) : na
  481. sm_b7_x := sm_bag_ready ? math.round(array.get(sm_bag, 19)) : na
  482. sm_b7_y := sm_bag_ready ? array.get(sm_bag, 20) : na
  483. // }}}
  484.  
  485. // SM - Watch changes {{{
  486. sm_b1_changed := ta.change(sm_b1_y) or ta.change(sm_b1_x) or ta.change(sm_b1_v) ? true : false
  487. sm_b2_changed := ta.change(sm_b2_y) or ta.change(sm_b2_x) or ta.change(sm_b2_v) ? true : false
  488. sm_b3_changed := ta.change(sm_b3_y) or ta.change(sm_b3_x) or ta.change(sm_b3_v) ? true : false
  489. sm_b4_changed := ta.change(sm_b4_y) or ta.change(sm_b4_x) or ta.change(sm_b4_v) ? true : false
  490. sm_b5_changed := ta.change(sm_b5_y) or ta.change(sm_b5_x) or ta.change(sm_b5_v) ? true : false
  491. sm_b6_changed := ta.change(sm_b6_y) or ta.change(sm_b6_x) or ta.change(sm_b6_v) ? true : false
  492. sm_b7_changed := ta.change(sm_b7_y) or ta.change(sm_b7_x) or ta.change(sm_b7_v) ? true : false
  493.  
  494. // }}}
  495.  
  496. // }}}
  497.  
  498. // =====> DRAW Coord Labels {{{
  499.  
  500. coordLabel(show, x, y, id, text_1, pos, type) => // {{{
  501. _yloc = pos == 1 ? yloc.abovebar : yloc.belowbar
  502. _style = type == 1 ? label.style_label_down : label.style_label_up
  503. _dir = pos == 1 ? '\n▼' : '▲\n'
  504. _id = pos == 1 ? str.tostring(id) + _dir : _dir + str.tostring(id)
  505. label.new(x=show ? x : na, y=show ? y : na, xloc=xloc.bar_time, yloc=_yloc, color=color.new(color.black, 100), textcolor=type > 1 ? type == 2 ? color.blue : color.yellow : color.white, style=_style, size=size.small, text=_id, tooltip='(' + text_1 + ')')
  506. // }}}
  507.  
  508. // Declare {{{
  509. var int b_offset_main = 2
  510. var int b_offset_front = 3
  511. var label b1_label_sm = na
  512. var label b2_label_sm = na
  513. var label b3_label_sm = na
  514. var label b4_label_sm = na
  515. var label b5_label_sm = na
  516. var label b6_label_sm = na
  517. var label b7_label_sm = na
  518. label.delete(b1_label_sm)
  519. label.delete(b2_label_sm)
  520. label.delete(b3_label_sm)
  521. label.delete(b4_label_sm)
  522. label.delete(b5_label_sm)
  523. label.delete(b6_label_sm)
  524. label.delete(b7_label_sm)
  525.  
  526. var label b1_label_md = na
  527. var label b2_label_md = na
  528. var label b3_label_md = na
  529. var label b4_label_md = na
  530. var label b5_label_md = na
  531. var label b6_label_md = na
  532. var label b7_label_md = na
  533. label.delete(b1_label_md)
  534. label.delete(b2_label_md)
  535. label.delete(b3_label_md)
  536. label.delete(b4_label_md)
  537. label.delete(b5_label_md)
  538. label.delete(b6_label_md)
  539. label.delete(b7_label_md)
  540. // }}}
  541.  
  542. // Print {{{
  543.  
  544. // SM Labels
  545. smb1p = sm_b1_y > sm_b2_y ? 1 : 2
  546. smb2p = smb1p == 1 ? 2 : 1
  547. smb3p = smb2p == 1 ? 2 : 1
  548. smb4p = smb3p == 1 ? 2 : 1
  549. smb5p = smb4p == 1 ? 2 : 1
  550. smb6p = smb5p == 1 ? 2 : 1
  551. smb7p = smb6p == 1 ? 2 : 1
  552. b1_label_sm := coordLabel(show_sm_coord_labels, sm_b1_x, sm_b1_y, 1, 'S1', smb1p, 1)
  553. b2_label_sm := coordLabel(show_sm_coord_labels, sm_b2_x, sm_b2_y, 2, 'S2', smb2p, 1)
  554. b3_label_sm := coordLabel(show_sm_coord_labels, sm_b3_x, sm_b3_y, 3, 'S3', smb3p, 1)
  555. b4_label_sm := coordLabel(show_sm_coord_labels, sm_b4_x, sm_b4_y, 4, 'S4', smb4p, 1)
  556. b5_label_sm := coordLabel(show_sm_coord_labels, sm_b5_x, sm_b5_y, 5, 'S5', smb5p, 1)
  557. b6_label_sm := coordLabel(show_sm_coord_labels, sm_b6_x, sm_b6_y, 6, 'S6', smb6p, 1)
  558. b7_label_sm := coordLabel(show_sm_coord_labels, sm_b7_x, sm_b7_y, 7, 'S7', smb7p, 1)
  559. // MD Labels
  560. mdb1p = md_b1_y > md_b2_y ? 1 : 2
  561. mdb2p = mdb1p == 1 ? 2 : 1
  562. mdb3p = mdb2p == 1 ? 2 : 1
  563. mdb4p = mdb3p == 1 ? 2 : 1
  564. mdb5p = mdb4p == 1 ? 2 : 1
  565. mdb6p = mdb5p == 1 ? 2 : 1
  566. mdb7p = mdb6p == 1 ? 2 : 1
  567. b1_label_md := coordLabel(show_md_coord_labels, md_b1_x, md_b1_y, 1, 'M1', mdb1p, 3)
  568. b2_label_md := coordLabel(show_md_coord_labels, md_b2_x, md_b2_y, 2, 'M2', mdb2p, 3)
  569. b3_label_md := coordLabel(show_md_coord_labels, md_b3_x, md_b3_y, 3, 'M3', mdb3p, 3)
  570. b4_label_md := coordLabel(show_md_coord_labels, md_b4_x, md_b4_y, 4, 'M4', mdb4p, 3)
  571. b5_label_md := coordLabel(show_md_coord_labels, md_b5_x, md_b5_y, 5, 'M5', mdb5p, 3)
  572. b6_label_md := coordLabel(show_md_coord_labels, md_b6_x, md_b6_y, 6, 'M6', mdb6p, 3)
  573. b7_label_md := coordLabel(show_md_coord_labels, md_b7_x, md_b7_y, 7, 'M7', mdb7p, 3)
  574.  
  575. // }}}
  576.  
  577. // }}}
  578.  
  579. // =====> DRAW Trend Lines {{{
  580.  
  581. // Declare {{{
  582. var line shadow_top_line = na
  583. var line shadow_top_line2 = na
  584. var line shadow_btm_line = na
  585. var line s1_second_line = na
  586. var line s1_second_line2 = na
  587. var line s1_first_line = na
  588. var line s2_first_line = na
  589. var line s1_first_line2 = na
  590. var line s2_first_line2 = na
  591. var line head_top_line = na
  592. var line head_top_line2 = na
  593. var line head_btm_line = na
  594. var line s2_second_line = na
  595. var line tail_bottom_line = na
  596. var line s2_second_line2 = na
  597. var line tail_bottom_line2 = na
  598. var float head_pointer_unit = na
  599. var label shadow_eye_label = na
  600. var label head_eye_label = na
  601. var label head_eye_label2 = na
  602. var label head_eye_label_back = na
  603. var line headbackline = na
  604. var line head_eyesight_line = na
  605. var line head_eyesight_line2 = na
  606. var line shadow_eyesight_line = na
  607. // }}}
  608. // CLEAN: Lines {{{
  609. line.delete(shadow_top_line)
  610. line.delete(shadow_btm_line)
  611. line.delete(s1_first_line)
  612. line.delete(s2_first_line)
  613. line.delete(s1_second_line)
  614. line.delete(s1_first_line2)
  615. line.delete(s2_first_line2)
  616. line.delete(s1_second_line2)
  617. line.delete(head_top_line)
  618. line.delete(head_btm_line)
  619. line.delete(s2_second_line)
  620. line.delete(tail_bottom_line)
  621. line.delete(s2_second_line2)
  622. line.delete(tail_bottom_line2)
  623. line.delete(shadow_top_line2)
  624. line.delete(head_top_line2)
  625. line.delete(headbackline)
  626. line.delete(head_eyesight_line)
  627. line.delete(head_eyesight_line2)
  628. // }}}
  629. // CLEAN: Labels {{{
  630. label.delete(head_eye_label)
  631. label.delete(head_eye_label2)
  632. // }}}
  633.  
  634. // trend_use_colors
  635. // trend_color_default
  636.  
  637. // -----------------------------------------------------> SIGHTS {{{
  638.  
  639. // EYE 1 {{{
  640. [head_eye_x, head_eye_y] = calcMidpoint(sm_b3_x, sm_b3_y, sm_b4_x, sm_b4_y)
  641. eye_direction = getDirection(head_eye_y, sm_now_y)
  642.  
  643. head_eye_label := label.new(x=math.round(head_eye_x), y=head_eye_y, xloc=xloc.bar_time, style=label.style_label_right, textcolor=trend_use_colors == false ? trend_color_default : eye_direction == 1 ? trend_s1_line_color_up : trend_s1_line_color_dn, color=color.new(color.white, 100), size=size.normal)
  644. // text="➤",
  645.  
  646. head_eyesight_line := line.new(show_sight_small ? head_eye_x : na, show_sight_small ? head_eye_y : na, sm_now_x, sm_now_y, xloc=xloc.bar_time, extend=extend.right, color=trend_use_colors == false ? trend_color_default : eye_direction == 1 ? trend_s1_line_color_up : trend_s1_line_color_dn, style=sight_small_style, width=sight_small_width)
  647. // }}}
  648.  
  649. // EYE 2 {{{
  650. [head_eye_x2, head_eye_y2] = calcMidpoint(md_b6_x, md_b6_y, md_b5_x, md_b5_y)
  651. eye_direction2 = getDirection(head_eye_y2, sm_now_y)
  652.  
  653. head_eye_label2 := label.new(x=math.round(head_eye_x2), y=head_eye_y2, xloc=xloc.bar_time, style=label.style_label_right, textcolor=trend_use_colors == false ? trend_color_default : eye_direction2 == 1 ? trend_s2_line_color_up : trend_s2_line_color_dn, color=color.new(color.white, 100), size=size.normal)
  654. // text="➤",
  655.  
  656. head_eyesight_line2 := line.new(show_sight_medium ? head_eye_x2 : na, show_sight_medium ? head_eye_y2 : na, sm_now_x, sm_now_y, xloc=xloc.bar_time, extend=extend.right, color=trend_use_colors == false ? trend_color_default : eye_direction2 == 1 ? trend_s2_line_color_up : trend_s2_line_color_dn, style=sight_medium_style, width=sight_medium_width)
  657. // }}}
  658.  
  659. // }}}
  660.  
  661. // -----------------------------------------------------> SECTION 1 {{{
  662.  
  663. s5s6_H = math.max(sm_b5_y, sm_b6_y)
  664. s5s6_L = math.min(sm_b5_y, sm_b6_y)
  665.  
  666. s3s4_H = math.max(sm_b3_y, sm_b4_y)
  667. s3s4_L = math.min(sm_b3_y, sm_b4_y)
  668.  
  669. // -- s1 line 1 (MD 4) -> (SM 3/4 H)
  670. // -- s1 line 1 (SM 5/6 H) -> (SM 3/4 H) {{{
  671. s1_first_line := line.new(sm_bag_ready and md_bag_ready ? s5s6_H == sm_b5_y ? sm_b5_x : sm_b6_x : na, sm_bag_ready and md_bag_ready ? s5s6_H == sm_b5_y ? sm_b5_y : sm_b6_y : na, sm_bag_ready and md_bag_ready ? s3s4_H == sm_b4_y ? sm_b4_x : sm_b3_x : na, sm_bag_ready and md_bag_ready ? s3s4_H == sm_b4_y ? sm_b4_y : sm_b3_y : na, extend=extend.none, xloc=xloc.bar_time, color=trend_use_colors == false ? trend_color_default : md_b4_y < s3s4_H ? trend_s1_line_color_up : trend_s1_line_color_dn, style=trend_s1_line_style, width=trend_s1_line_width)
  672.  
  673. s1_first_line2 := trend_s1_line_extend ? line.new(sm_bag_ready and md_bag_ready ? s5s6_H == sm_b5_y ? sm_b5_x : sm_b6_x : na, sm_bag_ready and md_bag_ready ? s5s6_H == sm_b5_y ? sm_b5_y : sm_b6_y : na, sm_bag_ready and md_bag_ready ? s3s4_H == sm_b4_y ? sm_b4_x : sm_b3_x : na, sm_bag_ready and md_bag_ready ? s3s4_H == sm_b4_y ? sm_b4_y : sm_b3_y : na, extend=extend.right, xloc=xloc.bar_time, color=trend_use_colors == false ? trend_color_default : md_b4_y < s3s4_H ? trend_s1_line_color_up : trend_s1_line_color_dn, style=trend_s1_xline_style, width=trend_s1_xline_width) : na
  674. // }}}
  675.  
  676. // -- s1 line 2 (BIG 5) -> (SM 3) {{{
  677. s1_second_line := line.new(md_bag_ready and md_bag_ready ? s5s6_L == sm_b5_y ? sm_b5_x : sm_b6_x : na, md_bag_ready and md_bag_ready ? s5s6_L == sm_b5_y ? sm_b5_y : sm_b6_y : na, sm_bag_ready and md_bag_ready ? s3s4_L == sm_b4_y ? sm_b4_x : sm_b3_x : na, sm_bag_ready and md_bag_ready ? s3s4_L == sm_b4_y ? sm_b4_y : sm_b3_y : na, extend=extend.none, xloc=xloc.bar_time, color=trend_use_colors == false ? trend_color_default : md_b4_y < s3s4_L ? trend_s1_line_color_up : trend_s1_line_color_dn, style=trend_s1_line_style, width=trend_s1_line_width)
  678.  
  679. s1_second_line2 := trend_s1_line_extend ? line.new(md_bag_ready and md_bag_ready ? s5s6_L == sm_b5_y ? sm_b5_x : sm_b6_x : na, md_bag_ready and md_bag_ready ? s5s6_L == sm_b5_y ? sm_b5_y : sm_b6_y : na, sm_bag_ready and md_bag_ready ? s3s4_L == sm_b4_y ? sm_b4_x : sm_b3_x : na, sm_bag_ready and md_bag_ready ? s3s4_L == sm_b4_y ? sm_b4_y : sm_b3_y : na, extend=extend.right, xloc=xloc.bar_time, color=trend_use_colors == false ? trend_color_default : md_b4_y < s3s4_L ? trend_s1_line_color_up : trend_s1_line_color_dn, style=trend_s1_xline_style, width=trend_s1_xline_width) : na
  680. // }}}
  681.  
  682. // }}}
  683.  
  684. // -----------------------------------------------------> SECTION 2 {{{
  685.  
  686. // -- s2 line 1 (M 6) -> (M 4) {{{
  687. s2_first_line := line.new(sm_bag_ready and md_bag_ready ? md_b6_x : na, sm_bag_ready and md_bag_ready ? md_b6_y : na, sm_bag_ready and md_bag_ready ? md_b4_x : na, sm_bag_ready and md_bag_ready ? md_b4_y : na, extend=extend.none, xloc=xloc.bar_time, color=trend_use_colors == false ? trend_color_default : md_b6_y < md_b4_y ? trend_s2_line_color_up : trend_s2_line_color_dn, style=trend_s2_line_style, width=trend_s2_line_width)
  688.  
  689. // line extension
  690. s2_first_line2 := trend_s2_line_extend ? line.new(md_bag_ready ? md_b6_x : na, md_bag_ready ? md_b6_y : na, md_bag_ready ? md_b4_x : na, md_bag_ready ? md_b4_y : na, extend=extend.right, xloc=xloc.bar_time, color=trend_use_colors == false ? trend_color_default : md_b6_y < md_b4_y ? trend_s2_line_color_up : trend_s2_line_color_dn, style=trend_s2_xline_style, width=trend_s2_xline_width) : na
  691. // }}}
  692.  
  693. // -- s2 line 1 (M 7) -> (M 5) {{{
  694. s2_second_line := line.new(md_bag_ready ? md_b7_x : na, md_bag_ready ? md_b7_y : na, md_bag_ready ? md_b5_x : na, md_bag_ready ? md_b5_y : na, extend=extend.none, xloc=xloc.bar_time, color=trend_use_colors == false ? trend_color_default : md_b7_y < md_b5_y ? trend_s2_line_color_up : trend_s2_line_color_dn, style=trend_s2_line_style, width=trend_s2_line_width)
  695.  
  696. // extension
  697. s2_second_line2 := trend_s2_line_extend ? line.new(md_bag_ready ? md_b7_x : na, md_bag_ready ? md_b7_y : na, md_bag_ready ? md_b5_x : na, md_bag_ready ? md_b5_y : na, extend=extend.right, xloc=xloc.bar_time, color=trend_use_colors == false ? trend_color_default : md_b7_y < md_b5_y ? trend_s2_line_color_up : trend_s2_line_color_dn, style=trend_s2_xline_style, width=trend_s2_xline_width) : na
  698. i_osc = ta.rsi(input.source(close, 'Source', inline='RSI', group='RSI Settings'), input.int(14, '  Length', minval=1, inline='RSI', group='RSI Settings'))
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707. i_obThreshold = input.int(70, 'Overboght', minval=50, maxval=100, inline='Thresh1', group='Threshold Settings')
  708. i_bullZone = input.int(60, 'Bull Zone', minval=50, maxval=65, inline='Thresh1', group='Threshold Settings')
  709. i_bearZone = input.int(40, 'Bear Zone', minval=35, maxval=50, inline='Thresh2', group='Threshold Settings')
  710. i_osThreshold = input.int(30, 'Oversold', minval=1, maxval=50, inline='Thresh2', group='Threshold Settings')
  711.  
  712. i_owcb = input.bool(true, 'RSI Weighted Colored Bars', group='Optional')
  713. i_obos = input.bool(false, 'RSI Overbought/Oversold Marks', group='Optional')
  714. i_fill = input.bool(true, 'Backgroud of Bull/Bear Zones', group='Optional')
  715.  
  716. // Functions ════════════════════════════════════════════════════════════════════════════════════ //
  717.  
  718. f_getPrice(_osc, _thresh, _cross) =>
  719. avgHigh = math.avg(high, close)
  720. avgLow = math.avg(low, close)
  721.  
  722. var return_1 = 0.
  723.  
  724. if _cross == 'over' or _cross == 'both'
  725. if ta.crossover(i_osc, _thresh)
  726. return_1 := avgHigh
  727. return_1
  728. if _cross == 'under' or _cross == 'both'
  729. if ta.crossunder(i_osc, _thresh)
  730. return_1 := avgLow
  731. return_1
  732. return_1
  733.  
  734. // -Calculations ════════════════════════════════════════════════════════════════════════════════ //
  735.  
  736. crossover_overbought = f_getPrice(i_osc, i_obThreshold, 'over')
  737. crossunder_overbought = f_getPrice(i_osc, i_obThreshold, 'under')
  738. bullZone = f_getPrice(i_osc, i_bullZone, 'both')
  739. bearZone = f_getPrice(i_osc, i_bearZone, 'both')
  740. crossover_oversold = f_getPrice(i_osc, i_osThreshold, 'over')
  741. crossunder_oversold = f_getPrice(i_osc, i_osThreshold, 'under')
  742.  
  743. // -Plotting ════════════════════════════════════════════════════════════════════════════════════ //
  744.  
  745. plot_crossover_overbought = plot(crossover_overbought > 0 ? crossover_overbought : na, 'Crossover Overbought', crossover_overbought == crossover_overbought[1] ? color.green : na, 2)
  746. plot_crossunder_overbought = plot(crossunder_overbought > 0 ? crossunder_overbought : na, 'Crossunder Overbought', crossunder_overbought == crossunder_overbought[1] ? color.green : na, 1, plot.style_cross)
  747. plot_bullZone = plot(bullZone > 0 ? bullZone : na, 'Cross Bull Zone', bullZone == bullZone[1] ? color.green : na, 1)
  748.  
  749. fill(plot_crossover_overbought, plot_bullZone, i_fill ? color.green : na, transp=90)
  750. plotshape(i_obos and i_osc > i_obThreshold, 'Price Bars in Overbought Zone', shape.triangledown, location.abovebar, color.new(color.red, 0), size=size.tiny)
  751.  
  752. plot_bearZone = plot(bearZone > 0 ? bearZone : na, 'Cross Bear Zone', bearZone == bearZone[1] ? color.red : na, 1)
  753. plot_crossover_oversold = plot(crossover_oversold > 0 ? crossover_oversold : na, 'Crossover Oversold', crossover_oversold == crossover_oversold[1] ? color.red : na, 1, plot.style_cross)
  754. plot_crossunder_oversold = plot(crossunder_oversold > 0 ? crossunder_oversold : na, 'Crossunder Oversold', crossunder_oversold == crossunder_oversold[1] ? color.red : na, 2)
  755.  
  756. fill(plot_crossunder_oversold, plot_bearZone, i_fill ? color.red : na, transp=90)
  757. plotshape(i_obos and i_osc < i_osThreshold, 'Price Bars in Oversold Zone', shape.triangleup, location.belowbar, color.new(color.green, 0), size=size.tiny)
  758.  
  759. barcolor(i_owcb ? i_osc > i_obThreshold or i_osc < i_osThreshold ? close < open ? #910000 : #006400 : i_osc > i_bearZone and i_osc < i_bullZone ? close < open ? color.orange : #7FFFD4 : na : na, title='RSI Weighted Colored Bars')
  760.  
  761. // -Alerts ════════════════════════════════════════════════════════════════════════════════════ //
  762.  
  763. alertcondition(ta.crossover(close, crossover_overbought), title='Crossover Previous Overbought', message='Crossover Previous Overbought\n{{exchange}}:{{ticker}}->\nPrice = {{close}},\nTime = {{time}}')
  764. alertcondition(ta.crossunder(close, crossunder_oversold), title='Crossunder Previous Oversold', message='Crossunder Previous Oversold\n{{exchange}}:{{ticker}}->\nPrice = {{close}},\nTime = {{time}}')
  765.  
  766.  
  767.  
  768.  
  769. _1 = input(false, '══════ general setting ══════════════════════════════')
  770. i_lineCount = input(10, 'Line count')
  771. i_extendLines = input(true, 'Extend lines')
  772.  
  773. _2 = input(false, '══════ pivot setting 1 ══════════════════════════════')
  774. i_showFirst = input(true, 'Show first')
  775. i_firstLeft = input(20, 'Left')
  776. i_firstRight = input(10, 'Right')
  777. i_firstColor = input(color.red, 'Color')
  778.  
  779. _3 = input(false, '══════ pivot setting 2 ══════════════════════════════')
  780. i_showSecond = input(true, 'Show second')
  781. i_secondLeft = input(10, 'Left')
  782. i_secondRight = input(5, 'Right')
  783. i_secondColor = input(color.orange, 'Color')
  784.  
  785. _4 = input(false, '══════ pivot setting 3 ══════════════════════════════')
  786. i_showThird = input(false, 'Show third')
  787. i_thirdLeft = input(2, 'Left')
  788. i_thirdRight = input(5, 'Right')
  789. i_thirdColor = input(color.lime, 'Color')
  790.  
  791. // array declarations
  792. var pivotArray = array.new_line()
  793. var pivotabelArray = array.new_label()
  794.  
  795.  
  796. f_drawLine(_x1, _x2, _yValue, _lineColor) =>
  797. line.new(x1=_x1, y1=_yValue, x2=_x2, y2=_yValue, color=_lineColor, style=line.style_dotted, width=2)
  798.  
  799. f_drawLabel(_x, _y, _textColor) =>
  800. label.new(_x, _y, '         ' + str.tostring(_y), xloc.bar_index, yloc.price, #00000000, label.style_none, _textColor)
  801.  
  802. f_extendArray(_lineArray, _extendLines) =>
  803. if array.size(_lineArray) > 0
  804. for _i = array.size(_lineArray) - 1 to 0 by 1
  805.  
  806. x2 = line.get_x2(array.get(_lineArray, _i))
  807. yValue = line.get_y1(array.get(_lineArray, _i))
  808.  
  809. if _extendLines or bar_index - 1 == x2 and not(high > yValue and low < yValue)
  810. line.set_x2(array.get(_lineArray, _i), bar_index)
  811.  
  812. f_drawPivotLineAndLabel(_x1, _x2, _yValue, _colorLine) =>
  813. line l = f_drawLine(_x1, _x2, _yValue, _colorLine)
  814. label lab = f_drawLabel(_x1, _yValue, _colorLine)
  815.  
  816. if array.size(pivotArray) == i_lineCount
  817. line.delete(array.shift(pivotArray))
  818. label.delete(array.shift(pivotabelArray))
  819. array.push(pivotArray, l)
  820. array.push(pivotabelArray, lab)
  821.  
  822. f_addLine(_left, _right, _colorLine) =>
  823. pivotHigh = ta.pivothigh(high, _left, _right)
  824. pivotLow = ta.pivotlow(low, _left, _right)
  825.  
  826. if pivotHigh or pivotLow
  827. float yValue = na
  828. int x1 = na
  829. int x2 = na
  830.  
  831. if not na(pivotHigh)
  832. yValue := high[_right]
  833. x1 := bar_index[_right]
  834. x2 := bar_index
  835. f_drawPivotLineAndLabel(x1, x2, yValue, _colorLine)
  836.  
  837. if not na(pivotLow)
  838. yValue := low[_right]
  839. x1 := bar_index[_right]
  840. x2 := bar_index
  841. f_drawPivotLineAndLabel(x1, x2, yValue, _colorLine)
  842.  
  843.  
  844. if i_showFirst
  845. f_addLine(i_firstLeft, i_firstRight, i_firstColor)
  846. if i_showSecond
  847. f_addLine(i_secondLeft, i_secondRight, i_secondColor)
  848. if i_showThird
  849. f_addLine(i_thirdLeft, i_thirdRight, i_thirdColor)
  850.  
  851. f_extendArray(pivotArray, i_extendLines)
  852.  
  853.  
  854.  
Advertisement
Add Comment
Please, Sign In to add comment