Questions d'un "mannequin - page 86

 

Renat, la question était plus théorique que pratique.

Pour ne pas vous perdre dans le brouillard, je vais vous renvoyer à un exemple tiré de l'aide iFractals. Il est vrai qu'il y a là un indicateur, mais simplifions la tâche à un seul calcul de la mise en page graphique par un script.

Supposons que j'aie l'intention de trouver les heures de toutes les barres fractales supérieures sur l'ensemble de l'histoire (ou sur sa partie substantielle sur une période moyenne où il y aura beaucoup de fractales). Ai-je bien compris qu'il vaut mieux perturberCopyTime de façon répétée dans la boucle à FrUpBuffer[shift]!=EMPTY_VALUE à une profondeur de 1 élément :

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
   {
     CopyTime(_Symbol,PERIOD_H4, shift, 1, Arr);
     Print(Arr[0]);
   }
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);

   return(true);
  }

et obtenir un résultat plus rapide que de consommer l'historique en une fois avec CopyTime par profondeur de FrUpBuffer :

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
     Print(TimeUpBuffer[shift]);
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);
   else CopyTime(_Symbol,PERIOD_H4,0,amount,TimeUpBuffer);

   return(true);
  }
et ensuite dans la même boucle aux mêmes ifs, imprimer les valeurs de temps de la barre fractale ?

Les deux tâches sont identiques, seules les mises en œuvre sont légèrement différentes.

Intuitivement, je comprends qu'il est plus long et plus coûteux de copier une énorme chaîne de temps de barre (à la fois fractale et vide) dans un tableau ; d'un autre côté, il est douteux de faire appel à CopyTime de manière répétée jusqu'à une profondeur de 1 élément.

Si la première variante est plus rapide, s'agit-il d'un gain absolu ou tout dépend-il du nombre total de fractales rencontrées (par exemple, il y en a beaucoup plus sur les petites TF) ?

 

À l'adresse https://www.mql5.com/ru/forum/3775/page59#comment_94865, j'ai posé une question sur le fait de placer la déclaration, la liaison, l'initialisation et d'autres actions sur de nombreux tampons similaires dans une boucle afin de réduire le code et d'améliorer la lisibilité et la gestion. J'ai reçu une réponse avec un exemple (classe, structure) et je l'ai comprise.

Maintenant, selon le même principe, j'ai essayé de limiter les affectations multiples du type #propriété :

#property indicator_label1  "FractalUp1"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen

#property indicator_label2  "FractalDown1"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrGreen
// ---
#property indicator_label3  "FractalUp2"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrBlue

#property indicator_label4  "FractalDown2"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrBlue
[...]

et a rencontré au moins deux problèmes :

1. pour le niveau global est interdit, c'est-à-dire que sa première utilisation n'est pas antérieure à OnInit(), mais on sait que la #propriété est déclarée au niveau global avant toutes les autres fonctions;

2) Lorsque l'on essaie d'attribuer des propriétés aux indicateurs dans la boucle de OnInit() :

// понимаю, что сочинил бред
for (int i=0; i<NUMBER; i++)
{
  #property Property_Array[i].indicator_label (string)("Fractal"+i)
  #property Property_Array[i].indicator_type  DRAW_ARROW
  #property Property_Array[i].indicator_color clrArr[i]
}
Le compilateur jure sur '#' (comme prévu) : '#property' - jeton inattendu.
Pourriez-vous me dire si et comment l'idée est réalisable en principe ?
 

Pouvez-vous me dire comment déclarer un tableau de tableaux à deux dimensions ?

Quelque chose comme ça :

double Buffers[6][3]={ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] };
 
tol64:

Pouvez-vous me dire s'il est possible de déclarer un tableau de tableaux à deux dimensions ?

On peut déclarer un tableau de structures dont les champs sont des tableaux, le compilateur ignore même les tableaux dynamiques dans la structure :

struct arr{double arr_str[];};
arr buffers[6][3];
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
tol64:

Pouvez-vous me dire comment déclarer un tableau de tableaux à deux dimensions ?

Quelque chose comme ça :

#define DIM1_NUMBER 6
#define DIM2_NUMBER 3

struct TBuffer
{
  string Buffer[3]; // для нагляднсти поменяем double на string
};

TBuffer Buffer_Array[DIM1_NUMBER];

string prefixArr[6]={"a","b","c","d","e","f"};

int OnInit()
  {
   for (int j=0; j<DIM1_NUMBER; j++)
   {
      for (int i=0; i<DIM2_NUMBER; i++)
      {
        string t;
   
        StringConcatenate(t,prefixArr[j],i);
        Buffer_Array[j].Buffer[i]=t;
      }
   }

   Print(Buffer_Array[0].Buffer[0],", ",
         Buffer_Array[0].Buffer[1],", ",
         Buffer_Array[0].Buffer[2],"; ",

         Buffer_Array[1].Buffer[0],", ",
         Buffer_Array[1].Buffer[1],", ",
         Buffer_Array[1].Buffer[2],"; ",

         Buffer_Array[2].Buffer[0],", ",
         Buffer_Array[2].Buffer[1],", ",
         Buffer_Array[2].Buffer[2],"; ",

         Buffer_Array[3].Buffer[0],", ",
         Buffer_Array[3].Buffer[1],", ",
         Buffer_Array[3].Buffer[2],"; ",

         Buffer_Array[4].Buffer[0],", ",
         Buffer_Array[4].Buffer[1],", ",
         Buffer_Array[4].Buffer[2],"; ",

         Buffer_Array[5].Buffer[0],", ",
         Buffer_Array[5].Buffer[1],", ",
         Buffer_Array[5].Buffer[2]
   );

   return(0);
  }
[Fixé.]
 

IgorM, x100intraday

Merci pour les options. Je pense que ça devrait faire l'affaire, je vais essayer.

 
tol64:

IgorM, x100intraday

Merci pour les options. Je pense que ça devrait marcher, je vais essayer.

Au fait, le nom "Buffer" peut être remplacé par "_" ou d'autres énigmes, et l'appel sera complètement clair :

Buffer_Array[0]._[0]

Buffer_Array[0].¦[0]

 
Urain:

À propos, le nom "Buffer" peut être remplacé par "_" ou autre chose, afin que l'appel soit parfaitement clair :

MerciUrain. C'est aussi un ajout intéressant. C'est plus familier.))
 

Mais comment faire tout cela avec #property ? - Je me demande...

Aucune idée ?

 
x100intraday:

Mais comment faire tout cela avec #property? - Je me demande...

Aucune idée ?

déchiffrer