xmd79

Automatic Pivot Points

Dec 15th, 2022
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.37 KB | None | 0 0
  1. // © Infinity_Trading_
  2. // Last Modified: 5/13/2022
  3.  
  4. //@version=5
  5. indicator(title="Automatic Pivot Points", shorttitle="_AutoPivots", overlay=true)
  6.  
  7. // Purpose: Draws Traditional Pivots lines at the timeframe specified.
  8. // Has logic that only displays the next pivot instead of all the pivots (for the purpose of chart de-cluttering).
  9. // TradingView has a limit of 40 security calls per script. Due to this limitation this script can only display pivots a max of 7 time periods back.
  10.  
  11. // Usage: Add indicator. Choose timeframe, number of timeframes back in the past to display, line color, line weight
  12.  
  13.  
  14. ///////////////////////////////////////////////////////////////////////////////// INPUTS
  15.  
  16.  
  17. AUTO = "Auto"
  18. DAILY = "Daily"
  19. WEEKLY = "Weekly"
  20. MONTHLY = "Monthly"
  21. QUARTERLY = "Quarterly"
  22. YEARLY = "Yearly"
  23.  
  24. var string GP1 = "Pivots"
  25. i_auto_pivots = input.bool(defval=true, title="Auto Pivots", group=GP1)
  26. i_pivot_time_frame = input.string(title="‏ ‏Timeframe", defval=AUTO, options=[AUTO, DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY], group=GP1)
  27. i_pivots_back = input.int(defval=1, minval=1, maxval=7, title="‏ ‏Pivots Back", group=GP1)
  28.  
  29. var string GP2 = "Pivot Style"
  30.  
  31. i_pivot_labels = input.bool(defval=true, title="Labels", group=GP2, inline = "pivot_label")
  32. i_pivot_label_pos = input.string(defval="Left", options=["Left", "Right"], title="", group=GP2, inline = "pivot_label")
  33.  
  34.  
  35. i_pivot_color = input.color(defval=color.new(#fb8c00, 0), title="Pivot Line", group=GP2, inline = "pivot_line")
  36. i_line_width = input.int(defval=2, minval=1, maxval=10, title="", group=GP2, inline = "pivot_line")
  37. i_pivot_line_style = input.string(defval="solid (─)", title="", options=["solid (─)", "dotted (┈)", "dashed (╌)"], group=GP2, inline="pivot_line")
  38.  
  39. i_pivot_res_color = input.color(defval=color.new(#fb8c00, 0), title="Resistance Lines", group=GP2, inline = "resistance")
  40. i_res_line_width = input.int(defval=2, minval=1, maxval=10, title="", group=GP2, inline = "resistance")
  41. i_res_line_style = input.string(defval="solid (─)", title="", options=["solid (─)", "dotted (┈)", "dashed (╌)"], group=GP2, inline="resistance")
  42.  
  43. i_pivot_sup_color = input.color(defval=color.new(#fb8c00, 0), title="Support Lines", group=GP2, inline = "support")
  44. i_sup_line_width = input.int(defval=2, minval=1, maxval=10, title="", group=GP2, inline = "support")
  45. i_sup_line_style = input.string(defval="solid (─)", title="", options=["solid (─)", "dotted (┈)", "dashed (╌)"], group=GP2, inline="support")
  46.  
  47. ///////////////////////////////////////////////////////////////////////////////// HELPER FUNCTIONS
  48.  
  49.  
  50. timeOpenPeriod(tf, period) => request.security(syminfo.tickerid, tf, time[period])
  51. timeClosePeriod(tf, period) => request.security(syminfo.tickerid, tf, time_close[period])
  52. highPeriod(tf, period) => request.security(syminfo.tickerid, tf, high[period])
  53. lowPeriod(tf, period) => request.security(syminfo.tickerid, tf, low[period])
  54. closePeriod(tf, period) => request.security(syminfo.tickerid, tf, close[period])
  55.  
  56.  
  57. // Traditional Pivots Formulas
  58. PP(h, l, c) => (h + l + c) / 3
  59. R1(h, l, c) => PP(h, l, c) * 2 - l
  60. S1(h, l, c) => PP(h, l, c) * 2 - h
  61. R2(h, l, c) => PP(h, l, c) + (h - l)
  62. S2(h, l, c) => PP(h, l, c) - (h - l)
  63. R3(h, l, c) => PP(h, l, c) * 2 + (h - 2 * l)
  64. S3(h, l, c) => PP(h, l, c) * 2 - (2 * h - l)
  65. R4(h, l, c) => PP(h, l, c) * 3 + (h - 3 * l)
  66. S4(h, l, c) => PP(h, l, c) * 3 - (3 * h - l)
  67. R5(h, l, c) => PP(h, l, c) * 4 + (h - 4 * l)
  68. S5(h, l, c) => PP(h, l, c) * 4 - (4 * h - l)
  69.  
  70.  
  71. // Function the converts string inputs to line style code
  72. line_style_function(input_var) =>
  73. switch input_var
  74. "dotted (┈)" => line.style_dotted
  75. "dashed (╌)" => line.style_dashed
  76. => line.style_solid
  77.  
  78.  
  79. draw_line(ln, i, pivot, tmo, tc, col, line_style, line_width) =>
  80. array.push(ln, line.new(x1 = array.get(tmo, i), y1 = array.get(pivot, i), x2 = array.get(tc, i), y2 = array.get(pivot, i), xloc=xloc.bar_time, color=col, style=line_style, width=line_width))
  81.  
  82.  
  83. draw_label(lb, i, pivot, tmo, tc, txt, txt_color) =>
  84. if i_pivot_labels
  85. offset = '‏ ‏ ‏ ‏ ‏'
  86. labels_align_str_left= i_pivot_label_pos == "Left" ? txt + offset : offset + txt
  87. x_pos = i_pivot_label_pos == "Left" ? array.get(tmo, i) : array.get(tc, i)
  88. array.push(lb, label.new(x = x_pos, y = array.get(pivot, i), text=labels_align_str_left, textcolor=txt_color, style=label.style_label_center, color=#00000000, xloc=xloc.bar_time))
  89.  
  90.  
  91.  
  92. get_pivot_resolution() =>
  93. resolution = "M"
  94. if i_pivot_time_frame == AUTO
  95. if timeframe.isintraday
  96. resolution := timeframe.multiplier <= 15 ? "D" : "W"
  97. else if timeframe.isweekly or timeframe.ismonthly
  98. resolution := "12M"
  99. else if i_pivot_time_frame == DAILY
  100. resolution := "D"
  101. else if i_pivot_time_frame == WEEKLY
  102. resolution := "W"
  103. else if i_pivot_time_frame == MONTHLY
  104. resolution := "M"
  105. else if i_pivot_time_frame == QUARTERLY
  106. resolution := "3M"
  107. else if i_pivot_time_frame == YEARLY
  108. resolution := "12M"
  109. resolution
  110.  
  111.  
  112. ///////////////////////////////////////////////////////////////////////////////// CREATE ARRAYS
  113.  
  114. // Call timeframe resolution helper function
  115. resolution = get_pivot_resolution()
  116.  
  117.  
  118. // Create blank arrays
  119. pivotTimeOpenArray = array.new_int(0)
  120. pivotTimeCloseArray = array.new_int(0)
  121. pivotHighArray = array.new_float(0)
  122. pivotLowArray = array.new_float(0)
  123. pivotCloseArray = array.new_float(0)
  124.  
  125.  
  126. //Pine Script forces us to enter all the values of the array manually, one line at a time.
  127. // Manually insert price values into the array
  128. array.push(pivotTimeOpenArray, timeOpenPeriod(resolution, 0))
  129. array.push(pivotTimeOpenArray, timeOpenPeriod(resolution, 1))
  130. array.push(pivotTimeOpenArray, timeOpenPeriod(resolution, 2))
  131. array.push(pivotTimeOpenArray, timeOpenPeriod(resolution, 3))
  132. array.push(pivotTimeOpenArray, timeOpenPeriod(resolution, 4))
  133. array.push(pivotTimeOpenArray, timeOpenPeriod(resolution, 5))
  134. array.push(pivotTimeOpenArray, timeOpenPeriod(resolution, 6))
  135. array.push(pivotTimeOpenArray, timeOpenPeriod(resolution, 7))
  136.  
  137.  
  138. array.push(pivotTimeCloseArray, timeClosePeriod(resolution, 0))
  139. array.push(pivotTimeCloseArray, timeClosePeriod(resolution, 1))
  140. array.push(pivotTimeCloseArray, timeClosePeriod(resolution, 2))
  141. array.push(pivotTimeCloseArray, timeClosePeriod(resolution, 3))
  142. array.push(pivotTimeCloseArray, timeClosePeriod(resolution, 4))
  143. array.push(pivotTimeCloseArray, timeClosePeriod(resolution, 5))
  144. array.push(pivotTimeCloseArray, timeClosePeriod(resolution, 6))
  145. array.push(pivotTimeCloseArray, timeClosePeriod(resolution, 7))
  146.  
  147.  
  148. array.push(pivotHighArray, highPeriod(resolution, 0))
  149. array.push(pivotHighArray, highPeriod(resolution, 1))
  150. array.push(pivotHighArray, highPeriod(resolution, 2))
  151. array.push(pivotHighArray, highPeriod(resolution, 3))
  152. array.push(pivotHighArray, highPeriod(resolution, 4))
  153. array.push(pivotHighArray, highPeriod(resolution, 5))
  154. array.push(pivotHighArray, highPeriod(resolution, 6))
  155. array.push(pivotHighArray, highPeriod(resolution, 7))
  156.  
  157.  
  158. array.push(pivotLowArray, lowPeriod(resolution, 0))
  159. array.push(pivotLowArray, lowPeriod(resolution, 1))
  160. array.push(pivotLowArray, lowPeriod(resolution, 2))
  161. array.push(pivotLowArray, lowPeriod(resolution, 3))
  162. array.push(pivotLowArray, lowPeriod(resolution, 4))
  163. array.push(pivotLowArray, lowPeriod(resolution, 5))
  164. array.push(pivotLowArray, lowPeriod(resolution, 6))
  165. array.push(pivotLowArray, lowPeriod(resolution, 7))
  166.  
  167.  
  168. array.push(pivotCloseArray, closePeriod(resolution, 0))
  169. array.push(pivotCloseArray, closePeriod(resolution, 1))
  170. array.push(pivotCloseArray, closePeriod(resolution, 2))
  171. array.push(pivotCloseArray, closePeriod(resolution, 3))
  172. array.push(pivotCloseArray, closePeriod(resolution, 4))
  173. array.push(pivotCloseArray, closePeriod(resolution, 5))
  174. array.push(pivotCloseArray, closePeriod(resolution, 6))
  175. array.push(pivotCloseArray, closePeriod(resolution, 7))
  176.  
  177.  
  178.  
  179. ///////////////////////////////////////////////////////////////////////////////// ARRAY OTHER
  180.  
  181. // Create blank arrays
  182.  
  183. var lines_pivot = array.new_line()
  184. var labels_pivot = array.new_label()
  185.  
  186. ppMonArray = array.new_float()
  187. r1MonArray = array.new_float()
  188. s1MonArray = array.new_float()
  189. r2MonArray = array.new_float()
  190. s2MonArray = array.new_float()
  191. r3MonArray = array.new_float()
  192. s3MonArray = array.new_float()
  193. r4MonArray = array.new_float()
  194. s4MonArray = array.new_float()
  195. r5MonArray = array.new_float()
  196. s5MonArray = array.new_float()
  197.  
  198. float pivotHigh = na
  199. float pivotLow = na
  200.  
  201.  
  202. ///////////////////////////////////////////////////////////////////////////////// PLOT LINES
  203.  
  204. // Line style variables
  205. pivot_line_style = line_style_function(i_pivot_line_style)
  206. res_line_style = line_style_function(i_res_line_style)
  207. sup_line_style = line_style_function(i_sup_line_style)
  208.  
  209.  
  210. // Only execute calculations on the last bar
  211. if barstate.islast
  212.  
  213. // Loop over each month back
  214. for pivot_offset = 0 to i_pivots_back - 1
  215.  
  216. // Calculate Traditional Pivots values and push to arrays
  217. // Notice that the high, low, close arrays have +1
  218. // This is because Pivot lines are calculate on the previous candle, but drawn on the current candle.
  219. array.push(ppMonArray, PP(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  220. array.push(r1MonArray, R1(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  221. array.push(s1MonArray, S1(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  222. array.push(r2MonArray, R2(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  223. array.push(s2MonArray, S2(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  224. array.push(r3MonArray, R3(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  225. array.push(s3MonArray, S3(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  226. array.push(r4MonArray, R4(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  227. array.push(s4MonArray, S4(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  228. array.push(r5MonArray, R5(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  229. array.push(s5MonArray, S5(array.get(pivotHighArray, pivot_offset + 1), array.get(pivotLowArray, pivot_offset + 1), array.get(pivotCloseArray, pivot_offset + 1)))
  230.  
  231. // Current months high and low values
  232. pivotHigh := array.get(pivotHighArray, pivot_offset)
  233. pivotLow := array.get(pivotLowArray, pivot_offset)
  234.  
  235.  
  236. // **************************
  237. // Automatic Pivots
  238. // **************************
  239. // Logic that will only draw pivot lines one above the months high/low.
  240. // This makes the chart less cluttered and more readable.
  241.  
  242. if i_auto_pivots
  243.  
  244. // Draw Monthly Pivot lines
  245. // PP
  246. draw_line(lines_pivot, pivot_offset, ppMonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_color, pivot_line_style, i_line_width)
  247. draw_label(labels_pivot, pivot_offset, ppMonArray, pivotTimeOpenArray, pivotTimeCloseArray, "P", i_pivot_color)
  248.  
  249. // R1
  250. if pivotHigh > array.get(ppMonArray, pivot_offset)
  251. draw_line(lines_pivot, pivot_offset, r1MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  252. draw_label(labels_pivot, pivot_offset, r1MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R1", i_pivot_res_color)
  253.  
  254. // S1
  255. if pivotLow < array.get(ppMonArray, pivot_offset)
  256. draw_line(lines_pivot, pivot_offset, s1MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  257. draw_label(labels_pivot, pivot_offset, s1MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S1", i_pivot_sup_color)
  258.  
  259. // R2
  260. if pivotHigh > array.get(r1MonArray, pivot_offset)
  261. draw_line(lines_pivot, pivot_offset, r2MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  262. draw_label(labels_pivot, pivot_offset, r2MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R2", i_pivot_res_color)
  263.  
  264. // S2
  265. if pivotLow < array.get(s1MonArray, pivot_offset)
  266. draw_line(lines_pivot, pivot_offset, s2MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  267. draw_label(labels_pivot, pivot_offset, s2MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S2", i_pivot_sup_color)
  268.  
  269. // R3
  270. if pivotHigh > array.get(r2MonArray, pivot_offset)
  271. draw_line(lines_pivot, pivot_offset, r3MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  272. draw_label(labels_pivot, pivot_offset, r3MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R3", i_pivot_res_color)
  273.  
  274. // S3
  275. if pivotLow < array.get(s2MonArray, pivot_offset)
  276. draw_line(lines_pivot, pivot_offset, s3MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  277. draw_label(labels_pivot, pivot_offset, s3MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S3", i_pivot_sup_color)
  278.  
  279. // R4
  280. if pivotHigh > array.get(r3MonArray, pivot_offset)
  281. draw_line(lines_pivot, pivot_offset, r4MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  282. draw_label(labels_pivot, pivot_offset, r4MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R4", i_pivot_res_color)
  283.  
  284. // S4
  285. if pivotLow < array.get(s3MonArray, pivot_offset)
  286. draw_line(lines_pivot, pivot_offset, s4MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  287. draw_label(labels_pivot, pivot_offset, s4MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S4", i_pivot_sup_color)
  288.  
  289. // R5
  290. if pivotHigh > array.get(r4MonArray, pivot_offset)
  291. draw_line(lines_pivot, pivot_offset, r5MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  292. draw_label(labels_pivot, pivot_offset, r5MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R5", i_pivot_res_color)
  293.  
  294. // S5
  295. if pivotLow < array.get(s4MonArray, pivot_offset)
  296. draw_line(lines_pivot, pivot_offset, s5MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  297. draw_label(labels_pivot, pivot_offset, s5MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S5", i_pivot_sup_color)
  298.  
  299. else
  300. // **************************
  301. // Turn off auto pivots
  302. // Display all pivot lines
  303. // **************************
  304.  
  305. // Draw Monthly Pivot lines
  306. // PP
  307. draw_line(lines_pivot, pivot_offset, ppMonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_color, pivot_line_style, i_line_width)
  308. draw_label(labels_pivot, pivot_offset, ppMonArray, pivotTimeOpenArray, pivotTimeCloseArray, "P", i_pivot_color)
  309.  
  310. // R1
  311. draw_line(lines_pivot, pivot_offset, r1MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  312. draw_label(labels_pivot, pivot_offset, r1MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R1", i_pivot_res_color)
  313.  
  314. // S1
  315. draw_line(lines_pivot, pivot_offset, s1MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  316. draw_label(labels_pivot, pivot_offset, s1MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S1", i_pivot_sup_color)
  317.  
  318. // R2
  319. draw_line(lines_pivot, pivot_offset, r2MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  320. draw_label(labels_pivot, pivot_offset, r2MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R2", i_pivot_res_color)
  321.  
  322. // S2
  323. draw_line(lines_pivot, pivot_offset, s2MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  324. draw_label(labels_pivot, pivot_offset, s2MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S2", i_pivot_sup_color)
  325.  
  326. // R3
  327. draw_line(lines_pivot, pivot_offset, r3MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  328. draw_label(labels_pivot, pivot_offset, r3MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R3", i_pivot_res_color)
  329.  
  330. // S3
  331. draw_line(lines_pivot, pivot_offset, s3MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  332. draw_label(labels_pivot, pivot_offset, s3MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S3", i_pivot_sup_color)
  333.  
  334. // R4
  335. draw_line(lines_pivot, pivot_offset, r4MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  336. draw_label(labels_pivot, pivot_offset, r4MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R4", i_pivot_res_color)
  337.  
  338. // S4
  339. draw_line(lines_pivot, pivot_offset, s4MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  340. draw_label(labels_pivot, pivot_offset, s4MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S4", i_pivot_sup_color)
  341.  
  342. // R5
  343. draw_line(lines_pivot, pivot_offset, r5MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_res_color, res_line_style, i_res_line_width)
  344. draw_label(labels_pivot, pivot_offset, r5MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "R5", i_pivot_res_color)
  345.  
  346. // S5
  347. draw_line(lines_pivot, pivot_offset, s5MonArray, pivotTimeOpenArray, pivotTimeCloseArray, i_pivot_sup_color, sup_line_style, i_sup_line_width)
  348. draw_label(labels_pivot, pivot_offset, s5MonArray, pivotTimeOpenArray, pivotTimeCloseArray, "S5", i_pivot_sup_color)
  349.  
  350.  
  351.  
Advertisement
Add Comment
Please, Sign In to add comment