Ecco l’indicatore. Non avendo ancora la possibilità di creare funzioni proprie, mi è risultato complesso programmare la correlazione e consuma molte risorse.
Nell’indicatore vedrai che per impostazione predefinita utilizzo un’approssimazione e, nel caso si desideri il coefficiente di Pearson, suggerisco di attivare l’opzione per calcolare solo sulle ultime X barre (200 per esempio).
//-------------------------------------------------------------
// PRC_Machine Learning Z-Score by Steversteves
// version = 0
// 10.09.25
// Iván González @ www.prorealcode.com
// Sharing ProRealTime knowledge
//-------------------------------------------------------------
//defparam calculateonlastbars=200
//-------------------------------------------------------------
// ===== Input parameters =====
//-------------------------------------------------------------
autoadjust = 1 // 1 = true, 0 = false
lengthinput = 75 // default length if autoadjust = 0
plottgt = 1 // 1 = true, 0 = false
manualprice = 0 // 1 = true, 0 = false
pullbacksd = 1.0 // pullback standard deviation factor
aproxCorr = 1 // 1 = use R2 , 0 = use pearson correlation (uncomment defparam line)
barcolor = 1 // 1 = true, 0 = false
//-------------------------------------------------------------
// Correlation calculation
//-------------------------------------------------------------
if aproxCorr then
// ===== Correlation approximation with R2 =====
cor1 = R2[50](close)
cor2 = R2[100](close)
cor3 = R2[150](close)
cor4 = R2[200](close)
cor5 = R2[250](close)
cor6 = R2[300](close)
cor7 = R2[350](close)
cor8 = R2[400](close)
cor9 = R2[450](close)
cor10 = R2[500](close)
else
// ===== Pearson Correlation =====
// --- Pearson correlation for 50 ---
len = 50
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor1 = ABS(num / den)
ELSE
cor1 = 0
ENDIF
// --- Pearson correlation for 100 ---
len = 100
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor2 = ABS(num / den)
ELSE
cor2 = 0
ENDIF
// --- Pearson correlation for 150 ---
len = 150
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor3 = ABS(num / den)
ELSE
cor3 = 0
ENDIF
// --- Pearson correlation for 200 ---
len = 200
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor4 = ABS(num / den)
ELSE
cor4 = 0
ENDIF
// --- Pearson correlation for 250 ---
len = 250
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor5 = ABS(num / den)
ELSE
cor5 = 0
ENDIF
// --- Pearson correlation for 300 ---
len = 300
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor6 = ABS(num / den)
ELSE
cor6 = 0
ENDIF
// --- Pearson correlation for 350 ---
len = 350
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor7 = ABS(num / den)
ELSE
cor7 = 0
ENDIF
// --- Pearson correlation for 400 ---
len = 400
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor8 = ABS(num / den)
ELSE
cor8 = 0
ENDIF
// --- Pearson correlation for 450 ---
len = 450
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor9 = ABS(num / den)
ELSE
cor9 = 0
ENDIF
// --- Pearson correlation for 500 ---
len = 500
sumX = 0
sumY = 0
sumXY = 0
sumX2 = 0
sumY2 = 0
FOR i = 0 TO len-1 DO
xi = barindex[i]
yi = close[i]
sumX = sumX + xi
sumY = sumY + yi
sumXY = sumXY + xi * yi
sumX2 = sumX2 + xi * xi
sumY2 = sumY2 + yi * yi
NEXT
n = len
num = n * sumXY - sumX * sumY
den = SQRT((n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY))
IF den <> 0 THEN
cor10 = ABS(num / den)
ELSE
cor10 = 0
ENDIF
endif
maxcor = MAX(MAX(MAX(MAX(MAX(cor1,cor2),cor3),MAX(cor4,cor5)),MAX(cor6,cor7)),MAX(MAX(cor8,cor9),cor10))
IF autoadjust = 1 THEN
IF maxcor = cor1 THEN
len = 50
ELSIF maxcor = cor2 THEN
len = 100
ELSIF maxcor = cor3 THEN
len = 150
ELSIF maxcor = cor4 THEN
len = 200
ELSIF maxcor = cor5 THEN
len = 250
ELSIF maxcor = cor6 THEN
len = 300
ELSIF maxcor = cor7 THEN
len = 350
ELSIF maxcor = cor8 THEN
len = 400
ELSIF maxcor = cor9 THEN
len = 450
ELSE
len = 500
ENDIF
ELSE
len = lengthinput
ENDIF
//-------------------------------------------------------------
// ===== Z-Score calculations =====
//-------------------------------------------------------------
a = Average[len](close) // mean
b = Std[len](close) // standard deviation
c = (close - a) / b // z-score
sma = Average[len](c) // smoothed z-score
IF manualprice = 1 THEN
z0 = a + pullbacksd * b
ELSE
z0 = a + sma * b
ENDIF
highz = Highest[len](c)
lowz = Lowest[len](c)
//-------------------------------------------------------------
// ===== Buy & Sell logic =====
//-------------------------------------------------------------
ONCE buywait = 0
ONCE sellwait = 0
lowestprice = Lowest[20](low)
highestprice = Highest[20](high)
atr = AverageTrueRange[14](close)
// ---- Buy signal ----
IF c <= lowz THEN
buywait = buywait + 1
IF buywait > 8 THEN
DRAWARROWUP(barindex,low-0.35*atr)coloured(0,255,0)
DRAWTEXT("Z-Score= #c#", barindex, lowestprice - 3*atr) COLOURED("darkgreen")
DRAWTEXT("Cor Length= #len#", barindex, lowestprice - 2*atr) COLOURED("darkgreen")
DRAWTEXT("TP= #z0#", barindex, lowestprice - atr) COLOURED("darkgreen")
IF plottgt = 1 THEN
DRAWSEGMENT(barindex, z0, barindex+100, z0) coloured(0,255,0)
ENDIF
buywait = 0
ENDIF
ENDIF
// ---- Sell signal ----
IF c >= highz THEN
sellwait = sellwait + 1
IF sellwait > 8 THEN
DRAWARROWDOWN(barindex,high+0.35*atr)coloured(255,0,0)
DRAWTEXT("Z-Score= #c#", barindex, highestprice + 3*atr) COLOURED("darkred")
DRAWTEXT("Cor Length= #len#", barindex, highestprice + 2*atr) COLOURED("darkred")
DRAWTEXT("TP= #z0#", barindex, highestprice + 1*atr) COLOURED("darkred")
IF plottgt = 1 THEN
DRAWSEGMENT(barindex, z0, barindex+100, z0) COLOURED(255,0,0)
ENDIF
sellwait = 0
ENDIF
ENDIF
//-------------------------------------------------------------
// ===== Bar colors =====
//-------------------------------------------------------------
overbought = c >= 2
oversold = c <= -2
if barcolor then
IF overbought THEN
DRAWCANDLE(open,high,low,close) COLOURED("fuchsia")
ELSIF oversold THEN
DRAWCANDLE(open,high,low,close) COLOURED("black")
ENDIF
endif
//-------------------------------------------------------------
return