Así que este guión es mi mejora a MacD que todos conocemos, es más rápido y más preciso con menos retraso La primera se basa en la OBV como fuente principal. A continuación, convertimos el OBV a formato de estilo MA, en este caso podemos agregar todas las formas de MA para calcularlo. Como verá en semanas tiene muchos tipos de MA ya que cada uno se comporta de manera diferente Hago que la señal esté en forma lineal para que sea más nítida / y al final para hacer la señal uso el método de Alex Grover (este tipo es un genio:)) En el paso final podemos hacer pivots punto en nuestro nuevo para MacD El resultado final es un MACD más rápido, más preciso y con muchas más opciones de modificación que el MACD normal. Este es un indicador de volumen basado así que en algún gráfico donde el volumen no existe esto no funcionará
Prueba posterior
/*backtest start: 2022-04-30 00:00:00 end: 2022-05-29 23:59:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 study("OBV MACD Indicator",overlay=false) // MACD src1 = close window_len = 28 v_len = 14 price_spread = stdev(high-low, window_len) v = cum(sign(change(src1)) * volume) smooth = sma(v, v_len) v_spread = stdev(v - smooth, window_len) shadow = (v - smooth) / v_spread * price_spread out = shadow > 0 ? high + shadow : low + shadow //plot(out, style=line,linewidth=3, color=color) len10=input(1,title="OBV Length ") obvema=ema(out,len10) // src = obvema type = input(defval="DEMA", title="MA Type", options=["TDEMA", "TTEMA", "TEMA", "DEMA", "EMA", "AVG", "THMA", "ZLEMA", "ZLDEMA", "ZLTEMA", "DZLEMA", "TZLEMA", "LLEMA", "NMA"]) showma = true len = input(9, title="MA Length ") showma1 = false len1 = 26 showma2 =false len2 = 52 nma(src, length1, length2) => lambda = length1 / length2 alpha = lambda * (length1 - 1) / (length1 - lambda) ma1 = ema(src, length1) ma2 = ema(ma1, length2) nma = (1 + alpha) * ma1 - alpha * ma2 dema(src, len) => ma1 = ema(src, len) ma2 = ema(ma1, len) 2 * ma1 - ma2 tema(src, len) => ma1 = ema(src, len) ma2 = ema(ma1, len) ma3 = ema(ma2, len) 3 * (ma1 - ma2) + ma3 tdema(src, len) => ma1 = dema(src, len) ma2 = dema(ma1, len) ma3 = dema(ma2, len) 3 * (ma1 - ma2) + ma3 ttema(src, len) => ma1 = tema(src, len) ma2 = tema(ma1, len) ma3 = tema(ma2, len) 3 * (ma1 - ma2) + ma3 tnma(src, len) => ma1 = nma(src, len, 3) ma2 = nma(ma1, len, 3) ma3 = nma(ma2, len, 3) 3 * (ma1 - ma2) + ma3 hma(src, len) => wma(2*wma(src, len/2)-wma(src, len), round(sqrt(len))) thma(src, len) => ma1 = hma(src, len) ma2 = hma(ma1, len) ma3 = hma(ma2, len) 3 * (ma1 - ma2) + ma3 zlema(src, len) => lag = round((len - 1) / 2) zlsrc = src + (src - src[lag]) ema(zlsrc, len) zldema(src, len) => lag = round((len - 1) / 2) zlsrc = src + (src - src[lag]) dema(zlsrc, len) zltema(src, len) => lag = round((len - 1) / 2) zlsrc = src + (src - src[lag]) tema(zlsrc, len) dzlema(src, len) => ma1 = zlema(src, len) ma2 = zlema(ma1, len) 2 * ma1 - ma2 tzlema(src, len) => ma1 = zlema(src, len) ma2 = zlema(ma1, len) ma3 = zlema(ma2, len) 3 * (ma1 - ma2) + ma3 llema(src, len) => srcnew = 0.25*src + 0.5*src[1] + 0.25*src[2] ema(srcnew, len) lltema(src, len) => srcnew = 0.25*src + 0.5*src[1] + 0.25*src[2] tema(srcnew, len) myma(src, len) => if type == "EMA" ema(src, len) else if type == "DEMA" dema(src, len) else if type == "TEMA" tema(src, len) else if type == "TDEMA" tdema(src, len) else if type == "TTEMA" ttema(src, len) else if type == "THMA" thma(src, len) else if type == "ZLEMA" zlema(src, len) else if type == "ZLDEMA" zldema(src, len) else if type == "ZLTEMA" zltema(src, len) else if type == "DZLEMA" dzlema(src, len) else if type == "TZLEMA" tzlema(src, len) else if type == "LLEMA" llema(src, len) else if type == "NMA" nma(src, len, len1) else avg(ttema(src, len), tdema(src, len)) ma = showma ? myma(src, len) : na slow_length = input(title="MACD Slow Length", type=input.integer, defval=26) //signal_length = input(title="MACD Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) src12=close plot(0,linewidth=3,color=color.black) // Calculating MACD slow_ma = ema(src12, slow_length) macd =ma-slow_ma //signal_length=input(9) //signal = ema(macd, signal_length) //plot(signal,linewidth=2) src5 = macd len5 = input(2) offset = 0 calcSlope(src5, len5) => sumX = 0.0 sumY = 0.0 sumXSqr = 0.0 sumXY = 0.0 for i = 1 to len5 val = src5[len5-i] per = i + 1.0 sumX := sumX + per sumY := sumY + val sumXSqr := sumXSqr + per * per sumXY := sumXY + val * per slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX) average = sumY / len5 intercept = average - slope * sumX / len5 + slope [slope, average, intercept] var float tmp = na [s, a5, i] = calcSlope(src5, len5) tt1=(i + s * (len5 - offset)) ////script based on alex grover from https://www.tradingview.com/script/KzTi6CZP-T-Channels/ p = 1,src15=tt1 b5 = 0.,dev5 = 0.,oc = 0 n5 = cum(1) - 1 a15 = cum(abs(src15 - nz(b5[1],src15)))/n5*p b5 := src15 > nz(b5[1],src15) + a15 ? src15 : src15 < nz(b5[1],src15) - a15 ? src15 : nz(b5[1],src15) //---- dev5 := change(b5) ? a15 : nz(dev5[1],a15) //---- oc := change(b5) > 0 ? 1 : change(b5) < 0 ? -1 : nz(oc[1]) //---- cs = oc == 1 ? color.blue : color.red //change(oc)>0 plot(b5,color=cs,linewidth=4,transp=50) // down = change(oc)<0 up = change(oc)>0 showsignal=input(false) plot(showsignal and up ?tt1 :na, style=plot.style_cross, color=color.blue, linewidth=4, transp=0,offset=-1) plot(showsignal and down ?tt1 :na, style=plot.style_cross, color=color.red, linewidth=4, transp=0,offset=-1) //hist = macd - signal //barColor =hist >= 0 and hist> signal ? color.teal : hist > 0 and hist < signal ? color.lime : hist < 0 and hist < signal ? color.red : color.orange //plot(hist, color=barColor, style=plot.style_histogram, linewidth=3) upper = tt1 lower = tt1 // DIVS code piv = input(true, "Hide pivots?") shrt = false xbars = input(50, "period", input.integer, minval=1) hb = abs(highestbars(upper, xbars)) lb = abs(lowestbars(lower, xbars)) max = float(na) max_upper = float(na) min = float(na) min_lower = float(na) pivoth = bool(na) pivotl = bool(na) max := hb == 0 ? close : na(max[1]) ? close : max[1] max_upper := hb == 0 ? upper : na(max_upper[1]) ? upper : max_upper[1] min := lb == 0 ? close : na(min[1]) ? close : min[1] min_lower := lb == 0 ? lower : na(min_lower[1]) ? lower : min_lower[1] if close > max max := close max if upper > max_upper max_upper := upper max_upper if close < min_lower min_lower := lower min_lower if lower < min_lower min_lower := lower min_lower pivoth := max_upper == max_upper[2] and max_upper[2] != max_upper[3] ? true : na pivotl := min_lower == min_lower[2] and min_lower[2] != min_lower[3] ? true : na plotshape(piv ? na : shrt ? na : pivoth ? max_upper + 2 : na, location=location.absolute, style=shape.labeldown, color=color.red, size=size.tiny, text="Pivot", textcolor=color.white, transp=0, offset=0) plotshape(piv ? na : shrt ? na : pivotl ? min_lower - 2 : na, location=location.absolute, style=shape.labelup, color=color.blue, size=size.tiny, text="Pivot", textcolor=color.white, transp=0, offset=0) if pivoth strategy.entry("Enter Long", strategy.long) else if pivotl strategy.entry("Enter Short", strategy.short)