Another MACD (Moving Average Convergence Divergence) indicator built upon a special moving average formula that adapt its period automatically accordingly to the market behaviour and noises. This moving average is called the OMA (One More Average), the formula come from an MT4 version found on internet.
The adaptive period can be more or less adaptive by changing the “sensibility” parameter (0.1 step). The adaptive behaviour of the formula can be shutdown with “Adaptive=0”.
MACD parameters can be changed between at lines 11 and 12 (Fast and Slow moving average periods).
The signal line is made with an ALMA.
I add the dynamic gradient color code to customise the look and feel of the classic MACD histogram, so this indicator is only compatible with PRT v10.3 and above.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
//PRC_OneMoreAverage MACD | indicator //23.11.2016 //Nicolas @ www.prorealcode.com //Sharing ProRealTime knowledge //--parameters //>OMA parameters Sensibility = 1 Adaptive = 1 //>MACD periods FLength = 24 SLength = 52 //>signal line SigLength = 9 Sigma = 4 Offset = 0.85 //-------- Speed = Sensibility Speed = Max(Speed,-1.5) price = average[1](customclose) tconst=Speed //--Fast moving average FLength = Max(FLength,1) //adaptive period averagePeriod = FLength if adaptive=1 and averagePeriod > 1 then minPeriod = averagePeriod/2.0 maxPeriod = minPeriod*5.0 endPeriod = round(maxPeriod) signal = Abs((price-stored[endPeriod])) noise = 0.00000000001 for k=1 to endPeriod do noise=noise+Abs(price-stored[k]) averagePeriod = round(((signal/noise)*(maxPeriod-minPeriod))+minPeriod) next endif alpha = (2.0+tconst)/(1.0+tconst+averagePeriod) e1 = e1 + alpha*(price-e1) e2 = e2 + alpha*(e1-e2) v1 = 1.5 * e1 - 0.5 * e2 e3 = e3 + alpha*(v1 -e3) e4 = e4 + alpha*(e3-e4) v2 = 1.5 * e3 - 0.5 * e4 e5 = e5 + alpha*(v2 -e5) e6 = e6 + alpha*(e5-e6) Fast = 1.5 * e5 - 0.5 * e6 //------------------------------------ //--Slow moving average SLength = Max(SLength,1) //adaptive period averagePeriod = SLength if adaptive=1 and averagePeriod > 1 then minPeriod = averagePeriod/2.0 maxPeriod = minPeriod*5.0 endPeriod = round(maxPeriod) signal = Abs((price-stored[endPeriod])) noise = 0.00000000001 for k=1 to endPeriod do noise=noise+Abs(price-stored[k]) averagePeriod = round(((signal/noise)*(maxPeriod-minPeriod))+minPeriod) next endif alpha = (2.0+tconst)/(1.0+tconst+averagePeriod) e1 = e1 + alpha*(price-e1) e2 = e2 + alpha*(e1-e2) v1 = 1.5 * e1 - 0.5 * e2 e3 = e3 + alpha*(v1 -e3) e4 = e4 + alpha*(e3-e4) v2 = 1.5 * e3 - 0.5 * e4 e5 = e5 + alpha*(v2 -e5) e6 = e6 + alpha*(e5-e6) Slow = 1.5 * e5 - 0.5 * e6 //------------------------------------ //--Signal moving average OMAMACD = Slow-Fast SigLength = Max(SigLength,1) //---Signal MA n = (Offset * (SigLength - 1)) t = SigLength/Sigma SWtdSum = 0 SCumWt = 0 for k = 0 to SigLength - 1 do SWtd = Exp(-((k-n)*(k-n))/(2*t*t)) SWtdSum = SWtdSum + SWtd * OMAMACD[SigLength - 1 - k] SCumWt = SCumWt + SWtd next SIGMACD = SWtdSum / SCumWt //------------------------------------ stored=price // --- ProRealcode RGB color matrix for PRT v10.3 valueentry = OMAMACD //data entry for automatic color scaling maxr = 153 //R of RGB value for "bullish" sentiment/zone maxg = 255 //G of RGB value for "bullish" sentiment/zone maxb = 153 //B of RGB value for "bullish" sentiment/zone minr = 255 //R of RGB value for "bearish" sentiment/zone ming = 204 //G of RGB value for "bearish" sentiment/zone minb = 204 //B of RGB value for "bearish" sentiment/zone maxvalue = highest[200](valueentry) //could be modified by the maximum value in a bounded oscillator middlevalue = 0 //middle value of the indicator minvalue = lowest[200](valueentry) //could be modified by the minimum value in a bounded oscillator absmaxvalue = abs(maxvalue) absminvalue = abs(minvalue) absmidvalue = abs(middlevalue) if valueentry>absmidvalue then r = maxr/(absmaxvalue-absmidvalue)*valueentry g = maxg/(absmaxvalue-absmidvalue)*valueentry b = maxb/(absmaxvalue-absmidvalue)*valueentry else r = abs(minr/abs(absminvalue-absmidvalue)*valueentry) g = abs(ming/abs(absminvalue-absmidvalue)*valueentry) b = abs(minb/abs(absminvalue-absmidvalue)*valueentry) endif RETURN OMAMACD coloured(r,g,b), SIGMACD as "Signal" |
Share this
No information on this site is investment advice or a solicitation to buy or sell any financial instrument. Past performance is not indicative of future results. Trading may expose you to risk of loss greater than your deposits and is only suitable for experienced investors who have sufficient financial means to bear such risk.
ProRealTime ITF files and other attachments :PRC is also on YouTube, subscribe to our channel for exclusive content and tutorials
Thank you very much Nicolas for this great indicator. I have tried to apply it to a trading system, but I fail. I tried to tweak the different parameters but without any results. Any ideas why? I have posted my question at https://www.prorealcode.com/topic/a-trading-system-based-on-the-indicator-one-more-average-macd/
No funciona este indicador ¿¿?? ¿Alguien sabe por qué?