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

 
Alexandr Nevadovschi:

Chers programmeurs, veuillez aider un débutant dans ce domaine.

L'EA ouvre les ordres d'achat et de vente séquentiellement après une certaine période de temps. Je veux qu'il modifie tous les ordres précédents (plus précisément, tous les ordres précédents doivent être fermés par la prise de bénéfices du dernier ordre). C'est-à-dire que si le dernier ordre d'achat et l'ordre de vente précédent, alors le stop loss de l'ordre précédent est fixé au niveau du take profit du dernier ordre,

Si l'achat précédent est un achat, alors son TakeProfit sera fixé au niveau du dernier TakeProfit. Le fait est que lorsque le takeprofit du dernier ordre arrive, tous les ordres doivent être fermés).

J'espère l'avoir expliqué clairement, même s'il est difficile de comprendre comment le mettre en œuvre. Merci d'avance.

Je comprends que l'on puisse passer par tous les ordres ouverts et les modifier, mais comment faire pour sauter le dernier ?

Le plus important dans tout cela est de comprendre ce qui doit se passer.

Qu'est-ce que le "dernier ordre" ? Est-ce que l'heure d'ouverture est la dernière ? Ou par niveau de prix d'ouverture ?

Que se passe-t-il si nous considérons le "dernier" ordre comme un "achat", mais que le prix augmente ? Ou vice versa, le dernier ordre sera VENDRE, mais le prix va vers le nord ? Alors lequel doit être considéré comme le dernier ? C'est ce que nous devons comprendre pour réaliser notre idée.

 

Bonjour. Si vous ne savez pas à l'avance combien d'éléments il y aura dans le tableau, comment déclarer le tableau de façon à ce que le tableau augmente avec chaque nouvel élément ?

Un exemple pour rendre les choses plus claires :

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Nauris Zukas:

Bonjour. Si vous ne savez pas à l'avance combien d'éléments il y aura dans le tableau, comment déclarer le tableau de façon à ce que le tableau augmente avec chaque nouvel élément ?

Un exemple pour rendre les choses plus claires :

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Vous devriez lire la documentation plus souvent.
ArrayResize - Операции с массивами - Справочник MQL4
ArrayResize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayResize - Операции с массивами - Справочник MQL4
 
Alexey Viktorov:
Vous devriez lire la documentation plus souvent.

J'ai lu et essayé mais j'obtiens une erreur "array out of range". Dans l'exemple, cela ressemblait à ceci :

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Nauris Zukas:

J'ai lu et essayé mais j'obtiens une erreur "array out of range". Sur l'exemple, cela ressemblait à ceci :

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Lorsque la condition A[i] < B[i] n'est pas remplie, la taille du tableau reste inchangée et le compteur de la boucle est incrémenté. C'est pourquoi il est hors de portée.

Essayez de cette façon.

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Alexey Viktorov:

Lorsque la condition A[i] < B[i] n'est pas satisfaite, la taille du tableau reste inchangée et le compteur de la boucle est incrémenté. C'est pourquoi il est hors limite.

Essayez de cette façon.

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


Merci ! Tout fonctionne maintenant !
 
Nauris Zukas:

J'ai lu et essayé mais j'obtiens une erreur "array out of range". Dans l'exemple, cela ressemblait à ceci :

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Eh bien, ça irait plus vite

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Vitaly Muzichenko:

Eh bien, ça ira plus vite comme ça

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
Merci, je vois ! Il sera plus rapide à cause de l'ArraySize, est-ce que cela le ralentit en quelque sorte ?
 
Nauris Zukas:
Merci, je vois ! Il sera plus rapide grâce à ArraySize, est-ce que cela le ralentit d'une manière ou d'une autre ?
Pas grand-chose, mais c'est clair et sans risque d'erreur.
 
Alexey Viktorov:
Pas grand-chose, mais c'est clair et sans risque d'erreur.
Merci !
Raison: