Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 902

 

J'ai une question, comment puis-je supprimer un élément d'un tableau par la mémoire, pour le moment je supprime un élément en déplaçant le tableau mathématiquement par une boucle, est-ce possible dans mql4 ? Si cela est possible, veuillez donner un exemple de la façon dont cela est fait sur un tableau à une dimension.

2) De même, quelle méthode serait la plus performante, compte tenu du fait que : si je supprime via la mémoire, en coupant un segment contenant des éléments inutiles, le tableau sera réduit et son nombre diminuera de la valeur des éléments supprimés, et lors de l'utilisation suivante du tableau, nous devrons rétablir le tableau dans son état initial ; si je supprime via une méthode mathématique, le traitement du cycle, qui est en calculs constants pour attribuer des valeurs aux variables, ce qui à son tour affecte la charge du programme ?

 
Seric29:

J'ai une question, comment puis-je supprimer un élément d'un tableau par la mémoire, pour le moment je supprime un élément en déplaçant le tableau mathématiquement par une boucle, est-ce possible dans mql4 ? Si cela est possible, veuillez donner un exemple de la façon dont cela est fait sur un tableau à une dimension.

2) Par ailleurs, quelle méthode sera la plus performante, compte tenu du fait que si l'on supprime via la mémoire, en découpant un tableau avec des éléments inutiles, le tableau se réduira et son nombre diminuera de la valeur des éléments supprimés, et lors de l'utilisation suivante d'un tableau, nous devrons rétablir le tableau dans son état initial ; si l'on supprime via une méthode mathématique, le traitement du cycle, qui implique des calculs constants pour attribuer des valeurs aux variables, ce qui à son tour affecte le programme ?

Il suffit de copier le tableau "dans lui-même" et de réduire la taille du tableau du nombre d'éléments dont il n'a pas besoin.

Pour insérer un seul élément, il suffit d'augmenter la taille, de copier à nouveau "sur lui-même" et de coller la valeur souhaitée dans l'espace libre.

 
Alexey Viktorov:

Il suffit de copier le tableau "dans lui-même" et de réduire la taille du tableau du nombre d'éléments inutiles.

Pour insérer un seul élément, il suffit d'augmenter la taille, de copier à nouveau "sur lui-même" et de coller la valeur souhaitée dans l'espace libre.

J'ai essayé d'insérer un tableau à 3 dimensions dans la fonction copy, il n'y a pas d'erreurs, donc cette fonction peut fonctionner avec des tableaux de différentes dimensions ou a simplement des doublons pour différentes dimensions. Il s'avère que cette fonction peut être utilisée à la place d'une fonction shift, pas besoin d'écrire la vôtre, j'aurais aimé y penser plus tôt, comme il est risqué de copier un tableau sur lui-même, il est écrit que le résultat peut ne pas être défini.

 
Seric29:

J'ai essayé d'insérer un tableau à 3 dimensions dans la fonction copy, aucune erreur, donc cette fonction peut fonctionner avec des tableaux de différentes dimensions ou a simplement des doublons pour différentes dimensions. Il s'avère que cette fonction peut être utilisée à la place d'une fonction shift, pas besoin d'écrire la vôtre, j'aurais aimé y penser plus tôt, comme il est risqué de copier un tableau sur lui-même, il est écrit que le résultat peut ne pas être défini.

Lorsque vous copiez un tableau multidimensionnel, vous devez tenir compte de la dimensionnalité de la deuxième dimension et des dimensions suivantes. Cela détermine la quantité que vous devez déplacer lors de la copie. En termes simples, comme je l'ai compris lors de mes expériences, toutes les valeurs du tableau multidimensionnel sont alignées sur "une ligne", puis alignées à nouveau sur "colonne par...".

En somme, je ne peux pas raconter la théorie maintenant. Je vais devoir le vérifier à nouveau, si j'ai besoin de l'utiliser.

 
Alexey Viktorov:

Lors de la copie d'un tableau multidimensionnel, la dimensionnalité de la deuxième dimension et des dimensions suivantes doit être prise en compte. Cela détermine la quantité de décalage nécessaire lors de la copie. En termes simples, comme je l'ai compris lors de mes expériences, toutes les valeurs d'un tableau multidimensionnel sont alignées sur "une ligne", puis alignées à nouveau sur "colonne par...".

