Advertisement
xmd79

wall indicator 1.0 by mmds

Jan 12th, 2023
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.08 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. // © matHodl
  3.  
  4. //@version=5
  5.  
  6. indicator("wall indicator 1.0 by mmds", overlay = true)
  7.  
  8. res = timeframe.period
  9. ratingSignal = "Trend"
  10.  
  11. //-----Condition
  12. calcRating(buy, sell) => buy ? 1 : ( sell ? -1 : 0 )
  13. calcRatingAll() =>
  14.  
  15.  
  16. //-----Stochastic
  17. lengthStoch = 14
  18. smoothKStoch = 3
  19. smoothDStoch = 3
  20. kStoch = ta.sma(ta.stoch(close, high, low, lengthStoch), smoothKStoch)
  21. dStoch = ta.sma(kStoch, smoothDStoch)
  22.  
  23.  
  24. //-----ADX
  25. float adxValue = na, float adxPlus = na, float adxMinus = na
  26. [P, M, V] = ta.dmi(14, 14)
  27. adxValue := V
  28. adxPlus := P
  29. adxMinus := M
  30.  
  31. //-----Bollinger Bands
  32. mult = 2
  33. basis = ta.sma(close, 20)
  34. dev = mult * ta.stdev(close, 20)
  35. upper = basis + dev
  36. lower = basis - dev
  37.  
  38. float ratingOther = 0
  39. float ratingOtherC = 0
  40.  
  41. float ratingStoch = na
  42. if not(na(kStoch) or na(dStoch) or na(kStoch[1]) or na(dStoch[1]))
  43. ratingStoch := calcRating(kStoch < 20 and dStoch < 20 and kStoch > dStoch and kStoch[1] < dStoch[1], kStoch > 80 and dStoch > 80 and kStoch < dStoch and kStoch[1] > dStoch[1])
  44. ratingOtherC := ratingOtherC + 1
  45. ratingOther := ratingOther + ratingStoch
  46.  
  47. float ratingADX = na
  48. if not(na(adxValue) or na(adxPlus[1]) or na(adxMinus[1]) or na(adxPlus) or na(adxMinus))
  49. ratingADX := calcRating(adxValue > 20 and adxPlus[1] < adxMinus[1] and adxPlus > adxMinus, adxValue > 20 and adxPlus[1] > adxMinus[1] and adxPlus < adxMinus)
  50. ratingOtherC := ratingOtherC + 1
  51. ratingOther := ratingOther + ratingADX
  52.  
  53. float ratingBB = na
  54. if not(na(upper) or na(lower) or na(upper[1]) or na(lower[1]))
  55. ratingBB := calcRating(close < lower, close > upper)
  56. ratingOtherC := ratingOtherC + 1
  57. ratingOther := ratingOther + ratingBB
  58.  
  59. ratingOther := ratingOtherC > 0 ? ratingOther / ratingOtherC : na
  60.  
  61. float ratingTotal = 0
  62. float ratingTotalC = 0
  63.  
  64. if not na(ratingOther)
  65. ratingTotal := ratingTotal + ratingOther
  66. ratingTotalC := ratingTotalC + 1
  67. ratingTotal := ratingTotalC > 0 ? ratingTotal / ratingTotalC : na
  68.  
  69. [ratingTotal, ratingOther]
  70.  
  71. signalBound = 0.25
  72.  
  73. getSignal(ratingTotal, ratingOther) =>
  74. float _res = ratingTotal
  75. if ratingSignal == "Trend"
  76. _res := ratingOther
  77. _res
  78.  
  79. [ratingTotal, ratingOther] = request.security(syminfo.tickerid, res, calcRatingAll())
  80. tradeSignal = getSignal(ratingTotal, ratingOther)
  81.  
  82. dynSLpoints(factor) => factor * ta.atr(14) / syminfo.mintick
  83.  
  84. //-----Strategy
  85. lblLow = low - (ta.atr(30) * 0.6)
  86. lblHigh = high + (ta.atr(30) * 0.6)
  87.  
  88. var label cond1 = na
  89. var label cond2 = na
  90.  
  91. if tradeSignal > signalBound
  92. cond1 := label.new(bar_index, lblLow, str.tostring(close, format.mintick), style = label.style_label_up, color = color.green, textcolor = color.white, size = size.small)
  93. label.delete(cond1[1])
  94.  
  95. if tradeSignal < -signalBound
  96. cond2 := label.new(bar_index, lblHigh, str.tostring(close, format.mintick), style = label.style_label_down, color = color.red, textcolor = color.white, size = size.small)
  97. label.delete(cond2[1])
  98.  
  99. //-----Trendline
  100. upper = 0.0
  101. lower = 0.0
  102. slope_ph = 0.0
  103. slope_pl = 0.0
  104.  
  105. ph = ta.pivothigh(21, 21)
  106. pl = ta.pivotlow(21, 21)
  107. lineReg = math.abs(ta.sma(close * bar_index, 21) - ta.sma(close, 21) * ta.sma(bar_index, 21)) / ta.variance(bar_index, 21) / 2 * 1.0
  108.  
  109. slope_ph := ph ? lineReg : slope_ph[1]
  110. slope_pl := pl ? lineReg : slope_pl[1]
  111.  
  112. upper := ph ? ph : upper[1] - slope_ph
  113. lower := pl ? pl : lower[1] + slope_pl
  114.  
  115. single_upper = 0
  116. single_lower = 0
  117. single_upper := close[21] > upper ? 0 : ph ? 1 : single_upper[1]
  118. single_lower := close[21] < lower ? 0 : pl ? 1 : single_lower[1]
  119. upper_breakout = single_upper[1] and close[21] > upper and (close > close[21])
  120. lower_breakout = single_lower[1] and close[21] < lower and (close < close[21])
  121.  
  122. var line up_l = na
  123. var line dn_l = na
  124. var label recent_up_break = na
  125. var label recent_dn_break = na
  126. var breakValue = 0.00000
  127.  
  128. if ph[1]
  129. up_l := line.new(bar_index - 21 - 1, ph[1], bar_index - 21, upper, color = color.lime, extend=extend.right, style=line.style_dashed)
  130. line.delete(up_l[1])
  131. label.delete(recent_up_break[1])
  132.  
  133. if pl[1]
  134. dn_l := line.new(bar_index - 21 - 1, pl[1], bar_index - 21, lower, color = color.red, extend=extend.right, style=line.style_dashed)
  135. line.delete(dn_l[1])
  136. label.delete(recent_dn_break[1])
  137.  
  138. upTrend = ta.crossover(close, upper-slope_ph * 21)
  139. downTrend = ta.crossunder(close, lower+slope_pl * 21)
  140.  
  141. if upTrend
  142. breakValue := close
  143. recent_up_break := label.new(bar_index, lblLow,'B', color = color.green, textcolor=color.white, style=label.style_label_up, size=size.tiny)
  144. label.delete(recent_up_break[1])
  145.  
  146. if downTrend
  147. breakValue := close
  148. recent_dn_break := label.new(bar_index, lblHigh,'B', color = color.red, textcolor=color.white, style=label.style_label_down, size=size.tiny)
  149. label.delete(recent_dn_break[1])
  150.  
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement