Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 263

 
evillive:

int Mas[] ;


puis compléter la boucle, si nécessaire, en utilisant

ArrayResize(Mas,size) ;

ArrayInitialize(Mas,0) ;

"puis remplissage du cycle".
Si cela ne vous dérange pas trop, un petit exemple, s'il vous plaît ?
 
Leo59:
"then loop fill"
Si cela ne vous dérange pas trop, je peux vous donner un petit exemple ?


 double MACDBuffer[]; int x=20;       // если известен размер буфера то              
 ArrayResize( MACDBuffer,x);         // то можно и просто  MACDBuffer[20], но  MACDBuffer[] нельзя.
 double min,max;
 int start(){
    for(int i=0; i<20; i++)
      MACDBuffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
    min=ArrayMinimum(MACDBuffer);
    max=ArrayMaximum(MACDBuffer);
    Print(min,"____",max);
 }

On vous a dit que pour remplir un tableau dynamique MACDBuffer[], vous devez le rendre statique avec ArrayResize() (sinon le résultat de l'affectation sera toujours des zéros),

et, pour assurer la stabilité de l'adéquation des calculs, il est préférable d'initialiser le tableau avec ArrayInitialize().

 
ALXIMIKS:


On vous a dit que pour remplir un tableau dynamique MACDBuffer[], vous devez le rendre statique avec ArrayResize() (sinon le résultat de l'affectation sera toujours des zéros),

et de plus, pour assurer la stabilité de l'adéquation des calculs, il est préférable d'initialiser le tableau avec ArrayInitialize().


Merci !
Le problème est qu'il existe un conseiller expert qui fonctionne.
int CD=0 ; //numéro d'ordre d'une transaction fermée
double Balance=0 ; // résultat d'une transaction fermée
double Mas[] ; // tableau de valeurs pour les résultats d'une transaction fermée


Comment remplir Mas[] avec les résultats des transactions fermées dans int Start() ?

Peut-être faut-il écrire quelque chose dans init() et deinit() ? Un initialisateur ou autre chose ?
A quoi ressemblerait le code correct ?

 
Leo59:
L'essentiel de la question est qu'il existe un conseiller expert en activité.
int CD=0 ; // numéro séquentiel d'une transaction fermée
double Balance=0 ; // résultat d'une transaction fermée
double Mas[] ; // tableau de valeurs pour les résultats d'une transaction fermée


Comment dans int Start() remplir Mas[] avec les résultats des transactions fermées ?

Peut-être, je dois ajouter quelque chose dans init() et deinit() ? Un initialisateur ou autre chose ?
A quoi ressemblerait le code correct ?

Chacun a une notion différente du "droit".

Peut-être voulez-vous Mas[CD]=Balance dans l'initialisation et l'affectation à Mas[CD]=Balance au départ lorsque vous changez la valeur de CD ?

Ou peut-être voulez-vous disposer d'un tableau à deux dimensions où toutes les données nécessaires (solde, temps, points, équité maximale, équité minimale ....) seront stockées pour chaque transaction.

 
ALXIMIKS:


On vous a dit que pour remplir un tableau dynamique MACDBuffer[], vous devez le rendre statique avec ArrayResize() (sinon le résultat de l'affectation sera toujours des zéros),

et de plus, pour assurer la stabilité de l'adéquation des calculs, il est préférable d'initialiser le tableau avec ArrayInitialize().

ArrayResize() modifie la taille du tableau. Dans mql4, tous les tableaux sont statiques par défaut.
 
artmedia70:
ArrayResize() modifie la taille du tableau. Dans mql4, tous les tableaux sont statiques par défaut.

J'avais tort. Le tutoriel le confirme :

Si la taille d'un tableau unidimensionnel à initialiser n'est pas spécifiée, elle est déterminée par le compilateur, sur la base de la taille de la séquence d'initialisation. L'initialisation d'un tableau peut également être effectuée à l'aide de la fonction standard ArrayInitialize(). Tous les tableaux sont statiques, c'est-à-dire qu'ils ont une forme statique, même s'ils ne sont pas spécifiés explicitement lors de l'initialisation. Cela signifie que tous les éléments du tableau conservent leurs valeurs dans l'intervalle entre les appels de la fonction, dans laquelle le tableau est déclaré.

Mais alors pourquoi un tel tableau "statique" n'assigne-t-il pas des valeurs ? Le résultat est nul, comme prévu, à cause de la fonction ArrayResize(buffer,0) du compilateur ?

int start(){
   double buffer[];
   for(int i=10;i>=0;i--){
      buffer[i]=i;
      Print ("buffer[i]=",buffer[i]);
   }
}
 
ALXIMIKS:

J'avais tort. Le manuel le confirme :

Mais alors, pourquoi un tel tableau "statique" n'assigne-t-il pas des valeurs ? Le résultat est nul comme prévu à cause de ArrayResize(buffer,0) du compilateur ?

Parce que le tableau est dynamique. Sa taille dans la première dimension peut être consultée avec ArraySize() - pour un tableau unidimensionnel, et ArrayRange() - pour une dimension spécifiée d'un tableau multidimensionnel.

Statique ne signifie pas "taille par défaut". Ne confondez pas les deux concepts "statique" et "dynamique". Ce ne sont pas des antonymes. Il s'agit de domaines d'application différents. Analogie : Un tableau statique est une "variable statique". Un tableau dynamique est "une taille qui peut être définie et modifiée par programme".

int start(){
   double buffer[];
   for(int i=0;i<10;i++){
      ArrayResize(buffer,i+1);
      buffer[i]=i;
      Print ("Размер массива = "+(string)ArraySize(buffer)+", Значение в buffer["+(string)i+"] = ",buffer[i]);
   }
   return(0);
}
 
Leo59:

Merci !
Le problème est qu'il existe un conseiller expert qui fonctionne.
int CD=0 ; // numéro ordinal d'une transaction fermée
double Balance=0 ; // résultat d'une transaction fermée
double Mas[] ; // tableau de valeurs des résultats de la transaction fermée


Comment remplir Mas[] avec les résultats des transactions fermées dans int Start() ?

Peut-être faut-il écrire quelque chose dans init() et deinit() ? Un initialisateur ou autre chose ?
A quoi ressemblerait le code correct ?

Tous les résultats des transactions fermées peuvent être consultés dans l'historique du compte. Par logiciel. Mais est-il nécessaire d'en remplir le tableau en permanence ? Il y en a peut-être beaucoup. Il est préférable de limiter la profondeur nécessaire de l'histoire et de remplir le tableau, si vous ne pouvez vraiment pas vous en passer.
 
Les gars, est-ce que quelqu'un sait comment ajouter des niveaux auxiliaires au RSI sur android ?
 
ALXIMIKS:

J'avais tort. Le manuel le confirme :

Mais alors, pourquoi un tel tableau "statique" n'assigne-t-il pas des valeurs ? Le résultat est nul comme prévu à cause de ArrayResize(buffer,0) du compilateur ?


Parce que ce n'est pas un tableau, pour être précis. Si vous voulez plus de détails - voir la description du langage C. Je m'y réfère parce que dès le début les développeurs ont dit que tout ce qui n'est pas clair ou est incomplètement expliqué - voir le standard C.

Lorsque vous déclarez la variable double buffer[] ; alors la mémoire est allouée pour une variable, qui en termes C est appelée "pointeur", a un type entier et stocke l'adresse de la cellule mémoire à partir de laquelle un tableau commence. Si vous vérifiez la dimensionnalité de la variable dans MCL, vous obtenez la valeur 0. Cela signifie que le tableau lui-même n'a pas de mémoire allouée et que lorsque vous essayez d'attribuer une valeur, il n'y a nulle part où l'écrire : en MCL, il n'y a pas d'arithmétique d'adresse et les pointeurs ne peuvent pas être manipulés. En C, vous pouvez l'écrire, mais avec de la mémoire "non allouée", cela conduit généralement à un crash du système. Lorsque vous appliquez AreiResize(array,N), (N>0), cela alloue de la mémoire pour le tableau (au moins un élément) et crée de l'espace pour écrire des valeurs. Ensuite, lors de la vérification, la dimension du tableau sera différente de 0.

Le concept de tableau statique en termes de C a plusieurs significations :

1. un tableau statique (ainsi qu'une variable/type statique) sont des variables/réseaux dont les dimensions sont connues au moment de la compilation (précompilation pour MKL4). Par exemple, lorsque l'on décrit double buff[10000] ;, le compilateur est informé de la taille de la variable et peut immédiatement allouer de la mémoire. À l'opposé de ce concept, il existe le concept de "tableau dynamique", c'est-à-dire un tel tableau dont la taille est inconnue au moment de la compilation et ne devient connue qu'au moment de l'exécution ; ce sont tous des tableaux de taille variable. Lors de l'accès à de tels tableaux, la mémoire doit être allouée au préalable. La mémoire est allouée en dehors de la mémoire statique du programme.

En C/C++, si un tableau est décrit dans un bloc, sa visibilité est limitée par le bloc - qu'il s'agisse d'un tableau statique ou dynamique. Les erreurs dans les programmes telles que les "fuites de mémoire" sont associées aux tableaux dynamiques définis localement, c'est-à-dire lorsqu'un pointeur mémoire est détruit parce qu'il quitte la zone de visibilité, mais que la mémoire qui lui est allouée reste occupée.

2 Le concept de tableau "statique" comme une variable décrite avec le modificateur statique - de telles variables ne sont pas détruites lorsqu'elles quittent la portée du bloc - elles sont situées dans une zone de mémoire séparée - donc les valeurs qu'elles contiennent sont préservées. Le risque de fuites de mémoire est réduit. Un tableau déclaré comme dynamique au sens de p.1 (c'est-à-dire que la taille du tableau n'est pas connue au moment de la compilation), peut également être statique au sens de p.2, c'est-à-dire déclaré avec le modificateur "static".

Lors de la fin d'un programme, la mémoire allouée dynamiquement doit être libérée pour éviter les fuites de mémoire. Je ne sais pas si les développeurs de MKL suivent cela, mais dans mes programmes je libère toujours de la mémoire - habitude du C - ArreyResize(array,0) ;

En MKL, tous les tableaux sont statiques au sens du point 2.

Maintenant, concernant votre question : "Pourquoine peut-on pas attribuer des valeurs à un tableau statique double buffer[] ; ". Parce qu'aucune mémoire ne lui est allouée (en fait, il s'agit d'un tableau dynamique avec un modificateur statique). Avant d'assigner les valeurs, la mémoire doit être allouée, c'est-à-dire qu'un ArrayResize de taille supérieure à 0 doit être appliqué à ce tableau. Pour les tableaux, vous devez contrôler le dépassement de mémoire (en dehors du tableau).

SZ J'espère que j'ai été clair. J'ai essayé de le garder aussi simple que possible.

Raison: