Indicateurs: Indicateur de corrélation - page 2

 
Ici, à peu près comme ceci - https://www.mql5.com/fr/code/183. Le fait est que la copie de données à partir d'autres symboles n'est pas effectuée en une seule fois, mais une barre à la fois. Lors d'une telle copie, à partir d'autres symboles, la barre sera copiée exactement à l'heure de la barre du graphique sur laquelle l'indicateur est affiché. S'il n'y a pas de barre correspondante, elle sera copiée à partir d'une barre antérieure (comme la fonction iBarShift() de MQL4). Dans cet indicateur, une barre à la fois est copiée, mais pour la corrélation, il peut être nécessaire de copier le nombre correspondant à la période de corrélation. Vous pouvez procéder différemment : copier une barre à la fois et la placer dans la mémoire tampon de l'indicateur. En utilisant la mémoire tampon, vous pouvez tout faire aussi vite que possible (bien sûr au prix d'une plus grande consommation de mémoire). Vous pouvez le faire sans tampon supplémentaire, avec quelques variables statiques.... C'est long à expliquer, il est probablement nécessaire d'écrire un article :)
 
pusheax:

Bon, hier nous nous sommes un peu emballés, je suppose que vous avez célébré comme moi le "Border Guard Day" (jour des gardes-frontières).

Pouvez-vous me donner un lien vers la synchronisation correcte des mesures, parce que j'utilise aussi cette méthode de synchronisation par la dernière mesure et c'est tout ?

Je ne vous donnerai pas de lien (parce que je ne l'ai pas encore rencontré), mais je décrirai la méthode.

La méthode concerne la synchronisation de différents instruments, bien qu'elle puisse être utilisée pour la synchronisation de différents TF.

Je m'occupe de ce problème depuis assez longtemps, et SD a même corrigé les bogues de cette méthode que j'ai identifiés.

Le problème de synchronisation est lié au fait que différents instruments ont un nombre différent de barres. Approximativement identique est un faux critère, tout doit être exact. Barre à barre. Sinon, le sens de la synchronisation est perdu.

Le deuxième aspect de ce problème est de savoir comment afficher une barre s'il n'y a pas de barre sur l'instrument en cours ?

L'essence de la méthode est donc simple : les données sur l'instrument sont demandées strictement par temps...

count=CopyRates(symbol,tf,time0,time1,rates); если нужно несколько баров
или
count=CopyRates(symbol,tf,time0,1,rates); если нужен один

et l'échantillon de temps est pris dans le tampon standard de l'indicateur time[]. Ainsi, vous savez toujours avec certitude que vous êtes en présence d'une barre qui est apparue de manière synchrone avec une barre sur un autre instrument.

Encore une fois, si une telle barre n'existe pas dans l'instrument actuel, vous ne la demanderez pas. Et si l'instrument demandé ne dispose pas d'une telle barre comme échantillon, vous obtiendrez un zéro dans le décompte et pourrez normalement gérer cette exception, en fonction de la logique de votre programme.

 

Implémentation de la synchronisation (en MQL4) pour un nombre quelconque d'IF(à partir d'ici) :

double GetPrice( string Symb, int time )
{
  double Price;
 
  Price = iClose(Symb, Period(), iBarShift(Symb, Period(), time));
 
  return(Price);
}
 
int GetNextTime( int CurrTime )
{
  static int Pos[MAX_AMOUNTSYMBOLS];
  int i, MinTime, Tmp = -1;
 
  for (i = 0; i < AmountSymbols; i++)
  {
    Pos[i] = iBarShift(Symbols[i], Period(), CurrTime) - 1;
 
    if (Pos[i] >= 0)
      Tmp = i;
  }
 
  if (Tmp < 0)
    return(Time[0]);
 
  MinTime = iTime(Symbols[Tmp], Period(), Pos[Tmp]);
 
  i = Tmp - 1;
 
  while (i >= 0)
  {
    if (Pos[i] >= 0)
    {
      Tmp = iTime(Symbols[i], Period(), Pos[i]);
 
      if (Tmp < MinTime)
        MinTime = Tmp;
    }
 
    i--;
  }
 
  return(MinTime);
}
 
