Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 17
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_level1 0.8
#property indicator_level2 -0.8
#property indicator_levelcolor Black
#property indicator_color1 Blue
#property indicator_minimum -1
#property indicator_width1 2
#property indicator_style1 0
#property indicator_maximum 1
double Buffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//--- indicator buffers mapping
SetIndexBuffer(0, Buffer1);
SetIndexStyle(0, DRAW_LINE);
return(0);
//---
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int n=25; // количество элементов в массиве(для периода H1 n=25, тк i<n)
int m=24; // количество массивов(для периода H1 m=24, тк p=0, p<m)
int w=18; // количество заков после запятой
double Price_CloseX[][24]; // Массив цен закрытия 1 пары
double Price_CloseY[][24]; // Массив цен закрытия 2 пары
double dx[][24]; // Отклонение от среднего значения для пары 1 dx
double dy[][24]; // Отклонение от среднего значения для пары 2 dy
double dx2[][24]; // Квадрат отклонения ср.значения dx2
double dy2[][24]; // Квадрат отклонения ср.значения dy2
double dxdy[][24]; // Произведение dx и dy
double sum_x[][24];
double sum_y[][24];
double Mx[][24]; // Массив среднего значения цен закрытия пары 1 Mx
double My[][24]; // Массив среднего значения цен закрытия пары 2 My
double Edx2[][24]; // Сумма квадратов отклонений Edx2
double Edy2[][24]; // Сумма квадратов отклонений Edy2
double Edxdy[][24]; // Сумма произведений отклонений Edxdy
double Koef[];
ArrayResize(Price_CloseX, n);
ArrayResize(Price_CloseY, n);
ArrayResize(dx, n);
ArrayResize(dy, n);
ArrayResize(dx2, n);
ArrayResize(dy2, n);
ArrayResize(dxdy, n);
ArrayResize(sum_x, n);
ArrayResize(sum_y, n);
ArrayResize(Mx, n);
ArrayResize(My, n);
ArrayResize(Edx2, n);
ArrayResize(Edy2, n);
ArrayResize(Edxdy, n);
ArrayResize(Koef, n);
string sym_x="EURUSD";
string sym_y="GBPUSD";
for(int i=1; i<n; i++)
{
for(int p=0; p<m; p++)
{
Price_CloseX[i][p]=iClose(sym_x, PERIOD_H1, i+p);
Price_CloseY[i][p]=iClose(sym_y, PERIOD_H1, i+p);
}
}
for(int i=1; i<n; i++)
{
for(int p=0; p<m; p++)
{
sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];
sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
}
}
for(int i=1; i<n; i++)
{
for(int p=0; p<m; p++)
{
Mx[i][p]=sum_x[p+1][m-1]/(n-1);
My[i][p]=sum_y[p+1][m-1]/(n-1);
}
}
for(int i=1; i<n; i++)
{
for(int p=0; p<m; p++)
{
dx[i][p]=Price_CloseX[i][p]-Mx[i][p];
dy[i][p]=Price_CloseY[i][p]-My[i][p];
}
}
for(int i=1; i<n; i++)
{
for(int p=0; p<m; p++)
{
dx2[i][p]=(dx[i][p]*dx[i][p])*1000000;
dy2[i][p]=(dy[i][p]*dy[i][p])*1000000;
}
}
for(int i=1; i<n; i++)
{
for(int p=0; p<m; p++)
{
dxdy[i][p]=(dx[i][p]*dy[i][p])*1000000;
}
}
for(int i=1; i<n; i++)
{
for(int p=0; p<m; p++)
{
Edx2[i][p]=(Edx2[i-1][p]+dx2[i][p]);
Edy2[i][p]=(Edy2[i-1][p]+dy2[i][p]);
Edxdy[i][p]=(Edxdy[i-1][p]+dxdy[i][p]);
}
}
for(int p=0; p<m; p++)
{
Koef[p]=Edxdy[n-1][p]/sqrt(Edx2[n-1][p]*Edy2[n-1][p]);
Buffer1[p]=Koef[p];
Alert("Коэффициент корреляции Пирсона между ", sym_x, " и ", sym_y, " равен ", DoubleToString(Koef[p], w));
Alert("Значение буфера ", p, " равно ", Buffer1[p]);
}
return(0);
}
Puoi dirmi dov'è l'errore? I valori degli elementi dell'array Koef[] sono calcolati, ad ogni elemento viene assegnato un valore. Perché Buffer1[] non è assegnato?
Prova a rimuovere l'allarme dell'ultimo ciclo
non ha aiutato(
Bene, lì sono inutili. È meglio usare Print(...) invece di avvisi, e guardare la stampa nella scheda "Esperti".
Avete lo stesso valore Edxdy[n-1][p] assegnato. Se nei cicli precedenti avete un ciclo dentro un ciclo e l'indice "n" cambia, nell'ultimo non cambia. Ultimo n-1=24.
Prova con coraggio - assegnerà? //l'indicatore dovrebbe disegnare una linea nera orizzontale. Tuttavia, non sarà visibile su uno sfondo nero. Cambia il colore dello sfondo, o meglio la linea.
Se sarà assegnato, si dovrebbe pensare - ciò che è scritto qui: Edxdy[24][p]
Heh, forse tutto è assegnato e disegnato, ma si tratta di disegnare una linea nera su uno sfondo nero?
Qui si specifica il colore, il tipo e lo spessore della linea:
Bene, lì sono inutili. È meglio usare Print(...) invece di avvisi, e guardare la stampa nella scheda "Esperti".
Avete lo stesso valore Edxdy[n-1][p] assegnato. Se nei cicli precedenti avete un ciclo dentro un ciclo e l'indice "n" cambia, nell'ultimo non cambia. Ultimo n-1=24.
Prova con coraggio - assegnerà? //l'indicatore dovrebbe disegnare una linea nera orizzontale. Tuttavia, non sarà visibile su uno sfondo nero. Cambia il colore dello sfondo, o meglio la linea.
Se sarà assegnato, si dovrebbe pensare - ciò che è scritto qui: Edxdy[24][p]
Hehe, o forse tutto è assegnato e disegnato, ma si tratta di disegnare una linea nera su uno sfondo nero?
Qui potete vedere il colore, il tipo e lo spessore della linea:
Edxdy[n-1][p] - qui ho scritto la somma del prodotto di dx e dy. Questo valore è necessario per calcolare il coefficiente di correlazione di Pearson Koef per una matrice composta da n-1 elementi della dimensione p-esima. In questo caso, ho deciso di calcolare la correlazione per 24 barre, partendo dalla prima barra. Il risultato rispetto al calcolo simile del coefficiente di correlazione di Pearson, che calcola un semplice script (è stato preso solo una matrice unidimensionale), così come il sito "calcolatore di correlazione online di coppia di valute". Tutti i valori sono gli stessi. Credo che ci sia un errore nella dichiarazione dell'array Buffer1[]. Ho creato uno script con un codice simile, più la dichiarazione dell'array tramite ArrayResize(Buffer1, n). Nel codice dello script Buffer1[p]=Koef[p] - i valori sono assegnati correttamente. Non nel codice dell'indicatore((((.
Hai letto il mio post?
SetIndexStyle(0,DRAW_LINE,0,1,Green); - mette dei valori, ma non disegna ancora una linea.
Sì, grazie!
SetIndexStyle(0,DRAW_LINE,0,1,Green); - mette i valori, ma ancora non disegna la linea.
Prova anche a rimuovere i limitatori#propertyindicator_minimum-1,#propertyindicator_maximum1, forse i valori del buffer sono disegnati dietro di loro.
Grazie! Rimosso #property strict - ha aiutato)