Buenos días al grupo.
Os agradecería pudierais poder traducir a PRT el script para PINESCRIPT del indicador JURIK CFB ADAPTIVE QQE cuyo autor es LOXX.
Os paso el enlace donde encontrar dicho PINESCRIPT:
https://www.tradingview.com/script/FS2ctCcJ-Jurik-CFB-Adaptive-QQE-Loxx/
También os adjunto una imagen del mismo así como la descripción (un poco larga para incluirla en el cuerpo del mensaje).
Nuevamente el uso de los array me confunde bastante, asi como alguna linea del script (la linea 71 del PINESCRIPT me tiene fascinado porque la condición del IF es
(bar_index >= bar_index - depth * 2)
ya que los valores de la variable “depth” serán siempre positivos si no estoy equivocado ).
He intentado por mi parte hacer una conversión y he visto que todas las funciones necesarias están incluidas y no hace llamadas a ninguna librería externa.
Os lo agradezco de antemano, en caso de que pudierais hecharle un vistazo y poder convertir el PINESCRIPT a PRT.
Recibid un cordial saludo.
Pedro Lopez
Aquí tienes. He programado 2, la completa y la simplificada. Publico la simplificada porque los resultados son casi identicos y es utilizable, la completa tarda mucho en cargar por utilizar blucles anidados (no es operativa).
//PRC_Jurik QQE (simple, sin CFB Adaptive)
//version = 0
//11.05.26
//Ivan Gonzalez @ www.prorealcode.com
//Sharing ProRealTime knowledge
//-----------------------------------------------------
//===INPUTS===
rsiTypeOpt = 1 //0=Wilders, 1=RSX, 2=Rapid
rsiPeriod = 14 //RSI period
RsiSmoothingFactor = 5 //EMA smoothing del RSI
RsiPriceSmoothing = 1 //SMA del source antes del RSI
WPFast = 2.618 //Factor Fast Trend
WPSlow = 4.236 //Factor Slow Trend
overbought = 80
oversold = 20
//-----------------------------------------------------
//===Source smoothed (nativo, no necesita seed)===
closer = average[RsiPriceSmoothing](close)
//===Wilders RSI (nativo)===
wildersRsi = rsi[rsiPeriod](closer)
//===RSX (Jurik RSI) — cascada recursiva con seed===
IF BarIndex = 0 THEN
f28 = 0
f30 = 0
f38 = 0
f40 = 0
f48 = 0
f50 = 0
f58 = 0
f60 = 0
f68 = 0
f70 = 0
f78 = 0
f80 = 0
rsxVal = 50
ELSE
srcRsx = 100 * closer
mom0 = srcRsx - srcRsx[1]
moa0 = ABS(mom0)
Kg = 3 / (rsiPeriod + 2)
Hg = 1 - Kg
//--cascada mom (4 etapas)
f28 = Kg * mom0 + Hg * f28[1]
f30 = Hg * f30[1] + Kg * f28
mom1 = f28 * 1.5 - f30 * 0.5
f38 = Hg * f38[1] + Kg * mom1
f40 = Kg * f38 + Hg * f40[1]
mom2 = f38 * 1.5 - f40 * 0.5
f48 = Hg * f48[1] + Kg * mom2
f50 = Kg * f48 + Hg * f50[1]
momOut = f48 * 1.5 - f50 * 0.5
//--cascada moa (4 etapas)
f58 = Hg * f58[1] + Kg * moa0
f60 = Kg * f58 + Hg * f60[1]
moa1 = f58 * 1.5 - f60 * 0.5
f68 = Hg * f68[1] + Kg * moa1
f70 = Kg * f68 + Hg * f70[1]
moa2 = f68 * 1.5 - f70 * 0.5
f78 = Hg * f78[1] + Kg * moa2
f80 = Kg * f78 + Hg * f80[1]
moaOut = f78 * 1.5 - f80 * 0.5
//--resultado
IF moaOut <> 0 THEN
rsxRaw = (momOut / moaOut + 1) * 50
ELSE
rsxRaw = 50
ENDIF
rsxVal = MAX(MIN(rsxRaw, 100), 0)
ENDIF
//===Rapid RSI (nativo con summation)===
upMov = MAX(closer - closer[1], 0)
dnMov = MAX(closer[1] - closer, 0)
upSumR = summation[rsiPeriod](upMov)
dnSumR = summation[rsiPeriod](dnMov)
IF dnSumR = 0 THEN
rapidRsi = 100
ELSIF upSumR = 0 THEN
rapidRsi = 0
ELSE
rapidRsi = 100 - 100 / (1 + upSumR / dnSumR)
ENDIF
//===Selector RSI===
IF rsiTypeOpt = 0 THEN
rawRsi = wildersRsi
ELSIF rsiTypeOpt = 1 THEN
rawRsi = rsxVal
ELSE
rawRsi = rapidRsi
ENDIF
//===QQE — requiere histórico mínimo (rsiPeriod + smoothing)===
warmupBars = rsiPeriod + RsiSmoothingFactor + 2
IF BarIndex < warmupBars THEN
//--Seeds iniciales: oscilador en línea media, trends iguales (sin disparar)
rsiMA = 50
MaAtrRsi = 0
outerJ = 0
emaf = 0
emas = 0
TrendSlow = 50
TrendFast = 50
ELSE
//--rsiMA: EMA del RSI elegido
rsiMA = average[RsiSmoothingFactor, 1](rawRsi)
//--MaAtrRsi: Wilder del |delta rsiMA|
atrRsiIn = ABS(rsiMA[1] - rsiMA)
MaAtrRsi = average[rsiPeriod, 3](atrRsiIn)
outerJ = average[rsiPeriod, 3](MaAtrRsi)
emaf = outerJ * WPFast
emas = outerJ * WPSlow
//--QQE Slow Trend
trS = TrendSlow[1]
dvS = trS
IF rsiMA < trS THEN
trS = rsiMA + emas
IF rsiMA[1] < dvS AND trS > dvS THEN
trS = dvS
ENDIF
ENDIF
IF rsiMA > trS THEN
trS = rsiMA - emas
IF rsiMA[1] > dvS AND trS < dvS THEN
trS = dvS
ENDIF
ENDIF
TrendSlow = trS
//--QQE Fast Trend
trF = TrendFast[1]
dvF = trF
IF rsiMA < trF THEN
trF = rsiMA + emaf
IF rsiMA[1] < dvF AND trF > dvF THEN
trF = dvF
ENDIF
ENDIF
IF rsiMA > trF THEN
trF = rsiMA - emaf
IF rsiMA[1] > dvF AND trF < dvF THEN
trF = dvF
ENDIF
ENDIF
TrendFast = trF
ENDIF
//===Coloreo===
IF rsiMA > TrendSlow AND rsiMA > TrendFast THEN
rC = 45
gC = 210
bC = 4
ELSIF rsiMA < TrendSlow AND rsiMA < TrendFast THEN
rC = 210
gC = 4
bC = 45
ELSE
rC = 128
gC = 128
bC = 128
ENDIF
return rsiMA AS "RSI MA" COLOURED(rC, gC, bC) STYLE(line, 3), TrendSlow AS "Slow Trend" COLOURED(220, 200, 0) STYLE(dottedline, 1), TrendFast AS "Fast Trend" COLOURED(255, 255, 255) STYLE(line, 1), 50 AS "Midline" COLOURED(120, 120, 120) STYLE(dottedline), overbought AS "Overbought" COLOURED(0, 200, 200), oversold AS "Oversold" COLOURED(200, 200, 200)