void GetBaseMatrix()
{
  int i, NextTime;
 
  NextTime = GetNextTime(CurrTime);
 
  while (NextTime < Time[0])
  {
    CurrTime = NextTime;
 
    for (i = 0; i < AmountSymbols; i++)
      BaseMatrix[i][MatrixRows] = 1000 * MathLog(GetPrice(Symbols[i], CurrTime));
 
    Times[MatrixRows] = CurrTime;
 
    MatrixRows++;
 
    NextTime = GetNextTime(CurrTime);
  }
 
  return;
}

Par analogie pour deux symboles(à partir d'ici) :

double GetPrice( string Symb, int time )
{
  double Price;
 
  Price = iClose(Symb, Period(), iBarShift(Symb, Period(), time));
 
  return(Price);
}
 
int GetNextTime( int CurrTime )
{
  static int Pos[TWO_SYMBOLS];
  int i, MinTime, Tmp = -1;
 
  for (i = 0; i < TWO_SYMBOLS; i++)
  {
    Pos[i] = iBarShift(Symbols[i], Period(), CurrTime) - 1;
 
    if (Pos[i] >= 0)
      Tmp = i;
  }
 
  if (Tmp < 0)
    return(Time[0]);
 
  MinTime = iTime(Symbols[Tmp], Period(), Pos[Tmp]);
 
  i = Tmp - 1;
 
  while (i >= 0)
  {
    if (Pos[i] >= 0)
    {
      Tmp = iTime(Symbols[i], Period(), Pos[i]);
 
      if (Tmp < MinTime)
        MinTime = Tmp;
    }
 
    i--;
  }
 
  return(MinTime);
}
 
void GetBaseMatrix()
{
  int i, NextTime;
 
  NextTime = GetNextTime(CurrTime);
 
  while (NextTime < Time[0])
  {
    CurrTime = NextTime;
 
    for (i = 0; i < TWO_SYMBOLS; i++)
      BaseMatrix[i][MatrixRows + Shifts[i]] = MathLog(GetPrice(Symbols[i], CurrTime));
 
    Times[MatrixRows] = CurrTime;
 
    MatrixRows++;
 
    NextTime = GetNextTime(CurrTime);
  }
 
  return;
}
C'est-à-dire que tout est très simple. Une autre chose est que la représentation barométrique classique (discrétisation en temps constant) des prix BP n'est pas la seule, et encore moins toujours correcte. Il est parfois extrêmement utile de synchroniser les prix BP d'une autre dimension temporelle. C'est-à-dire en introduisant des distorsions qui ne sont pas linéaires du point de vue du temps classique. En conséquence, la corrélation montrera les interrelations non linéaires de deux RV classiques.
 

Merci pour votre aide !

Je me suis trompé, je l'admets, je ne pensais pas que la synchronisation était si compliquée.

Je vais essayer de comprendre et de synchroniser les barres directement sur cet indicateur car j'en ai vraiment besoin.

 

Merci à tous pour ces informations !

J'ai un peu réécrit l'indicateur. Maintenant, il est supposé sauter les mauvaises parties de l'histoire.

Puisque nous avons commencé, vérifiez s'il y a des erreurs :)

Dossiers :
 
J'insiste une fois de plus sur la nécessité d'une optimisation algorithmique pour tous les indicateurs. Et aussi pour le mécanisme intégré de calcul des valeurs de l'indicateur dans la mémoire (fichier), de sorte que pendant l'optimisation du testeur, l'indicateur ne calcule pas la même chose, mais prend des valeurs prêtes à l'emploi à partir de là.
 
hrenfx:
J'insiste une fois de plus sur la nécessité d'une optimisation algorithmique pour tous les indicateurs. Et aussi pour un mécanisme intégré de calcul des valeurs de l'indicateur dans la mémoire (fichier), de sorte que pendant l'optimisation du testeur, l'indicateur ne calcule pas la même chose, mais prend des valeurs prêtes à l'emploi à partir de là.
Pourriez-vous montrer un exemple où cela a déjà été fait ?
 

L'optimisation algorithmique pour chaque indicateur est différente. Pour les différentes manières d'utiliser la corrélation, j'ai fait, par exemple, ceci et cela .

La lecture de mémoire des valeurs des indicateurs calculées à l'avance pour l'ensemble de l'histoire n'a été effectuée que dans ma calculatrice. En d'autres termes, je n'ai pas de mécanisme universel, car je n'utilise que mes propres solutions, qui ne sont pas belles du tout. Mais comme je suis pour l'amélioration de tout, ce serait bien d'avoir un tel mécanisme universel dans le cas de l'optimiseur du testeur MT5, car il donne des accélérations de plusieurs ordres de grandeur (expérience d'utilisation dans ma calculatrice), c'est-à-dire qu'il surpasse Cloud en termes d'efficacité.

 

Bonjour

Il m'arrive de passer du temps à déformer les codes des autres, généralement le résultat d'un programme incomplet ou non abouti, à la fois par manque de temps et de compétences.

Cette fois-ci, j'ai essayé de déformer ce merveilleux indicateur, et j'ai essayé de faire quelque chose comme ceci :

- Dessiner juste une ligne, pas une ligne de traçage en pointillés



#property indicator_type1 DRAW_COLOR_LINE
#property indicator_width1 2

// #property indicator_type2 DRAW_COLOR_HISTOGRAM
// #property indicator_style2 STYLE_DOT
// #property indicator_width2 1

- J'ai ajouté de nombreux symboles tels que

//--- paramètres d'entrée
input string _SecondSymbol="EURGBP"; // Symbole

input string _ThirdSymbol="EURAUD"; // Symbole
input string _FourthSymbol="EURCAD"; // Symbole
input string _FifthSymbol="EURCHF"; // Symbole
input string _SixthSymbol="EURNZD"; // Symbole
input string _SeventhSymbol="EURHKD"; // Symbole
input string _EighthSymbol="EURTRY"; // Symbole

Puis de créer 2 variantes du code source :

- Variante visuelle : une ligne colorée pour chacune des paires de devises corrélation 1 ligne épaisse qui est juste la moyenne de 7 lignes ((A+B+C+D+E+F+G)/7)

- Pas de variante visuelle : 1 seule ligne, qui est le résultat de la formule ci-dessus ((A+B+C+D+D+E+F+G)/7)

C'est presque comme si l'on ajoutait 7 (ou 8) indicateurs de corrélation originaux, mais tous additionnés de sorte qu'il ne s'agit que de moyennes, comme dans la version dont l'une comporte 7 lignes + 1 (moyenne), et l'autre 1 ligne (seulement la moyenne).

quelque chose comme ça :

buf[i]= (
(v1/sqrt(v2*v3))+
(v4/sqrt(v2*v6))+
(v7/sqrt(v2*v9))+
(v10/sqrt(v2*v12))+
(v13/sqrt(v2*v15))+
(v16/sqrt(v2*v18))+
(v19/sqrt(v2*v21)) 
)/7; // moyenne simple des valeurs.


buf2[i]=buf[i];
c=getPlotColor(buf[i]);
colors1[i]=c;
colors2[i]=c;

Pour un certain nombre de raisons, le code brouillé ne fait pas ce que je veux faire à cause d'erreurs complètement logiques.

Le principal problème est lié aux tampons, à la synchronisation et à l'indentation récursive de la partie du code :

if(bars1>bars2)
{
minBars=bars2;
bars2=bars1-bars2;
etc...

+ ainsi que d'autres erreurs logiques.

quelques fonctions Print() ont été ajoutées pour aider dans le cas du suivi des valeurs variables et les instructions de retour 0 ont été commentées afin de trouver où le code échoue logiquement.

 

code et fichier

//+------------------------------------------------------------------+
//| Corrélation.mq5 |
//|| Copyright 2012, iC |
//| http://www.icreator.biz/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, iC"
#property link "http://www.icreator.biz/"
#property version "1.00"
//--- paramètres de l'indicateur
#property indicator_separate_window

#property indicator_minimum -1
#property indicator_maximum 1

#property indicator_buffers 25
#property indicator_plots 2

#property indicator_type1 DRAW_COLOR_LINE
#property indicator_width1 2

// #property indicator_type2 DRAW_COLOR_HISTOGRAM
// #property indicator_style2 STYLE_DOT
// #property indicator_width2 1

/*

#property indicator_type2 DRAW_COLOR_LINE
#property indicator_width2 2

#property indicator_type3 DRAW_COLOR_LINE
#property indicator_width3 2

#property indicator_type4 DRAW_COLOR_LINE
#property indicator_width4 2

#property indicator_type5 DRAW_COLOR_LINE
#property indicator_width5 2

#property indicator_type6 DRAW_COLOR_LINE
#property indicator_width6 2

#property indicator_type7 DRAW_COLOR_LINE
#property indicator_width7 2

#property indicator_type8 DRAW_COLOR_LINE
#property indicator_width8 2

*/

//--- définit
#define MAX_COL 64
//--- structures
struct CRGB
{
int r;
int g;
int b;
};
//--- paramètres d'entrée
input string _SecondSymbol="EURGBP"; // Symbole

input string _ThirdSymbol="EURAUD"; // Symbole
input string _FourthSymbol="EURCAD"; // Symbole
input string _FifthSymbol="EURCHF"; // Symbole
input string _SixthSymbol="EURNZD"; // Symbole
input string _SeventhSymbol="EURHKD"; // Symbole
input string _EighthSymbol="EURTRY"; // Symbole

input int _SettPeriod=100; // Période
input ENUM_APPLIED_PRICE _AppliedPrice=PRICE_CLOSE; // Prix
input color _Color1=clrLightGray; // Corrélation minimale.
input color _Color2=clrLime; // Corrélation maximale.

//--- tampons d'indicateurs
double buf[],buf2[]
,buf3[],buf4[],buf5[],buf6[],buf7[],buf8[];

double arr1[],arr2[]
,arr3[],arr4[],arr5[],arr6[],arr7[],arr8[];

double colors1[],colors2[];

//--- MA handles
int h1,h2,
h3,h4,h5,h6,h7,h8;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0,buf);
SetIndexBuffer(1,colors1,INDICATOR_COLOR_INDEX);

SetIndexBuffer(2,buf2);
SetIndexBuffer(3,colors2,INDICATOR_COLOR_INDEX);

SetIndexBuffer(4,arr1,INDICATOR_CALCULATIONS); // premier symbole
SetIndexBuffer(5,arr2,INDICATOR_CALCULATIONS); // deuxième symbole


SetIndexBuffer(6,arr3,INDICATOR_CALCULATIONS); //3e
SetIndexBuffer(7,arr4,INDICATOR_CALCULATIONS); //4ème

SetIndexBuffer(8,arr5,INDICATOR_CALCULATIONS); //5e
SetIndexBuffer(9,arr6,INDICATOR_CALCULATIONS); //6ème

SetIndexBuffer(10,arr7,INDICATOR_CALCULATIONS); //7e

SetIndexBuffer(11,arr8,INDICATOR_CALCULATIONS); //8e

/* 
SetIndexBuffer(12,arr9,INDICATOR_CALCULATIONS) ;
SetIndexBuffer(13,arr10,INDICATOR_CALCULATIONS) ;

SetIndexBuffer(14,arr11,INDICATOR_CALCULATIONS) ;
SetIndexBuffer(15,arr12,INDICATOR_CALCULATIONS) ;

SetIndexBuffer(16,buf3) ;
SetIndexBuffer(17,colours3,INDICATOR_COLOR_INDEX) ;

SetIndexBuffer(18,buf4) ;
SetIndexBuffer(19,colours4,INDICATOR_COLOR_INDEX) ;

SetIndexBuffer(20,buf5) ;
SetIndexBuffer(21,colours5,INDICATOR_COLOR_INDEX) ;

SetIndexBuffer(22,buf6) ;
SetIndexBuffer(23,colours6,INDICATOR_COLOR_INDEX) ;

SetIndexBuffer(24,buf7) ;
SetIndexBuffer(25,colours7,INDICATOR_COLOR_INDEX) ;

// etc..
*/

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);

PlotIndexSetInteger(0,PLOT_SHOW_DATA,0);
IndicatorSetInteger(INDICATOR_DIGITS,3); 

IndicatorSetString(INDICATOR_SHORTNAME,_Symbol+"/"+_SecondSymbol+", "+IntegerToString(_SettPeriod)+", "+EnumToString(_AppliedPrice)+","); // etc...

setPlotColor(0,_Color1,_Color2);
setPlotColor(1,_Color1,_Color2);

h1=iMA(_Symbol,0,1,0,MODE_EMA,_AppliedPrice);
h2=iMA(_SecondSymbol,0,1,0,MODE_EMA,_AppliedPrice);

// valeurs ajoutées.
h3=iMA(_ThirdSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h4=iMA(_FourthSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h5=iMA(_FifthSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h6=iMA(_SixthSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h7=iMA(_SeventhSymbol,0,1,0,MODE_EMA,_AppliedPrice);
h8=iMA(_EighthSymbol,0,1,0,MODE_EMA,_AppliedPrice);

return 0;
}
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisée
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
int i,j,c,limit,bars1,bars2
,bars3,bars4,bars5,bars6,bars7,bars8, 
minBars,toCopy;
double averX1=0,averX2=0
,averX3=0,averX4=0,averX5=0,averX6=0,averX7=0,averX8=0,
v1=0,v2=0,v3=0
,v4=0,v5=0,v6=0,v7=0,v8=0
,v9=0,v10=0,v11=0,v12=0
,v13=0,v14=0,v15=0,v16=0,v17=0
,v18=0,v19=0,v20=0,v21=0;
datetime t1[1],t2[1],
t3[1],t4[1],t5[1],t6[1],t7[1],t8[1];
//--- symboles de synchronisation
if( 
(
CopyTime(_Symbol,0,0,1,t1)<1 || 
CopyTime(_SecondSymbol,0,0,1,t2)<1 || 

CopyTime(_ThirdSymbol,0,0,1,t3)<1 || 
CopyTime(_FourthSymbol,0,0,1,t4)<1 || 
CopyTime(_FifthSymbol,0,0,1,t5)<1 || 
CopyTime(_SixthSymbol,0,0,1,t6)<1 || 
CopyTime(_SeventhSymbol,0,0,1,t7)<1 || 
CopyTime(_EighthSymbol,0,0,1,t8)<1
) 
|| 

(
t1[0]!=t2[0]
|| t1[0]!=t3[0]
|| t1[0]!=t4[0]
|| t1[0]!=t5[0]
|| t1[0]!=t6[0]
|| t1[0]!=t7[0]
|| t1[0]!=t8[0]
)
) 
{
Print("Synchronization failed!");
// renvoie 0 ;
}
//--- vérification des données

bars1=rates_total;
bars2=Bars(_SecondSymbol,0);

bars3=Bars(_ThirdSymbol,0);
bars4=Bars(_FourthSymbol,0);
bars5=Bars(_FifthSymbol,0);
bars6=Bars(_SixthSymbol,0);
bars7=Bars(_SeventhSymbol,0);
bars8=Bars(_EighthSymbol,0);

// indenter les if les uns des autres jusqu'à ce que le minBars soit trouvé. // pour vérifier si la logique est correcte

if(bars1>bars2)
{
minBars=bars2;
bars2=bars1-bars2;
bars1=0;
Print("bars1>bars2; minBars(",minBars,"),=bars2(",bars2,")=bars1(",bars1,")-bars2(",bars2,");");
// }
//else 
if(bars1>bars3)
{
minBars=bars3;
bars3=bars1-bars3;
bars1=0;
Print("bars1>bars3; minBars(",minBars,"),=bars3(",bars3,")=bars1(",bars1,")-bars3(",bars3,");");
// } 
//else 
if(bars1>bars4)
{
minBars=bars4;
bars4=bars1-bars4;
bars1=0;
Print("bars1>bars4; minBars(",minBars,"),=bars4(",bars4,")=bars1(",bars1,")-bars4(",bars4,");");
// } 
//else 
if(bars1>bars5)
{
minBars=bars5;
bars5=bars1-bars5;
bars1=0;
Print("bars1>bars5; minBars(",minBars,"),=bars5(",bars5,")=bars1(",bars1,")-bars5(",bars5,");");
// } 
//else 
if(bars1>bars6)
{
minBars=bars6;
bars6=bars1-bars6;
bars1=0;
Print("bars1>bars6; minBars(",minBars,"),=bars6(",bars6,")=bars1(",bars1,")-bars6(",bars6,");");
// } 
//else 
if(bars1>bars7)
{
minBars=bars7;
bars7=bars1-bars7;
bars1=0;
Print("bars1>bars7; minBars(",minBars,"),=bars7(",bars7,")=bars1(",bars1,")-bars7(",bars7,");");
// } 
//else 
if(bars1>bars8)
{
minBars=bars8;
bars8=bars1-bars8;
bars1=0;
Print("bars1>bars8; minBars(",minBars,"),=bars8(",bars8,")=bars1(",bars1,")-bars8(",bars8,");");
} }}}}}} 

else
{
minBars=bars1;
bars1=bars2-bars1;
bars2=0;
Print("bars1!>bars2,3,4,5,6,7,8; minBars(",minBars,"),=bars1(",bars1,")=bars2(",bars2,")-bars1(",bars1,");");
}
if(minBars<_SettPeriod)
{
Print("Bars is not enough to calculate!");
// renvoie 0 ;
}
if(BarsCalculated(h1)<minBars)
{
Print("Not all data of MA1 is calculated. Error ",GetLastError());
// renvoie 0 ;
}
if(BarsCalculated(h2)<minBars)
{
Print("Not all data of MA2 is calculated. Error ",GetLastError());
// renvoie 0 ;
}
if(BarsCalculated(h3)<minBars)
{
Print("Not all data of MA3 is calculated. Error ",GetLastError());
// renvoie 0 ;
}
if(BarsCalculated(h4)<minBars)
{
Print("Not all data of MA4 is calculated. Error ",GetLastError());
// renvoie 0 ;
}
if(BarsCalculated(h5)<minBars)
{
Print("Not all data of MA5 is calculated. Error ",GetLastError());
// renvoie 0 ;
}
if(BarsCalculated(h6)<minBars)
{
Print("Not all data of MA6 is calculated. Error ",GetLastError());
// renvoie 0 ;
}
if(BarsCalculated(h7)<minBars)
{
Print("Not all data of MA7 is calculated. Error ",GetLastError());
// renvoie 0 ;
}
if(BarsCalculated(h8)<minBars)
{
Print("Not all data of MA8 is calculated. Error ",GetLastError());
// renvoie 0 ;
} 

//--- nous ne pouvons pas copier toutes les données
if(prev_calculated>rates_total || 
prev_calculated<=0)
toCopy=minBars;
else
toCopy=rates_total-prev_calculated+1;

if(CopyBuffer(h1,0,0,minBars,arr1)<minBars || 
CopyBuffer(h2,0,0,minBars,arr2)<minBars || 

CopyBuffer(h3,0,0,minBars,arr3)<minBars || 
CopyBuffer(h4,0,0,minBars,arr4)<minBars || 
CopyBuffer(h5,0,0,minBars,arr5)<minBars || 
CopyBuffer(h6,0,0,minBars,arr6)<minBars || 
CopyBuffer(h7,0,0,minBars,arr7)<minBars || 
CopyBuffer(h8,0,0,minBars,arr8)<minBars) 

{
Print("Getting MA buffer failed. Error ",GetLastError());
// renvoie 0 ;
}
if(prev_calculated>rates_total || 
prev_calculated<=0)
limit=bars1+bars2+_SettPeriod-1
+bars3+bars4+bars5+bars6+bars7+bars8;

else
limit=prev_calculated-1;
//--- 
for(i=limit;i<rates_total;i++)
{
averX1=0; averX2=0; 
averX3=0;averX4=0;averX5=0;averX6=0;averX7=0;averX8=0;
for(j=0;j<_SettPeriod;j++)
{
averX1+=arr1[i-j-bars1]/_SettPeriod;
averX2+=arr2[i-j-bars2]/_SettPeriod;

averX3+=arr3[i-j-bars3]/_SettPeriod;
averX4+=arr4[i-j-bars4]/_SettPeriod;
averX5+=arr5[i-j-bars5]/_SettPeriod;
averX6+=arr6[i-j-bars6]/_SettPeriod;
averX7+=arr7[i-j-bars7]/_SettPeriod;
averX8+=arr8[i-j-bars8]/_SettPeriod;
}

v1=0; v2=0; v3=0;
v4=0;v5=0;v6=0;v7=0;v8=0;
v9=0;v10=0;v11=0;v12=0;v13=0;
v14=0;v15=0;v16=0;v17=0;v18=0;
v19=0;v20=0;v21=0; 
for(j=0;j<_SettPeriod;j++)
{
v1+=(arr1[i-j-bars1]-averX1)*(arr2[i-j-bars2]-averX2);
v2+=pow((arr1[i-j-bars1]-averX1),2);
v3+=pow((arr2[i-j-bars2]-averX2),2);

v4+=(arr1[i-j-bars1]-averX2)*(arr3[i-j-bars3]-averX3);
// v5+=pow((arr1[i-j-bars1]-averX1),2);
v6+=pow((arr3[i-j-bars3]-averX3),2);

v7+=(arr1[i-j-bars1]-averX1)*(arr4[i-j-bars4]-averX4);
// v8+=pow((arr1[i-j-bars1]-averX1),2);
v9+=pow((arr4[i-j-bars4]-averX4),2);

v10+=(arr1[i-j-bars1]-averX1)*(arr5[i-j-bars5]-averX5);
// v11+=pow((arr1[i-j-bars1]-averX1),2);
v12+=pow((arr5[i-j-bars5]-averX5),2);

v13+=(arr1[i-j-bars1]-averX1)*(arr6[i-j-bars6]-averX6);
// v14+=pow((arr1[i-j-bars1]-averX1),2);
v15+=pow((arr6[i-j-bars6]-averX6),2);

v16+=(arr1[i-j-bars1]-averX1)*(arr7[i-j-bars7]-averX7);
// v17+=pow((arr1[i-j-bars1]-averX1),2);
v18+=pow((arr7[i-j-bars7]-averX7),2);

v19+=(arr1[i-j-bars1]-averX1)*(arr8[i-j-bars8]-averX8);
// v20+=pow((arr1[i-j-bars1]-averX1),2);
v21+=pow((arr8[i-j-bars8]-averX8),2);

}
buf[i]= (
(v1/sqrt(v2*v3))+
(v4/sqrt(v2*v6))+
(v7/sqrt(v2*v9))+
(v10/sqrt(v2*v12))+
(v13/sqrt(v2*v15))+
(v16/sqrt(v2*v18))+
(v19/sqrt(v2*v21)) 
)/7; // moyenne simple des valeurs.


buf2[i]=buf[i];
c=getPlotColor(buf[i]);
colors1[i]=c;
colors2[i]=c;
}
return rates_total;
}

//+------------------------------------------------------------------+
//| setPlotColour |
//+------------------------------------------------------------------+
void setPlotColor(int plot,color col1,color col2)
{
int i;
CRGB c1,c2;
double dr,dg,db;
string s;
//--- 
PlotIndexSetInteger(plot,PLOT_COLOR_INDEXES,MAX_COL);
ColorToRGB(col1,c1);
ColorToRGB(col2,c2);
dr=(double)(c2.r-c1.r)/MAX_COL;
dg=(double)(c2.g-c1.g)/MAX_COL;
db=(double)(c2.b-c1.b)/MAX_COL;
for(i=0;i<MAX_COL;i++)
{
s=StringFormat("%i,%i,%i",
c1.r+(int)NormalizeDouble(dr*(i+1),0),
c1.g+(int)NormalizeDouble(dg*(i+1),0),
c1.b+(int)NormalizeDouble(db*(i+1),0));
PlotIndexSetInteger(plot,PLOT_LINE_COLOR,i,StringToColor(s));
}
}
//+------------------------------------------------------------------+
//| getPlotColor |
//+------------------------------------------------------------------+
int getPlotColor(double current)
{
return((int)NormalizeDouble((MAX_COL-1)*fabs(current),0));
}
//+------------------------------------------------------------------+
//| ColorToRGB |
//+------------------------------------------------------------------+
void ColorToRGB(color col,CRGB &res)
{
string s,s2;
int n;
//---
s=ColorToString(col);
n=StringFind(s,",");
s2=StringSubstr(s,0,n);
res.r=(int)StringToInteger(s2);
s=StringSubstr(s,n+1);
n=StringFind(s,",");
s2=StringSubstr(s,0,n);
res.g=(int)StringToInteger(s2);
s=StringSubstr(s,n+1);
s2=StringSubstr(s,0);
res.b=(int)StringToInteger(s2);
}
//+------------------------------------------------------------------+
Dossiers :