xmd79

TDI w/ Variety RSI, Averages, & Source Types

May 26th, 2023
378
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.10 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. // © loxx
  3.  
  4. //@version=5
  5. indicator("TDI w/ Variety RSI, Averages, & Source Types ",
  6. shorttitle = "TDIVRSIAST",
  7. overlay = false,
  8. timeframe="",
  9. timeframe_gaps = true)
  10.  
  11. import loxx/loxxvarietyrsi/1
  12. import loxx/loxxexpandedsourcetypes/4
  13. import loxx/loxxmas/1
  14.  
  15. greencolor = #2DD204
  16. redcolor = #D2042D
  17. darkGreenColor = #1B7E02
  18. darkRedColor = #93021F
  19.  
  20. SM02 = 'Signal Crosses'
  21. SM03 = 'Floating Boundary Crosses'
  22. SM04 = 'Horizontal Boundary Crosses'
  23. SM05 = 'Floating Middle Crosses'
  24. SM06 = 'Horizontal Middle Crosses'
  25.  
  26. smthtype = input.string("Kaufman", "Heikin-Ashi Better Caculation Type", options = ["AMA", "T3", "Kaufman"], group = "Source Settings")
  27. srcin = input.string("Close", "Source", group= "Source Settings",
  28. options =
  29. ["Close", "Open", "High", "Low", "Median", "Typical", "Weighted", "Average", "Average Median Body", "Trend Biased", "Trend Biased (Extreme)",
  30. "HA Close", "HA Open", "HA High", "HA Low", "HA Median", "HA Typical", "HA Weighted", "HA Average", "HA Average Median Body", "HA Trend Biased", "HA Trend Biased (Extreme)",
  31. "HAB Close", "HAB Open", "HAB High", "HAB Low", "HAB Median", "HAB Typical", "HAB Weighted", "HAB Average", "HAB Average Median Body", "HAB Trend Biased", "HAB Trend Biased (Extreme)"])
  32.  
  33. RsiPeriod = input.int(14, "RSI Period", group = "Basic Settings")
  34. RsiMethod = input.string("RSX", "RSI Type", options = ["RSX", "Regular", "Slow", "Rapid", "Harris", "Cuttler", "Ehlers Smoothed", "T3 RSI"], group = "Basic Settings")
  35. RsiPriceLinePeriod = input.int(2, "RSI Price Line Period", group = "Basic Settings")
  36.  
  37. // Signal line moving average method
  38. RsiPriceLineMAMode = input.string("Simple Moving Average - SMA", "Signal Line MA Type", options = ["ADXvma - Average Directional Volatility Moving Average", "Ahrens Moving Average"
  39. , "Alexander Moving Average - ALXMA", "Double Exponential Moving Average - DEMA", "Double Smoothed Exponential Moving Average - DSEMA"
  40. , "Exponential Moving Average - EMA", "Fast Exponential Moving Average - FEMA", "Fractal Adaptive Moving Average - FRAMA"
  41. , "Hull Moving Average - HMA", "IE/2 - Early T3 by Tim Tilson", "Integral of Linear Regression Slope - ILRS"
  42. , "Instantaneous Trendline", "Laguerre Filter", "Leader Exponential Moving Average", "Linear Regression Value - LSMA (Least Squares Moving Average)"
  43. , "Linear Weighted Moving Average - LWMA", "McGinley Dynamic", "McNicholl EMA", "Non-Lag Moving Average", "Parabolic Weighted Moving Average"
  44. , "Recursive Moving Trendline", "Simple Moving Average - SMA", "Sine Weighted Moving Average", "Smoothed Moving Average - SMMA"
  45. , "Smoother", "Super Smoother", "Three-pole Ehlers Butterworth", "Three-pole Ehlers Smoother"
  46. , "Triangular Moving Average - TMA", "Triple Exponential Moving Average - TEMA", "Two-pole Ehlers Butterworth", "Two-pole Ehlers smoother"
  47. , "Volume Weighted EMA - VEMA", "Zero-Lag DEMA - Zero Lag Double Exponential Moving Average", "Zero-Lag Moving Average"
  48. , "Zero Lag TEMA - Zero Lag Triple Exponential Moving Average"],
  49. group = "Basic Settings")
  50.  
  51. RsiSignalLinePeriod = input.int(7, "RSI Signal Line Period", group = "Basic Settings")
  52.  
  53. // Signal line moving average method
  54. RsiSignalLineMAMode = input.string("Simple Moving Average - SMA", "RSI Signal Line MA Type", options = ["ADXvma - Average Directional Volatility Moving Average", "Ahrens Moving Average"
  55. , "Alexander Moving Average - ALXMA", "Double Exponential Moving Average - DEMA", "Double Smoothed Exponential Moving Average - DSEMA"
  56. , "Exponential Moving Average - EMA", "Fast Exponential Moving Average - FEMA", "Fractal Adaptive Moving Average - FRAMA"
  57. , "Hull Moving Average - HMA", "IE/2 - Early T3 by Tim Tilson", "Integral of Linear Regression Slope - ILRS"
  58. , "Instantaneous Trendline", "Laguerre Filter", "Leader Exponential Moving Average", "Linear Regression Value - LSMA (Least Squares Moving Average)"
  59. , "Linear Weighted Moving Average - LWMA", "McGinley Dynamic", "McNicholl EMA", "Non-Lag Moving Average", "Parabolic Weighted Moving Average"
  60. , "Recursive Moving Trendline", "Simple Moving Average - SMA", "Sine Weighted Moving Average", "Smoothed Moving Average - SMMA"
  61. , "Smoother", "Super Smoother", "Three-pole Ehlers Butterworth", "Three-pole Ehlers Smoother"
  62. , "Triangular Moving Average - TMA", "Triple Exponential Moving Average - TEMA", "Two-pole Ehlers Butterworth", "Two-pole Ehlers smoother"
  63. , "Volume Weighted EMA - VEMA", "Zero-Lag DEMA - Zero Lag Double Exponential Moving Average", "Zero-Lag Moving Average"
  64. , "Zero Lag TEMA - Zero Lag Triple Exponential Moving Average"],
  65. group = "Basic Settings")
  66.  
  67. VolatilityBandPeriod = input.int(20, "Volatility Band Period", group = "Volatility Band Settings")
  68. VolatilityBandMultiplier = input.float(2, "Volatility Band Multiplier", group = "Volatility Band Settings")
  69.  
  70. sigtype = input.string(SM02, "Signal Type", options = [SM02, SM03, SM04, SM05, SM06], group = "Signal Settings")
  71.  
  72. statup = input.int(80, "Upper Horizontal Boundary", group = "Horizontal Boundary Settings")
  73. statmid = input.int(50, "Middle Horizontal Boundary", group = "Horizontal Boundary Settings")
  74. statdn = input.int(20, "Down Horizontal Boundary", group = "Horizontal Boundary Settings")
  75.  
  76. colorbars = input.bool(false, "Color Bars?", group = "UI Options")
  77. showSigs = input.bool(false, "Show Signals?", group = "UI Options")
  78.  
  79. frama_FC = input.int(defval=1, title="* Fractal Adjusted (FRAMA) Only - FC", group = "Moving Average Inputs")
  80. frama_SC = input.int(defval=200, title="* Fractal Adjusted (FRAMA) Only - SC", group = "Moving Average Inputs")
  81. instantaneous_alpha = input.float(defval=0.07, minval = 0, title="* Instantaneous Trendline (INSTANT) Only - Alpha", group = "Moving Average Inputs")
  82. _laguerre_alpha = input.float(title="* Laguerre Filter (LF) Only - Alpha", minval=0, maxval=1, step=0.1, defval=0.7, group = "Moving Average Inputs")
  83. lsma_offset = input.int(defval=0, title="* Least Squares Moving Average (LSMA) Only - Offset", group = "Moving Average Inputs")
  84. _pwma_pwr = input.int(2, "* Parabolic Weighted Moving Average (PWMA) Only - Power", minval=0, group = "Moving Average Inputs")
  85. kfl=input.float(0.666, title="* Kaufman's Adaptive MA (KAMA) Only - Fast End", group = "Moving Average Inputs")
  86. ksl=input.float(0.0645, title="* Kaufman's Adaptive MA (KAMA) Only - Slow End", group = "Moving Average Inputs")
  87. amafl = input.int(2, title="* Adaptive Moving Average (AMA) Only - Fast", group = "Moving Average Inputs")
  88. amasl = input.int(30, title="* Adaptive Moving Average (AMA) Only - Slow", group = "Moving Average Inputs")
  89.  
  90. haclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close)
  91. haopen = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, open)
  92. hahigh = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, high)
  93. halow = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, low)
  94. hamedian = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, hl2)
  95. hatypical = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, hlc3)
  96. haweighted = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, hlcc4)
  97. haaverage = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, ohlc4)
  98.  
  99. src = switch srcin
  100. "Close" => loxxexpandedsourcetypes.rclose()
  101. "Open" => loxxexpandedsourcetypes.ropen()
  102. "High" => loxxexpandedsourcetypes.rhigh()
  103. "Low" => loxxexpandedsourcetypes.rlow()
  104. "Median" => loxxexpandedsourcetypes.rmedian()
  105. "Typical" => loxxexpandedsourcetypes.rtypical()
  106. "Weighted" => loxxexpandedsourcetypes.rweighted()
  107. "Average" => loxxexpandedsourcetypes.raverage()
  108. "Average Median Body" => loxxexpandedsourcetypes.ravemedbody()
  109. "Trend Biased" => loxxexpandedsourcetypes.rtrendb()
  110. "Trend Biased (Extreme)" => loxxexpandedsourcetypes.rtrendbext()
  111. "HA Close" => loxxexpandedsourcetypes.haclose(haclose)
  112. "HA Open" => loxxexpandedsourcetypes.haopen(haopen)
  113. "HA High" => loxxexpandedsourcetypes.hahigh(hahigh)
  114. "HA Low" => loxxexpandedsourcetypes.halow(halow)
  115. "HA Median" => loxxexpandedsourcetypes.hamedian(hamedian)
  116. "HA Typical" => loxxexpandedsourcetypes.hatypical(hatypical)
  117. "HA Weighted" => loxxexpandedsourcetypes.haweighted(haweighted)
  118. "HA Average" => loxxexpandedsourcetypes.haaverage(haaverage)
  119. "HA Average Median Body" => loxxexpandedsourcetypes.haavemedbody(haclose, haopen)
  120. "HA Trend Biased" => loxxexpandedsourcetypes.hatrendb(haclose, haopen, hahigh, halow)
  121. "HA Trend Biased (Extreme)" => loxxexpandedsourcetypes.hatrendbext(haclose, haopen, hahigh, halow)
  122. "HAB Close" => loxxexpandedsourcetypes.habclose(smthtype, amafl, amasl, kfl, ksl)
  123. "HAB Open" => loxxexpandedsourcetypes.habopen(smthtype, amafl, amasl, kfl, ksl)
  124. "HAB High" => loxxexpandedsourcetypes.habhigh(smthtype, amafl, amasl, kfl, ksl)
  125. "HAB Low" => loxxexpandedsourcetypes.hablow(smthtype, amafl, amasl, kfl, ksl)
  126. "HAB Median" => loxxexpandedsourcetypes.habmedian(smthtype, amafl, amasl, kfl, ksl)
  127. "HAB Typical" => loxxexpandedsourcetypes.habtypical(smthtype, amafl, amasl, kfl, ksl)
  128. "HAB Weighted" => loxxexpandedsourcetypes.habweighted(smthtype, amafl, amasl, kfl, ksl)
  129. "HAB Average" => loxxexpandedsourcetypes.habaverage(smthtype, amafl, amasl, kfl, ksl)
  130. "HAB Average Median Body" => loxxexpandedsourcetypes.habavemedbody(smthtype, amafl, amasl, kfl, ksl)
  131. "HAB Trend Biased" => loxxexpandedsourcetypes.habtrendb(smthtype, amafl, amasl, kfl, ksl)
  132. "HAB Trend Biased (Extreme)" => loxxexpandedsourcetypes.habtrendbext(smthtype, amafl, amasl, kfl, ksl)
  133. => haclose
  134.  
  135. variant(type, src, len) =>
  136. sig = 0.0
  137. trig = 0.0
  138. special = false
  139. if type == "ADXvma - Average Directional Volatility Moving Average"
  140. [t, s, b] = loxxmas.adxvma(src, len)
  141. sig := s
  142. trig := t
  143. special := b
  144. else if type == "Ahrens Moving Average"
  145. [t, s, b] = loxxmas.ahrma(src, len)
  146. sig := s
  147. trig := t
  148. special := b
  149. else if type == "Alexander Moving Average - ALXMA"
  150. [t, s, b] = loxxmas.alxma(src, len)
  151. sig := s
  152. trig := t
  153. special := b
  154. else if type == "Double Exponential Moving Average - DEMA"
  155. [t, s, b] = loxxmas.dema(src, len)
  156. sig := s
  157. trig := t
  158. special := b
  159. else if type == "Double Smoothed Exponential Moving Average - DSEMA"
  160. [t, s, b] = loxxmas.dsema(src, len)
  161. sig := s
  162. trig := t
  163. special := b
  164. else if type == "Exponential Moving Average - EMA"
  165. [t, s, b] = loxxmas.ema(src, len)
  166. sig := s
  167. trig := t
  168. special := b
  169. else if type == "Fast Exponential Moving Average - FEMA"
  170. [t, s, b] = loxxmas.fema(src, len)
  171. sig := s
  172. trig := t
  173. special := b
  174. else if type == "Fractal Adaptive Moving Average - FRAMA"
  175. [t, s, b] = loxxmas.frama(src, len, frama_FC, frama_SC)
  176. sig := s
  177. trig := t
  178. special := b
  179. else if type == "Hull Moving Average - HMA"
  180. [t, s, b] = loxxmas.hma(src, len)
  181. sig := s
  182. trig := t
  183. special := b
  184. else if type == "IE/2 - Early T3 by Tim Tilson"
  185. [t, s, b] = loxxmas.ie2(src, len)
  186. sig := s
  187. trig := t
  188. special := b
  189. else if type == "Integral of Linear Regression Slope - ILRS"
  190. [t, s, b] = loxxmas.ilrs(src, len)
  191. sig := s
  192. trig := t
  193. special := b
  194. else if type == "Instantaneous Trendline"
  195. [t, s, b] = loxxmas.instant(src, instantaneous_alpha)
  196. sig := s
  197. trig := t
  198. special := b
  199. else if type == "Laguerre Filter"
  200. [t, s, b] = loxxmas.laguerre(src, _laguerre_alpha)
  201. sig := s
  202. trig := t
  203. special := b
  204. else if type == "Leader Exponential Moving Average"
  205. [t, s, b] = loxxmas.leader(src, len)
  206. sig := s
  207. trig := t
  208. special := b
  209. else if type == "Linear Regression Value - LSMA (Least Squares Moving Average)"
  210. [t, s, b] = loxxmas.lsma(src, len, lsma_offset)
  211. sig := s
  212. trig := t
  213. special := b
  214. else if type == "Linear Weighted Moving Average - LWMA"
  215. [t, s, b] = loxxmas.lwma(src, len)
  216. sig := s
  217. trig := t
  218. special := b
  219. else if type == "McGinley Dynamic"
  220. [t, s, b] = loxxmas.mcginley(src, len)
  221. sig := s
  222. trig := t
  223. special := b
  224. else if type == "McNicholl EMA"
  225. [t, s, b] = loxxmas.mcNicholl(src, len)
  226. sig := s
  227. trig := t
  228. special := b
  229. else if type == "Non-Lag Moving Average"
  230. [t, s, b] = loxxmas.nonlagma(src, len)
  231. sig := s
  232. trig := t
  233. special := b
  234. else if type == "Parabolic Weighted Moving Average"
  235. [t, s, b] = loxxmas.pwma(src, len, _pwma_pwr)
  236. sig := s
  237. trig := t
  238. special := b
  239. else if type == "Recursive Moving Trendline"
  240. [t, s, b] = loxxmas.rmta(src, len)
  241. sig := s
  242. trig := t
  243. special := b
  244. else if type == "Simple Moving Average - SMA"
  245. [t, s, b] = loxxmas.sma(src, len)
  246. sig := s
  247. trig := t
  248. special := b
  249. else if type == "Sine Weighted Moving Average"
  250. [t, s, b] = loxxmas.swma(src, len)
  251. sig := s
  252. trig := t
  253. special := b
  254. else if type == "Smoothed Moving Average - SMMA"
  255. [t, s, b] = loxxmas.smma(src, len)
  256. sig := s
  257. trig := t
  258. special := b
  259. else if type == "Smoother"
  260. [t, s, b] = loxxmas.smoother(src, len)
  261. sig := s
  262. trig := t
  263. special := b
  264. else if type == "Super Smoother"
  265. [t, s, b] = loxxmas.super(src, len)
  266. sig := s
  267. trig := t
  268. special := b
  269. else if type == "Three-pole Ehlers Butterworth"
  270. [t, s, b] = loxxmas.threepolebuttfilt(src, len)
  271. sig := s
  272. trig := t
  273. special := b
  274. else if type == "Three-pole Ehlers Smoother"
  275. [t, s, b] = loxxmas.threepolesss(src, len)
  276. sig := s
  277. trig := t
  278. special := b
  279. else if type == "Triangular Moving Average - TMA"
  280. [t, s, b] = loxxmas.tma(src, len)
  281. sig := s
  282. trig := t
  283. special := b
  284. else if type == "Triple Exponential Moving Average - TEMA"
  285. [t, s, b] = loxxmas.tema(src, len)
  286. sig := s
  287. trig := t
  288. special := b
  289. else if type == "Two-pole Ehlers Butterworth"
  290. [t, s, b] = loxxmas.twopolebutter(src, len)
  291. sig := s
  292. trig := t
  293. special := b
  294. else if type == "Two-pole Ehlers smoother"
  295. [t, s, b] = loxxmas.twopoless(src, len)
  296. sig := s
  297. trig := t
  298. special := b
  299. else if type == "Volume Weighted EMA - VEMA"
  300. [t, s, b] = loxxmas.vwema(src, len)
  301. sig := s
  302. trig := t
  303. special := b
  304. else if type == "Zero-Lag DEMA - Zero Lag Double Exponential Moving Average"
  305. [t, s, b] = loxxmas.zlagdema(src, len)
  306. sig := s
  307. trig := t
  308. special := b
  309. else if type == "Zero-Lag Moving Average"
  310. [t, s, b] = loxxmas.zlagma(src, len)
  311. sig := s
  312. trig := t
  313. special := b
  314. else if type == "Zero Lag TEMA - Zero Lag Triple Exponential Moving Average"
  315. [t, s, b] = loxxmas.zlagtema(src, len)
  316. sig := s
  317. trig := t
  318. special := b
  319. trig
  320.  
  321. rsimode = switch RsiMethod
  322. "RSX" => "rsi_rsx"
  323. "Regular" => "rsi_rsi"
  324. "Slow" => "rsi_slo"
  325. "Rapid" => "rsi_rap"
  326. "Harris" => "rsi_har"
  327. "Cuttler" => "rsi_cut"
  328. "Ehlers Smoothed" => "rsi_ehl"
  329. => "rsi_rsi"
  330.  
  331. prices = src
  332. rsi = loxxvarietyrsi.rsiVariety(rsimode, prices, RsiPeriod)
  333. rsiPL = variant(RsiPriceLineMAMode, rsi, RsiPriceLinePeriod)
  334. rsiSL = variant(RsiSignalLineMAMode, rsi, RsiSignalLinePeriod)
  335. bandMi = 0.
  336.  
  337. for k = 0 to VolatilityBandPeriod - 1
  338. bandMi += nz(rsi[k])
  339.  
  340. bandMi /= VolatilityBandPeriod
  341.  
  342. deviation = ta.stdev(rsi, VolatilityBandPeriod)
  343.  
  344. bandUp = bandMi + VolatilityBandMultiplier * deviation
  345. bandDn = bandMi - VolatilityBandMultiplier * deviation
  346. trend = 0
  347. trend := (rsiPL > rsiSL) ? 1 : (rsiPL < rsiSL) ? -1 : nz(trend[1])
  348.  
  349. state = 0.
  350. if sigtype == SM02
  351. if (rsiPL < rsiSL)
  352. state :=-1
  353. if (rsiPL > rsiSL)
  354. state := 1
  355. else if sigtype == SM03
  356. if (rsiPL < bandDn)
  357. state :=-1
  358. if (rsiPL > bandUp)
  359. state := 1
  360. else if sigtype == SM04
  361. if (rsiPL < statdn)
  362. state :=-1
  363. if (rsiPL > statup)
  364. state := 1
  365. else if sigtype == SM05
  366. if (rsiPL < bandMi)
  367. state :=-1
  368. if (rsiPL > bandMi)
  369. state := 1
  370. else if sigtype == SM06
  371. if (rsiPL < statmid)
  372. state :=-1
  373. if (rsiPL > statmid)
  374. state := 1
  375.  
  376. colorout = state == 1 ? greencolor : state == -1 ? redcolor : color.gray
  377.  
  378. PlotrsiPL = plot(rsiPL, "RSI Price Line", color = colorout, linewidth = 2)
  379. PlotrsiSL = plot(rsiSL, "RSI Signal Line", color = color.white, linewidth = 1)
  380.  
  381.  
  382. fill(PlotrsiPL, PlotrsiSL, color.new(colorout, 55))
  383.  
  384.  
  385. uppl = plot(bandUp, "Upper Band", color = darkGreenColor, linewidth = 1)
  386. dnpl = plot(bandDn, "Lower Band", color = darkRedColor, linewidth = 1)
  387. midpl = plot(bandMi, "Mid Level", color = color.new(color.yellow,95), linewidth = 1)
  388.  
  389. fill(uppl, midpl, color.new(greencolor, 85))
  390. fill(dnpl, midpl, color.new(redcolor, 85))
  391.  
  392. topLine = plot(statup, "Upper Horizontal Boundary", color = bar_index % 2 ? color.gray : na, linewidth = 1)
  393. midLine = plot(statmid, "Middle Horizontal Boundary", color = bar_index % 2 ? color.gray : na, linewidth = 4)
  394. downLine = plot(statdn, "Down Horizontal Boundary", color = bar_index % 2 ? color.gray : na, linewidth = 1)
  395.  
  396.  
  397. fill(topLine, midLine, color.new(greencolor, 90))
  398. fill(downLine, midLine, color.new(redcolor, 90))
  399.  
  400.  
  401. barcolor(colorbars ? colorout : na)
  402.  
  403. goLong =
  404. sigtype == SM02 ? ta.crossover(rsiPL, rsiSL) :
  405. sigtype == SM03 ? ta.crossover(rsiPL, bandUp) :
  406. sigtype == SM04 ? ta.crossover(rsiPL, statup) :
  407. sigtype == SM05 ? ta.crossover(rsiPL, bandMi) :
  408. ta.crossover(rsiPL, statmid)
  409.  
  410. goShort = sigtype == SM02 ? ta.crossunder(rsiPL, rsiSL) :
  411. sigtype == SM03 ? ta.crossunder(rsiPL, bandDn) :
  412. sigtype == SM04 ? ta.crossunder(rsiPL, statdn) :
  413. sigtype == SM05 ? ta.crossunder(rsiPL, bandMi) :
  414. ta.crossunder(rsiPL, statmid)
  415.  
  416. plotshape(showSigs and goLong, title = "Long", color = color.yellow, textcolor = color.yellow, text = "L", style = shape.triangleup, location = location.bottom, size = size.auto)
  417. plotshape(showSigs and goShort, title = "Short", color = color.fuchsia, textcolor = color.fuchsia, text = "S", style = shape.triangledown, location = location.top, size = size.auto)
  418.  
  419. alertcondition(goLong, title="Long", message="TDI w/ Variety RSI, Averages, & Source Types [Loxx: Long\nSymbol: {{ticker}}\nPrice: {{close}}")
  420. alertcondition(goShort, title="Short", message="TDI w/ Variety RSI, Averages, & Source Types [Loxx: Short\nSymbol: {{ticker}}\nPrice: {{close}}")
  421.  
  422.  
Advertisement
Add Comment
Please, Sign In to add comment