En général, je ne peux pas raconter la théorie maintenant. Là encore, il faudra vérifier s'il y a lieu de l'utiliser.

En C++, il n'y a pas de différence entre cette

   вывести в консоль massiv[0][0][0]
   или так
   вывести в консоль massiv[0]

dans chacun de ces cas, il y aura une sortie. Parce qu'ils se trouvent dans un seul bloc de mémoire et que le C++ y accède directement, alors que dans notre shell l'accès à la mémoire est fermé et il n'y a aucun moyen de passer correctement des tableaux de dimension différente dans une fonction, ou de les adresser de cette façon, la seule nuance est qu'en C++ les tableaux multidimensionnels sont situés dans la mémoire dynamique, peut-être même dispersés, bien que personne n'ait vu la carte électronique. Ainsi, copier des tableaux multidimensionnels par le concept en lui-même est une question très subtile ou cela peut ne pas fonctionner correctement ?

 
Comment puis-je déterminer par programme si je me suis connecté à mon compte en utilisant mon mot de passe d'investissement ou mon mot de passe de négociation ?
 

J'ai un code qui n'est pas exécuté dans MQL5 dans mon indicateur

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

Le point est que si leprix == STO_LOWHIGH tout fonctionne correctement, mais sile prix == STO_CLOSECLOSE la fonction assigne aux variables statiques seulement

vhigh = 0; vlow = High[i];

... contournement de la boucle

 
Alexandr Sokolov:

J'ai un code qui n'est pas exécuté dans MQL5 dans mon indicateur

Le problème est que, si leprix == STO_LOWHIGH tout fonctionne correctement, mais si le prix == STO_CLOSECLOSE la fonction assigne aux variables statiques seulement

... contournement de la boucle

Il y a un problème avec les parenthèses. À mon avis, ils ne sont pas du tout nécessaires ici. Aucun d'entre eux n'est nécessaire.

Ou au moins déplacer vers la gauche ceux qui sont mis en évidence avant le point d'interrogation.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

En général, il suffit de comprendre que l'opérateur ? : est équivalent à if else.

Vous avez une condition deux fois. Une condition comme celle-ci serait suffisante

vhigh = price == STO_LOWHIGH ? High[a] : Close[a];
vlow  = price == STO_LOWHIGH ? Low[a] : Close[a];
Ou je ne comprends pas où tu voulais en venir.
 
Alexey Viktorov:

Il y a un problème avec les crochets. À mon avis, ils ne sont pas du tout nécessaires ici. Aucun d'entre eux ne l'est.

Ou au moins, déplacez ceux qui sont en surbrillance vers la gauche avant le point d'interrogation.

En général, il suffit de comprendre que l'opérateur ? : est équivalent à if else.

Vous avez une condition deux fois. Une telle condition serait suffisante.

Ou je ne comprends pas où tu voulais en venir.

Je veux obtenir les stochastiques maxHigh et minLow normaux dans la période K par Low/High et Close/Close.

Low/High pendant l'initialisation fonctionne bien, mais pas Close/Close.

 
Alexey Viktorov:

Il y a un problème avec les crochets. À mon avis, ils ne sont pas du tout nécessaires ici. Aucun d'entre eux ne l'est.

Ou au moins, déplacez ceux qui sont en surbrillance vers la gauche avant le point d'interrogation.

En général, il suffit de comprendre que l'opérateur ? : est équivalent à if else.

Vous avez une condition deux fois. Une telle condition est suffisante.

Ou je ne comprends pas où tu voulais en venir.

Je n'ai pas compris tout de suite, mais si tu veux dire ça.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH) ? High[a] : Close[a] > vhigh ? (price == STO_LOWHIGH) ? High[a] : Close[a] : vhigh);
      vlow  = ((price == STO_LOWHIGH) ? Low[a] : Close[a] < vlow ? (price == STO_LOWHIGH) ? Low[a] : Close[a] : vlow);
     };
  }

ça ne résout pas mon problème.