xmd79

Harmonics MIRIFXACADEMY

Jan 2nd, 2023
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.86 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. // © kleoshuli4
  3.  
  4. //@version=5
  5. indicator('Harmonics MIRIFXACADEMY', shorttitle='Harmonics', overlay=true, max_bars_back=1000 , max_lines_count=500 , max_labels_count=500)
  6.  
  7. max_pivot_size = input.int(200, step=10)
  8. showZigZag1 = input(false)
  9. zigzag1Length = input.int(15, step=5, minval=1)
  10. zigzag1Color = input(color.olive)
  11. zigzag1Width = 1
  12. zigzag1Style = line.style_solid
  13.  
  14. showZigZag2 = input(false)
  15. zigzag2Length = input.int(30, step=5, minval=1)
  16. zigzag2Color = input(color.olive)
  17. zigzag2Width = 1
  18. zigzag2Style = line.style_solid
  19.  
  20. showZigZag3 = input(true)
  21. zigzag3Length = input.int(60, step=5, minval=1)
  22. zigzag3Color = input(color.olive)
  23. zigzag3Width = 1
  24. zigzag3Style = line.style_solid
  25.  
  26. showZigZag4 = input(true)
  27. zigzag4Length = input.int(120, step=5, minval=1)
  28. zigzag4Color = input(color.olive)
  29. zigzag4Width = 1
  30. zigzag4Style = line.style_solid
  31.  
  32. showZigZag5 = input(false)
  33. zigzag5Length = input.int(50, step=5, minval=1)
  34. zigzag5Color = input(color.olive)
  35. zigzag5Width = 1
  36. zigzag5Style = line.style_solid
  37.  
  38.  
  39. gartley = input(true)
  40. crab = input(true)
  41. deepCrab = input(false)
  42. bat = input(true)
  43. butterfly = input(true)
  44. shark = input(false)
  45. cypher = input(false)
  46.  
  47. errorPercent = input.int(15, minval=5, step=5, maxval=20)
  48. MaxRiskPerReward = input.int(30, title='Max Risk Per Reward (Double Top/Bottom)', step=10, minval=0)
  49.  
  50. showStatTable = false
  51. waitForConfirmation = input(false)
  52.  
  53. bullishColor = input(color.rgb(255, 255, 255))
  54. bearishColor = input(color.rgb(255, 255, 255))
  55.  
  56. err_min = (100 - errorPercent) / 100
  57. err_max = (100 + errorPercent) / 100
  58.  
  59. var zigzagpivots1 = array.new_float(0)
  60. var zigzagpivotbars1 = array.new_int(0)
  61. var zigzagpivotdirs1 = array.new_int(0)
  62.  
  63. var zigzagpivots2 = array.new_float(0)
  64. var zigzagpivotbars2 = array.new_int(0)
  65. var zigzagpivotdirs2 = array.new_int(0)
  66.  
  67. var zigzagpivots3 = array.new_float(0)
  68. var zigzagpivotbars3 = array.new_int(0)
  69. var zigzagpivotdirs3 = array.new_int(0)
  70.  
  71. var zigzagpivots4 = array.new_float(0)
  72. var zigzagpivotbars4 = array.new_int(0)
  73. var zigzagpivotdirs4 = array.new_int(0)
  74.  
  75. var zigzagpivots5 = array.new_float(0)
  76. var zigzagpivotbars5 = array.new_int(0)
  77. var zigzagpivotdirs5 = array.new_int(0)
  78.  
  79. var wmlines1 = array.new_line(8)
  80. var wmtype1 = array.new_int(2, 1)
  81. var wmLabels1 = array.new_bool(13, false)
  82. var wmLabel1 = array.new_label(1)
  83.  
  84. var wmlines2 = array.new_line(8)
  85. var wmtype2 = array.new_int(2, 1)
  86. var wmLabels2 = array.new_bool(13, false)
  87. var wmLabel2 = array.new_label(1)
  88.  
  89. var wmlines3 = array.new_line(8)
  90. var wmtype3 = array.new_int(2, 1)
  91. var wmLabels3 = array.new_bool(13, false)
  92. var wmLabel3 = array.new_label(1)
  93.  
  94. var wmlines4 = array.new_line(8)
  95. var wmtype4 = array.new_int(2, 1)
  96. var wmLabels4 = array.new_bool(13, false)
  97. var wmLabel4 = array.new_label(1)
  98.  
  99. var wmlines5 = array.new_line(8)
  100. var wmtype5 = array.new_int(2, 1)
  101. var wmLabels5 = array.new_bool(13, false)
  102. var wmLabel5 = array.new_label(1)
  103.  
  104. pivots(length) =>
  105. float phigh = ta.highestbars(high, length) == 0 ? high : na
  106. float plow = ta.lowestbars(low, length) == 0 ? low : na
  107. dir = 0
  108. iff_1 = plow and na(phigh) ? -1 : dir[1]
  109. dir := phigh and na(plow) ? 1 : iff_1
  110. [dir, phigh, plow]
  111.  
  112. zigzag(length, zigzagpivots, zigzagpivotbars, zigzagpivotdirs) =>
  113. [dir, phigh, plow] = pivots(length)
  114. dirchanged = ta.change(dir)
  115.  
  116. if phigh or plow
  117. value = dir == 1 ? phigh : plow
  118. bar = bar_index
  119. newDir = dir
  120. if not dirchanged and array.size(zigzagpivots) >= 1
  121. pivot = array.shift(zigzagpivots)
  122. pivotbar = array.shift(zigzagpivotbars)
  123. pivotdir = array.shift(zigzagpivotdirs)
  124. useNewValues = value * pivotdir < pivot * pivotdir
  125. value := useNewValues ? pivot : value
  126. bar := useNewValues ? pivotbar : bar
  127. bar
  128.  
  129. if array.size(zigzagpivots) >= 2
  130. LastPoint = array.get(zigzagpivots, 1)
  131. newDir := dir * value > dir * LastPoint ? dir * 2 : dir
  132. newDir
  133.  
  134. array.unshift(zigzagpivots, value=value)
  135. array.unshift(zigzagpivotbars, bar)
  136. array.unshift(zigzagpivotdirs, newDir)
  137.  
  138. if array.size(zigzagpivots) > max_pivot_size
  139. array.pop(zigzagpivots)
  140. array.pop(zigzagpivotbars)
  141. array.pop(zigzagpivotdirs)
  142.  
  143. get_harmonic_label(wmLabels, dir, price, bar) =>
  144. isGartley = array.get(wmLabels, 0)
  145. isCrab = array.get(wmLabels, 1)
  146. isDeepCrab = array.get(wmLabels, 2)
  147. isBat = array.get(wmLabels, 3)
  148. isButterfly = array.get(wmLabels, 4)
  149. isShark = array.get(wmLabels, 5)
  150. isCypher = array.get(wmLabels, 6)
  151.  
  152.  
  153. labelText = isGartley ? 'Gartley' : ''
  154. labelText := labelText + (isCrab ? (labelText == '' ? '' : '\n') + 'Crab' : '')
  155. labelText := labelText + (isDeepCrab ? (labelText == '' ? '' : '\n') + 'Deep Crab' : '')
  156. labelText := labelText + (isBat ? (labelText == '' ? '' : '\n') + 'Bat' : '')
  157. labelText := labelText + (isButterfly ? (labelText == '' ? '' : '\n') + 'Butterfly' : '')
  158. labelText := labelText + (isShark ? (labelText == '' ? '' : '\n') + 'Shark' : '')
  159. labelText := labelText + (isCypher ? (labelText == '' ? '' : '\n') + 'Cypher' : '')
  160.  
  161. trendColor = dir > 0 ? bullishColor : bearishColor
  162.  
  163. baseLabel = label.new(x=bar, y=price, text=labelText, yloc=yloc.price, color=trendColor, style=dir < 1 ? label.style_label_down : label.style_label_up, textcolor=color.black, size=size.small)
  164. baseLabel
  165.  
  166. detect_harmonic_pattern(zigzagpivots, zigzagpivotbars, zigzagpivotdirs, wmlines, wmlabel, wmtype, wmLabels, zigzagColor, zigzagWidth, zigzagStyle, showZigZag) =>
  167. start = waitForConfirmation ? 1 : 0
  168. wm_pattern = false
  169. abcd_pattern = false
  170. double_pattern = false
  171. if array.size(zigzagpivots) >= 6 + start and showZigZag
  172.  
  173. d = array.get(zigzagpivots, start + 0)
  174. dBar = array.get(zigzagpivotbars, start + 0)
  175. dDir = array.get(zigzagpivotdirs, start + 0)
  176.  
  177. c = array.get(zigzagpivots, start + 1)
  178. cBar = array.get(zigzagpivotbars, start + 1)
  179. cDir = array.get(zigzagpivotdirs, start + 1)
  180.  
  181. b = array.get(zigzagpivots, start + 2)
  182. bBar = array.get(zigzagpivotbars, start + 2)
  183. bDir = array.get(zigzagpivotdirs, start + 2)
  184.  
  185. a = array.get(zigzagpivots, start + 3)
  186. aBar = array.get(zigzagpivotbars, start + 3)
  187. aDir = array.get(zigzagpivotdirs, start + 3)
  188.  
  189. x = array.get(zigzagpivots, start + 4)
  190. xBar = array.get(zigzagpivotbars, start + 4)
  191. xDir = array.get(zigzagpivotdirs, start + 4)
  192.  
  193. y = array.get(zigzagpivots, start + 5)
  194. yBar = array.get(zigzagpivotbars, start + 5)
  195. yDir = array.get(zigzagpivotdirs, start + 5)
  196.  
  197. highPoint = math.max(x, a, b, c, d)
  198. lowPoint = math.min(x, a, b, c, d)
  199. dir = c > d ? 1 : -1
  200.  
  201. xabRatio = math.abs(b - a) / math.abs(x - a)
  202. abcRatio = math.abs(c - b) / math.abs(a - b)
  203. bcdRatio = math.abs(d - c) / math.abs(b - c)
  204. xadRatio = math.abs(d - a) / math.abs(x - a)
  205. yxaRatio = math.abs(a - x) / math.abs(y - x)
  206.  
  207. abTime = math.abs(aBar - bBar)
  208. cdTime = math.abs(cBar - dBar)
  209. abPrice = math.abs(a - b)
  210. cdPrice = math.abs(c - d)
  211.  
  212. time_ratio = cdTime / abTime
  213. price_ratio = cdPrice / abPrice
  214. abcdDirection = a < b and a < c and c < b and c < d and a < d and b < d ? 1 : a > b and a > c and c > b and c > d and a > d and b > d ? -1 : 0
  215.  
  216. risk = math.abs(b - d)
  217. reward = math.abs(c - d)
  218. riskPerReward = risk * 100 / (risk + reward)
  219.  
  220. if b < highPoint and b > lowPoint
  221. //gartley
  222. if gartley and xabRatio >= 0.618 * err_min and xabRatio <= 0.618 * err_max and abcRatio >= 0.382 * err_min and abcRatio <= 0.886 * err_max and (bcdRatio >= 1.272 * err_min and bcdRatio <= 1.618 * err_max or xadRatio >= 0.786 * err_min and xadRatio <= 0.786 * err_max)
  223. wm_pattern := true
  224. array.set(wmLabels, 0, true)
  225. else
  226. array.set(wmLabels, 0, false)
  227. //Crab
  228. if crab and xabRatio >= 0.382 * err_min and xabRatio <= 0.618 * err_max and abcRatio >= 0.382 * err_min and abcRatio <= 0.886 * err_max and (bcdRatio >= 2.24 * err_min and bcdRatio <= 3.618 * err_max or xadRatio >= 1.618 * err_min and xadRatio <= 1.618 * err_max)
  229. wm_pattern := true
  230. array.set(wmLabels, 1, true)
  231. else
  232. array.set(wmLabels, 1, false)
  233. //Deep Crab
  234. if deepCrab and xabRatio >= 0.886 * err_min and xabRatio <= 0.886 * err_max and abcRatio >= 0.382 * err_min and abcRatio <= 0.886 * err_max and (bcdRatio >= 2.00 * err_min and bcdRatio <= 3.618 * err_max or xadRatio >= 1.618 * err_min and xadRatio <= 1.618 * err_max)
  235. wm_pattern := true
  236. array.set(wmLabels, 2, true)
  237. else
  238. array.set(wmLabels, 2, false)
  239. //Bat
  240. if bat and xabRatio >= 0.382 * err_min and xabRatio <= 0.50 * err_max and abcRatio >= 0.382 * err_min and abcRatio <= 0.886 * err_max and (bcdRatio >= 1.618 * err_min and bcdRatio <= 2.618 * err_max or xadRatio >= 0.886 * err_min and xadRatio <= 0.886 * err_max)
  241. wm_pattern := true
  242. array.set(wmLabels, 3, true)
  243. else
  244. array.set(wmLabels, 3, false)
  245. //Butterfly
  246. if butterfly and xabRatio >= 0.786 * err_min and xabRatio <= 0.786 * err_max and abcRatio >= 0.382 * err_min and abcRatio <= 0.886 * err_max and (bcdRatio >= 1.618 * err_min and bcdRatio <= 2.618 * err_max or xadRatio >= 1.27 * err_min and xadRatio <= 1.618 * err_max)
  247. wm_pattern := true
  248. array.set(wmLabels, 4, true)
  249. else
  250. array.set(wmLabels, 4, false)
  251. //Shark
  252. if shark and abcRatio >= 1.13 * err_min and abcRatio <= 1.618 * err_max and bcdRatio >= 1.618 * err_min and bcdRatio <= 2.24 * err_max and xadRatio >= 0.886 * err_min and xadRatio <= 1.13 * err_max
  253. wm_pattern := true
  254. array.set(wmLabels, 5, true)
  255. else
  256. array.set(wmLabels, 5, false)
  257. //Cypher
  258. if cypher and xabRatio >= 0.382 * err_min and xabRatio <= 0.618 * err_max and abcRatio >= 1.13 * err_min and abcRatio <= 1.414 * err_max and (bcdRatio >= 1.272 * err_min and bcdRatio <= 2.00 * err_max or xadRatio >= 0.786 * err_min and xadRatio <= 0.786 * err_max)
  259. wm_pattern := true
  260. array.set(wmLabels, 6, true)
  261. else
  262. array.set(wmLabels, 6, false)
  263.  
  264.  
  265. cancelW = false
  266. cancelA = false
  267. cancelD = false
  268. if wm_pattern[1] and x == x[1] and a == a[1] and b == b[1] and c == c[1]
  269. line.delete(array.get(wmlines, 0))
  270. line.delete(array.get(wmlines, 1))
  271. line.delete(array.get(wmlines, 2))
  272. line.delete(array.get(wmlines, 3))
  273. line.delete(array.get(wmlines, 4))
  274. line.delete(array.get(wmlines, 5))
  275. line.delete(array.get(wmlines, 6))
  276. line.delete(array.get(wmlines, 7))
  277. label.delete(array.get(wmlabel, 0))
  278. cancelW := true
  279. cancelW
  280.  
  281. if abcd_pattern[1] and a == a[1] and b == b[1] and c == c[1]
  282. line.delete(array.get(wmlines, 1))
  283. line.delete(array.get(wmlines, 2))
  284. line.delete(array.get(wmlines, 3))
  285. label.delete(array.get(wmlabel, 0))
  286. cancelA := true
  287. cancelA
  288.  
  289. if double_pattern[1] and a == a[1] and b == b[1] and c == c[1]
  290. line.delete(array.get(wmlines, 5))
  291. label.delete(array.get(wmlabel, 0))
  292. cancelD := true
  293. cancelD
  294.  
  295. if wm_pattern
  296. xa = line.new(y1=x, y2=a, x1=xBar, x2=aBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  297. ab = line.new(y1=a, y2=b, x1=aBar, x2=bBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  298. bc = line.new(y1=b, y2=c, x1=bBar, x2=cBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  299. cd = line.new(y1=c, y2=d, x1=cBar, x2=dBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  300. xb = line.new(y1=x, y2=b, x1=xBar, x2=bBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  301. bd = line.new(y1=b, y2=d, x1=bBar, x2=dBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  302. xd = line.new(y1=x, y2=d, x1=xBar, x2=dBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  303. ac = line.new(y1=a, y2=c, x1=aBar, x2=cBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  304. array.set(wmlines, 0, xa)
  305. array.set(wmlines, 1, ab)
  306. array.set(wmlines, 2, bc)
  307. array.set(wmlines, 3, cd)
  308. array.set(wmlines, 4, xb)
  309. array.set(wmlines, 5, bd)
  310. array.set(wmlines, 6, xd)
  311. array.set(wmlines, 7, ac)
  312. array.set(wmtype, 0, dir)
  313. if abcd_pattern and not wm_pattern
  314. ab = line.new(y1=a, y2=b, x1=aBar, x2=bBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  315. bc = line.new(y1=b, y2=c, x1=bBar, x2=cBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  316. cd = line.new(y1=c, y2=d, x1=cBar, x2=dBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  317. array.set(wmlines, 1, ab)
  318. array.set(wmlines, 2, bc)
  319. array.set(wmlines, 3, cd)
  320. array.set(wmtype, 0, dir)
  321. if double_pattern and not wm_pattern
  322. bd = line.new(y1=b, y2=d, x1=bBar, x2=dBar, color=zigzagColor, width=zigzagWidth, style=zigzagStyle)
  323. array.set(wmlines, 5, bd)
  324. array.set(wmtype, 0, dir)
  325.  
  326. if wm_pattern or abcd_pattern or double_pattern
  327. array.set(wmlabel, 0, get_harmonic_label(wmLabels, dir, d, dBar))
  328.  
  329. pattern = wm_pattern and not wm_pattern[1] or abcd_pattern and not abcd_pattern[1] or double_pattern and not double_pattern[1]
  330. pattern
  331.  
  332. zigzag(zigzag1Length, zigzagpivots1, zigzagpivotbars1, zigzagpivotdirs1)
  333. zigzag(zigzag2Length, zigzagpivots2, zigzagpivotbars2, zigzagpivotdirs2)
  334. zigzag(zigzag3Length, zigzagpivots3, zigzagpivotbars3, zigzagpivotdirs3)
  335. zigzag(zigzag4Length, zigzagpivots4, zigzagpivotbars4, zigzagpivotdirs4)
  336. zigzag(zigzag5Length, zigzagpivots5, zigzagpivotbars5, zigzagpivotdirs5)
  337.  
  338. wm_pattern1 = detect_harmonic_pattern(zigzagpivots1, zigzagpivotbars1, zigzagpivotdirs1, wmlines1, wmLabel1, wmtype1, wmLabels1, zigzag1Color, zigzag1Width, zigzag1Style, showZigZag1)
  339. wm_pattern2 = detect_harmonic_pattern(zigzagpivots2, zigzagpivotbars2, zigzagpivotdirs2, wmlines2, wmLabel2, wmtype2, wmLabels2, zigzag2Color, zigzag2Width, zigzag2Style, showZigZag2)
  340. wm_pattern3 = detect_harmonic_pattern(zigzagpivots3, zigzagpivotbars3, zigzagpivotdirs3, wmlines3, wmLabel3, wmtype3, wmLabels3, zigzag3Color, zigzag3Width, zigzag3Style, showZigZag3)
  341. wm_pattern4 = detect_harmonic_pattern(zigzagpivots4, zigzagpivotbars4, zigzagpivotdirs4, wmlines4, wmLabel4, wmtype4, wmLabels4, zigzag4Color, zigzag4Width, zigzag4Style, showZigZag4)
  342. wm_pattern5 = detect_harmonic_pattern(zigzagpivots5, zigzagpivotbars5, zigzagpivotdirs5, wmlines4, wmLabel5, wmtype5, wmLabels5, zigzag4Color, zigzag5Width, zigzag5Style, showZigZag5)
  343.  
  344. alertcondition(wm_pattern1 or wm_pattern2 or wm_pattern3 or wm_pattern4, title='New harmonic pattern alert', message='New harmonic pattern detected on {{ticker}}')
  345.  
  346. var stats = table.new(position=position.top_right, columns=8, rows=max_pivot_size + 2, border_width=1)
  347.  
  348. if barstate.islast and showStatTable
  349. if showZigZag1
  350. table.cell(table_id=stats, column=0, row=0, text='Zigzag ' + str.tostring(zigzag1Length), bgcolor=color.black, text_color=color.white)
  351. table.cell(table_id=stats, column=0, row=1, text='Price', bgcolor=color.black, text_color=color.white)
  352. table.cell(table_id=stats, column=1, row=1, text='BarIndex', bgcolor=color.black, text_color=color.white)
  353.  
  354. for i = 0 to array.size(zigzagpivots1) - 1 by 1
  355. bgcolor = array.get(zigzagpivotdirs1, i) == 1 ? color.lime : color.orange
  356. table.cell(table_id=stats, column=0, row=i + 2, text=str.tostring(array.get(zigzagpivots1, i)), bgcolor=bgcolor)
  357. table.cell(table_id=stats, column=1, row=i + 2, text=str.tostring(array.get(zigzagpivotbars2, i)), bgcolor=bgcolor)
  358.  
  359. if showZigZag2
  360. table.cell(table_id=stats, column=2, row=0, text='Zigzag ' + str.tostring(zigzag2Length), bgcolor=color.black, text_color=color.white)
  361. table.cell(table_id=stats, column=2, row=1, text='Price', bgcolor=color.black, text_color=color.white)
  362. table.cell(table_id=stats, column=3, row=1, text='BarIndex', bgcolor=color.black, text_color=color.white)
  363.  
  364. for i = 0 to array.size(zigzagpivots2) - 1 by 1
  365. bgcolor = array.get(zigzagpivotdirs2, i) == 1 ? color.lime : color.orange
  366. table.cell(table_id=stats, column=2, row=i + 2, text=str.tostring(array.get(zigzagpivots2, i)), bgcolor=bgcolor)
  367. table.cell(table_id=stats, column=3, row=i + 2, text=str.tostring(array.get(zigzagpivotbars2, i)), bgcolor=bgcolor)
  368.  
  369. if showZigZag3
  370. table.cell(table_id=stats, column=4, row=0, text='Zigzag ' + str.tostring(zigzag3Length), bgcolor=color.black, text_color=color.white)
  371. table.cell(table_id=stats, column=4, row=1, text='Price', bgcolor=color.black, text_color=color.white)
  372. table.cell(table_id=stats, column=5, row=1, text='BarIndex', bgcolor=color.black, text_color=color.white)
  373.  
  374. for i = 0 to array.size(zigzagpivots3) - 1 by 1
  375. bgcolor = array.get(zigzagpivotdirs3, i) == 1 ? color.lime : color.orange
  376. table.cell(table_id=stats, column=4, row=i + 2, text=str.tostring(array.get(zigzagpivots3, i)), bgcolor=bgcolor)
  377. table.cell(table_id=stats, column=5, row=i + 2, text=str.tostring(array.get(zigzagpivotbars3, i)), bgcolor=bgcolor)
  378.  
  379. if showZigZag4
  380. table.cell(table_id=stats, column=6, row=0, text='Zigzag ' + str.tostring(zigzag4Length), bgcolor=color.black, text_color=color.white)
  381. table.cell(table_id=stats, column=6, row=1, text='Price', bgcolor=color.black, text_color=color.white)
  382. table.cell(table_id=stats, column=7, row=1, text='BarIndex', bgcolor=color.black, text_color=color.white)
  383.  
  384. for i = 0 to array.size(zigzagpivots4) - 1 by 1
  385. bgcolor = array.get(zigzagpivotdirs4, i) == 1 ? color.lime : color.orange
  386. table.cell(table_id=stats, column=6, row=i + 2, text=str.tostring(array.get(zigzagpivots4, i)), bgcolor=bgcolor)
  387. table.cell(table_id=stats, column=7, row=i + 2, text=str.tostring(array.get(zigzagpivotbars4, i)), bgcolor=bgcolor)
Advertisement
Add Comment
Please, Sign In to add comment