ProRealCode - Trading & Coding with ProRealTime™
Buenas;
Sería posible pasar este indicador de Tradingview a esta plataforma
https://es.tradingview.com/script/RGNBIIcD-ABC-on-Recursive-Zigzag-Trendoscope/
Muchas Gracias,
Esto podría interesarte https://www.prorealcode.com/prorealtime-indicators/abcd-pattern-indicator/.
Hola:
Ya lo había visto, pues antes de pedir algo suelo hacer un rastreo de lo que ofrece nuestra pagina par ver si ofrece algo de lo que yo quiero.
No se ajusta, pero Gracias
buenos días. Aquí tienes el indicador:
//-----------------------------------------------------------//
//PRC_ABC on Recursive Zigzag (by Trendoscope)
//version = 0
//20.07.26
//Ivan Gonzalez @ www.prorealcode.com
//Sharing ProRealTime knowledge
//-----------------------------------------------------------//
// Detecta patrones ABC sobre un zigzag recursivo multinivel.
// C debe retroceder entre el 61.8% y el 78.6% de la pata AB.
// Proyecta entrada / stop / objetivo y sigue el estado de cada
// patron hasta su cierre, con panel de estadisticas.
// APLICAR SOBRE EL GRAFICO DE PRECIO (overlay).
//-----------------------------------------------------------//
defparam drawonlastbaronly = true
//-----Inputs (parametros configurables)---------------------//
zigzagLength = 13 //Longitud del zigzag de nivel 0
maxLevel = 3 //Nivel maximo de zigzag recursivo (0 = solo base)
minLevel = 0 //Nivel minimo a escanear
maxPivots = 120 //Pivotes de nivel 0 usados en el escaneo
baseMode = 1 //1 = ABC Extension, 2 = BC Retracement
entryRatio = 0.3 //Ratio de entrada
targetRatio = 1.0 //Ratio de objetivo
stopRatio = 0.0 //Ratio de stop (<= 0)
useLogScale = 0 //1 = calcular ratios en escala logaritmica
tradeCondition = 0 //0 any, 1 trend, 2 reverse, 3 contracting, 4 expanding
useCloseEntry = 1 //Usar cierre para detectar la entrada
useCloseTarget = 1 //Usar cierre para detectar el objetivo
useCloseStop = 1 //Usar cierre para detectar el stop
maxPatterns = 10 //Patrones activos simultaneos
showClosed = 1 //1 = mantener en gris los ultimos patrones cerrados
maxClosed = 6 //Cuantos patrones cerrados se conservan en pantalla
showZigzag = 0 //1 = dibujar el zigzag de nivel 0
showBoxes = 1 //1 = dibujar las cajas de riesgo/objetivo
showStats = 1 //1 = mostrar el panel de estadisticas
//-----------------------------------------------------------//
//-----Colores (RGB)-----------------------------------------//
rBull = 0 //alcista
gBull = 150
bBull = 80
rBear = 200 //bajista
gBear = 50
bBear = 50
//-----------------------------------------------------------//
//-----NIVEL 0: deteccion de pivotes-------------------------//
// ZigzagLite marca pivote cuando el extremo de la ventana cae
// en la barra actual (highestbars / lowestbars = 0).
newPivot = 0
IF barindex >= zigzagLength THEN
hb = highestbars[zigzagLength](high)
lb = lowestbars[zigzagLength](low)
IF hb = 0 AND lb <> 0 THEN
pvDir = 1
pvVal = high
ELSIF lb = 0 AND hb <> 0 THEN
pvDir = -1
pvVal = low
ELSIF hb = 0 AND lb = 0 THEN
pvDir = prevDir
IF pvDir = 1 THEN
pvVal = high
ELSE
pvVal = low
ENDIF
ELSE
pvDir = 0
pvVal = 0
ENDIF
IF pvDir <> 0 THEN
IF pvDir = 1 THEN
isHi = 1
ELSE
isHi = 0
ENDIF
// Primer pivote: sembrar sin filtro (learning 155)
IF npv = 0 THEN
$zI[0] = barindex
$zP[0] = pvVal
$zH[0] = isHi
npv = 1
newPivot = 1
ELSE
lastH = $zH[npv-1]
IF lastH = isHi THEN
// Misma direccion: extender el pivote vigente si mejora
lastP = $zP[npv-1]
IF isHi = 1 THEN
IF pvVal > lastP THEN
$zI[npv-1] = barindex
$zP[npv-1] = pvVal
newPivot = 1
ENDIF
ELSE
IF pvVal < lastP THEN
$zI[npv-1] = barindex
$zP[npv-1] = pvVal
newPivot = 1
ENDIF
ENDIF
ELSE
// Cambio de direccion: nuevo pivote
$zI[npv] = barindex
$zP[npv] = pvVal
$zH[npv] = isHi
npv = npv + 1
newPivot = 1
ENDIF
ENDIF
prevDir = pvDir
ENDIF
ENDIF
//-----------------------------------------------------------//
//-----ESCANEO MULTINIVEL (solo cuando hay pivote nuevo)-----//
IF newPivot = 1 AND npv >= 4 THEN
// Cargar la ventana de trabajo desde la capa de acumulacion
startK = npv - maxPivots
IF startK < 0 THEN
startK = 0
ENDIF
nw = 0
FOR k = startK TO npv - 1 DO
$wI[nw] = $zI[k]
$wP[nw] = $zP[k]
$wH[nw] = $zH[k]
nw = nw + 1
NEXT
FOR lev = 0 TO maxLevel DO
IF nw >= 4 THEN
// --- dir de cada pivote: +-1 retroceso, +-2 superacion ---
FOR k = 0 TO nw - 1 DO
IF $wH[k] = 1 THEN
$wD[k] = 1
ELSE
$wD[k] = -1
ENDIF
IF k >= 2 THEN
prevSame = $wP[k-2]
IF $wH[k] = 1 THEN
IF $wP[k] > prevSame THEN
$wD[k] = 2
ENDIF
ELSE
IF $wP[k] < prevSame THEN
$wD[k] = -2
ENDIF
ENDIF
ENDIF
NEXT
// --- Candidato ABC: los tres ultimos pivotes ---
IF lev >= minLevel THEN
cK = nw - 1
bK = nw - 2
aK = nw - 3
pA = $wP[aK]
pB = $wP[bK]
pC = $wP[cK]
iA = $wI[aK]
iB = $wI[bK]
iC = $wI[cK]
legAB = abs(pB - pA)
legBC = abs(pC - pB)
abcRatio = 0
IF legAB > 0 THEN
abcRatio = legBC / legAB
ENDIF
// Filtro de retroceso 0.618 - 0.786
ratioOk = 0
IF abcRatio >= 0.618 AND abcRatio <= 0.786 THEN
ratioOk = 1
ENDIF
// Filtro de condicion sobre |dir| de A y B
aDir = abs($wD[aK])
bDir = abs($wD[bK])
condOk = 0
IF tradeCondition = 0 THEN
condOk = 1
ELSIF tradeCondition = 1 AND aDir = 1 AND bDir = 2 THEN
condOk = 1
ELSIF tradeCondition = 2 AND aDir = 2 AND bDir = 1 THEN
condOk = 1
ELSIF tradeCondition = 3 AND aDir = 1 AND bDir = 1 THEN
condOk = 1
ELSIF tradeCondition = 4 AND aDir = 2 AND bDir = 2 THEN
condOk = 1
ENDIF
IF ratioOk = 1 AND condOk = 1 THEN
// Ya registrado? (mismo A y mismo B)
dup = 0
IF npt > 0 THEN
FOR q = 0 TO npt - 1 DO
IF $ptPA[q] = pA AND $ptPB[q] = pB THEN
dup = 1
ENDIF
NEXT
ENDIF
IF dup = 0 THEN
// Direccion: C por debajo de B = patron alcista
IF pB > pC THEN
pDirn = 1
ELSE
pDirn = -1
ENDIF
// --- Niveles de entrada / objetivo / stop ---
IF useLogScale = 1 AND pA > 0 AND pB > 0 AND pC > 0 THEN
lA = log(pA)
lB = log(pB)
lC = log(pC)
IF baseMode = 1 THEN
spanL = lB - lA
eLvl = exp(lC + spanL * entryRatio)
tLvl = exp(lC + spanL * targetRatio)
sLvl = exp(lC + spanL * stopRatio)
ELSE
spanL = lB - lC
eLvl = exp(lC + spanL * entryRatio)
tLvl = exp(lC + spanL * targetRatio)
sLvl = exp(lC + spanL * stopRatio)
ENDIF
ELSE
IF baseMode = 1 THEN
spanP = pB - pA
ELSE
spanP = pB - pC
ENDIF
eLvl = pC + spanP * entryRatio
tLvl = pC + spanP * targetRatio
sLvl = pC + spanP * stopRatio
ENDIF
// Solo se registra si el precio aun no alcanzo la entrada
inEntry = 0
IF close * pDirn < eLvl * pDirn THEN
inEntry = 1
ENDIF
IF inEntry = 1 THEN
// FIFO: si esta lleno, descartar el mas antiguo
IF npt >= maxPatterns AND npt > 0 THEN
FOR q = 0 TO npt - 2 DO
$ptIA[q] = $ptIA[q+1]
$ptPA[q] = $ptPA[q+1]
$ptIB[q] = $ptIB[q+1]
$ptPB[q] = $ptPB[q+1]
$ptIC[q] = $ptIC[q+1]
$ptPC[q] = $ptPC[q+1]
$ptDir[q] = $ptDir[q+1]
$ptEn[q] = $ptEn[q+1]
$ptSt[q] = $ptSt[q+1]
$ptTg[q] = $ptTg[q+1]
$ptStat[q] = $ptStat[q+1]
$ptRt[q] = $ptRt[q+1]
NEXT
npt = npt - 1
ENDIF
$ptIA[npt] = iA
$ptPA[npt] = pA
$ptIB[npt] = iB
$ptPB[npt] = pB
$ptIC[npt] = iC
$ptPC[npt] = pC
$ptDir[npt] = pDirn
$ptEn[npt] = eLvl
$ptSt[npt] = sLvl
$ptTg[npt] = tLvl
$ptStat[npt] = 0
$ptRt[npt] = abcRatio
npt = npt + 1
ENDIF
ENDIF
ENDIF
ENDIF
// --- Construir el zigzag del nivel siguiente ---
// Se conservan los pivotes que son extremo respecto a su
// homologo anterior y posterior; los consecutivos del mismo
// tipo se colapsan quedandose con el mas extremo.
IF lev < maxLevel THEN
nv = 0
FOR k = 0 TO nw - 1 DO
keep = 1
IF k < nw - 1 THEN
IF k >= 2 THEN
prevSame = $wP[k-2]
IF $wH[k] = 1 THEN
IF $wP[k] < prevSame THEN
keep = 0
ENDIF
ELSE
IF $wP[k] > prevSame THEN
keep = 0
ENDIF
ENDIF
ENDIF
IF k + 2 <= nw - 1 THEN
nextSame = $wP[k+2]
IF $wH[k] = 1 THEN
IF $wP[k] < nextSame THEN
keep = 0
ENDIF
ELSE
IF $wP[k] > nextSame THEN
keep = 0
ENDIF
ENDIF
ENDIF
ENDIF
IF keep = 1 THEN
doPush = 1
IF nv > 0 THEN
prevH = $vH[nv-1]
IF prevH = $wH[k] THEN
doPush = 0
prevP = $vP[nv-1]
IF $wH[k] = 1 THEN
IF $wP[k] > prevP THEN
$vP[nv-1] = $wP[k]
$vI[nv-1] = $wI[k]
ENDIF
ELSE
IF $wP[k] < prevP THEN
$vP[nv-1] = $wP[k]
$vI[nv-1] = $wI[k]
ENDIF
ENDIF
ENDIF
ENDIF
IF doPush = 1 THEN
$vI[nv] = $wI[k]
$vP[nv] = $wP[k]
$vH[nv] = $wH[k]
nv = nv + 1
ENDIF
ENDIF
NEXT
// Volcar el nivel construido a la ventana de trabajo
FOR k = 0 TO nv - 1 DO
$wI[k] = $vI[k]
$wP[k] = $vP[k]
$wH[k] = $vH[k]
NEXT
nw = nv
ENDIF
ENDIF
NEXT
ENDIF
//-----------------------------------------------------------//
//-----SEGUIMIENTO DE PATRONES ACTIVOS (cada barra)----------//
IF npt > 0 THEN
nAlive = 0
FOR k = 0 TO npt - 1 DO
pdr = $ptDir[k]
stt = $ptStat[k]
IF useCloseTarget = 1 THEN
vTarget = close
ELSIF pdr > 0 THEN
vTarget = high
ELSE
vTarget = low
ENDIF
IF useCloseStop = 1 THEN
vStop = close
ELSIF pdr > 0 THEN
vStop = low
ELSE
vStop = high
ENDIF
IF useCloseEntry = 1 THEN
vEntry = close
ELSIF pdr > 0 THEN
vEntry = high
ELSE
vEntry = low
ENDIF
// Estado: 0 pendiente, 1 entrada alcanzada, 2 objetivo alcanzado
newStat = stt
IF vEntry * pdr >= $ptEn[k] * pdr THEN
newStat = 1
ENDIF
IF vTarget * pdr >= $ptTg[k] * pdr THEN
newStat = 2
ENDIF
IF newStat < stt THEN
newStat = stt
ENDIF
// Cierre: stop tocado tras entrar, invalidacion antes de entrar,
// u objetivo ya alcanzado
closed = 0
IF newStat > 0 AND vStop * pdr <= $ptSt[k] * pdr THEN
closed = 1
ENDIF
IF newStat = 0 AND close * pdr <= $ptSt[k] * pdr THEN
closed = 1
ENDIF
IF stt = 2 THEN
closed = 1
ENDIF
$ptStat[k] = newStat
IF closed = 1 THEN
// Conservar el patron cerrado para seguir mostrandolo en gris.
// No altera deteccion ni estadisticas: solo evita que el grafico
// quede vacio cuando no hay ningun patron activo.
IF showClosed = 1 AND maxClosed > 0 THEN
IF nhs >= maxClosed THEN
FOR q = 0 TO nhs - 2 DO
$hsIA[q] = $hsIA[q+1]
$hsPA[q] = $hsPA[q+1]
$hsIB[q] = $hsIB[q+1]
$hsPB[q] = $hsPB[q+1]
$hsIC[q] = $hsIC[q+1]
$hsPC[q] = $hsPC[q+1]
$hsRt[q] = $hsRt[q+1]
NEXT
nhs = nhs - 1
ENDIF
$hsIA[nhs] = $ptIA[k]
$hsPA[nhs] = $ptPA[k]
$hsIB[nhs] = $ptIB[k]
$hsPB[nhs] = $ptPB[k]
$hsIC[nhs] = $ptIC[k]
$hsPC[nhs] = $ptPC[k]
$hsRt[nhs] = $ptRt[k]
nhs = nhs + 1
ENDIF
// Registrar en el contador correspondiente
IF pdr > 0 THEN
IF newStat = 0 THEN
bullInvalid = bullInvalid + 1
ELSIF newStat = 1 THEN
bullStopped = bullStopped + 1
ELSE
bullDone = bullDone + 1
ENDIF
ELSE
IF newStat = 0 THEN
bearInvalid = bearInvalid + 1
ELSIF newStat = 1 THEN
bearStopped = bearStopped + 1
ELSE
bearDone = bearDone + 1
ENDIF
ENDIF
ELSE
// Compactar: los vivos se reubican al principio del array
$ptIA[nAlive] = $ptIA[k]
$ptPA[nAlive] = $ptPA[k]
$ptIB[nAlive] = $ptIB[k]
$ptPB[nAlive] = $ptPB[k]
$ptIC[nAlive] = $ptIC[k]
$ptPC[nAlive] = $ptPC[k]
$ptDir[nAlive] = $ptDir[k]
$ptEn[nAlive] = $ptEn[k]
$ptSt[nAlive] = $ptSt[k]
$ptTg[nAlive] = $ptTg[k]
$ptStat[nAlive] = $ptStat[k]
$ptRt[nAlive] = $ptRt[k]
nAlive = nAlive + 1
ENDIF
NEXT
npt = nAlive
ENDIF
//-----------------------------------------------------------//
//-----DIBUJO (solo en la ultima barra)----------------------//
IF islastbarupdate THEN
atrv = averagetruerange[14]
// --- Zigzag de nivel 0 ---
IF showZigzag = 1 AND npv >= 2 THEN
firstK = npv - 30
IF firstK < 1 THEN
firstK = 1
ENDIF
FOR k = firstK TO npv - 1 DO
drawsegment($zI[k-1], $zP[k-1], $zI[k], $zP[k]) coloured(130, 130, 130) style(dottedline, 1)
NEXT
ENDIF
// --- Patrones ya cerrados (contexto historico, en gris) ---
IF showClosed = 1 AND nhs > 0 THEN
FOR k = 0 TO nhs - 1 DO
drawsegment($hsIA[k], $hsPA[k], $hsIB[k], $hsPB[k]) coloured(150, 150, 150) style(dottedline, 1)
drawsegment($hsIB[k], $hsPB[k], $hsIC[k], $hsPC[k]) coloured(150, 150, 150) style(dottedline, 1)
drawtext("A", $hsIA[k], $hsPA[k]) coloured(150, 150, 150)
drawtext("B", $hsIB[k], $hsPB[k]) coloured(150, 150, 150)
drawtext("C", $hsIC[k], $hsPC[k]) coloured(150, 150, 150)
NEXT
ENDIF
// --- Patrones activos ---
IF npt > 0 THEN
FOR k = 0 TO npt - 1 DO
IF $ptDir[k] > 0 THEN
pr = rBull
pg = gBull
pb = bBull
ELSE
pr = rBear
pg = gBear
pb = bBear
ENDIF
xA = $ptIA[k]
yA = $ptPA[k]
xB = $ptIB[k]
yB = $ptPB[k]
xC = $ptIC[k]
yC = $ptPC[k]
// Estructura A-B-C y linea guia A-C
drawsegment(xA, yA, xB, yB) coloured(pr, pg, pb) style(line, 2)
drawsegment(xB, yB, xC, yC) coloured(pr, pg, pb) style(line, 2)
drawsegment(xA, yA, xC, yC) coloured(pr, pg, pb) style(dottedline, 1)
// Etiquetas de los pivotes, desplazadas fuera de la vela
IF yA < yB THEN
offA = 0 - atrv * 0.4
offB = atrv * 0.4
ELSE
offA = atrv * 0.4
offB = 0 - atrv * 0.4
ENDIF
drawtext("A", xA, yA + offA) coloured(pr, pg, pb)
drawtext("B", xB, yB + offB) coloured(pr, pg, pb)
drawtext("C", xC, yC + offA) coloured(pr, pg, pb)
// Ratio de retroceso en el punto medio de A-C
midX = (xA + xC) / 2
midY = (yA + yC) / 2
rtx = round($ptRt[k] * 1000) / 1000
drawtext("#rtx#", midX, midY) coloured(pr, pg, pb)
// Cajas de riesgo y objetivo
IF showBoxes = 1 THEN
barDiff = min((xC - xA) / 2, 490)
IF barDiff < 5 THEN
barDiff = 5
ENDIF
xEnd = xC + barDiff
drawrectangle(xC, $ptEn[k], xEnd, $ptSt[k]) coloured(pr, pg, pb) fillcolor(200, 60, 60, 20)
drawrectangle(xC, $ptEn[k], xEnd, $ptTg[k]) coloured(pr, pg, pb) fillcolor(60, 200, 60, 20)
ENDIF
NEXT
ENDIF
// --- Panel de estadisticas ---
IF showStats = 1 THEN
bullClosed = bullDone + bullStopped
IF bullClosed > 0 THEN
bullWin = bullDone * 100 / bullClosed
ELSE
bullWin = 0
ENDIF
bearClosed = bearDone + bearStopped
IF bearClosed > 0 THEN
bearWin = bearDone * 100 / bearClosed
ELSE
bearWin = 0
ENDIF
riskSpan = entryRatio - stopRatio
IF riskSpan > 0 THEN
rrv = round((targetRatio - entryRatio) / riskSpan * 100) / 100
ELSE
rrv = 0
ENDIF
bwin = round(bullWin * 10) / 10
swin = round(bearWin * 10) / 10
pX = -530
pY = -30
drawtext("ABC on Recursive Zigzag", pX, pY, sansserif, bold, 11) coloured(60, 60, 60) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("Invalid", pX + 150, pY - 22, sansserif, bold, 10) coloured(60, 60, 60) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("Stopped", pX + 225, pY - 22, sansserif, bold, 10) coloured(60, 60, 60) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("Complete", pX + 305, pY - 22, sansserif, bold, 10) coloured(60, 60, 60) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("Win %", pX + 375, pY - 22, sansserif, bold, 10) coloured(60, 60, 60) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("R:R", pX + 425, pY - 22, sansserif, bold, 10) coloured(60, 60, 60) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("Bullish", pX + 40, pY - 44, sansserif, bold, 10) coloured(rBull, gBull, bBull) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#bullInvalid#", pX + 150, pY - 44) coloured(rBull, gBull, bBull) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#bullStopped#", pX + 225, pY - 44) coloured(rBull, gBull, bBull) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#bullDone#", pX + 305, pY - 44) coloured(rBull, gBull, bBull) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#bwin#", pX + 375, pY - 44) coloured(rBull, gBull, bBull) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#rrv#", pX + 425, pY - 44) coloured(rBull, gBull, bBull) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("Bearish", pX + 40, pY - 66, sansserif, bold, 10) coloured(rBear, gBear, bBear) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#bearInvalid#", pX + 150, pY - 66) coloured(rBear, gBear, bBear) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#bearStopped#", pX + 225, pY - 66) coloured(rBear, gBear, bBear) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#bearDone#", pX + 305, pY - 66) coloured(rBear, gBear, bBear) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#swin#", pX + 375, pY - 66) coloured(rBear, gBear, bBear) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
drawtext("#rrv#", pX + 425, pY - 66) coloured(rBear, gBear, bBear) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT)
ENDIF
ENDIF
//-----------------------------------------------------------//
return
Buenas Tardes:
Es justo lo que quería, el gráfico que adjuntas lo dice todo, No tengo palabras para agradecerte todo lo que haces por todos nosotros.
En días sucesivos voy a ver el funcionamiento del mismo, para ver toda su efectividad..
Eres un fenómeno. Muchísimas gracias.
This topic contains 4 replies,
has 3 voices, and was last updated by Maricarmen
1 day, 3 hours ago.
| Forum: | TradingView to ProRealTime Translation Center Forum |
| Started: | 07/19/2026 |
| Status: | Active |
| Attachments: | 1 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.