Répartir les postes ouverts en groupes - page 5

 
Alexey Viktorov:

Avec beaucoup de quoi ? Des éléments de tableau qui ne sont même pas remplis à chaque tique ? Comment sera-t-il perceptible ?

Ce code pique les yeux, comme s'il était intentionnellement aggravé.

Eh bien, si ça ne fait pas de différence, faisons comme ça :

for(int i = 0; i < 10; i++)
   {
    ArrayResize(arrTest, i+1);
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);

    for(int j=0;j<100;j++)
    Sleep(1);
   }

Pourquoi pas ?

ArrayResize(arrTest, 10);
for(int i = 0; i < 10; i++)
  {
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);
  }
 
Aliaksandr Hryshyn:

Ce code pique les yeux, comme s'il était intentionnellement aggravé.

Eh bien, si ça ne fait pas de différence, faisons comme ça :

Pourquoi ?

ps ; Ahh, je vois. Eh bien, c'est un exemple. Lorsque le tableau de travail sera rempli, il sera certainement rempli par un index. Pas la variante où il faut faire attention à de telles subtilités.
 
Alexey Viktorov:

Pourquoi ?

C'est probablement pour cette raison que vous faites changer le tableau à l'intérieur de la boucle lorsque la taille est connue à l'avance.

Je ne connais pas la raison exacte :).

Vous travaillez en free-lance, n'est-ce pas ? Terrible :).

 
Aliaksandr Hryshyn:

C'est probablement pour cette raison que vous faites changer le tableau à l'intérieur de la boucle lorsque la taille est connue à l'avance.

Je ne connais pas la raison exacte :).

Vous travaillez en free-lance, n'est-ce pas ? Terrible :).

Et alors ?

 
Alexey Viktorov:

C'est n'importe quoi. J'ai utilisé cette fonction sans lire le manuel. ...

Cela a marché, merci beaucoup ! !! Ce que j'ai écrit n'a en effet aucun sens, la fonction de suppressionArrayRemove fonctionne parfaitement sur des tableaux de toutes dimensions.

L'erreur était ailleurs. Après avoir appliqué la fonction, j'ai dû la redéfinir, cette fois dans un tableau plus petit, car à l'étape suivante, cette variable a été utilisée à nouveau dans la boucle, et le tableau est sorti de l'intervalle (je peux me tromper dans la terminologie, mais j'espère avoir été clair).

Je vais poster la version de travail ci-dessous et dans le fichier joint. Les points subtils sont mis en évidence.

//+------------------------------------------------------------------+
int Array_Caste_Positions_Creating(){
   int  n           = 0;
   long ticket      = 0;
   bool new_pos     = true;
//---Запись новых тикетов в массив позиций        
   int All_Position = PositionsTotal();
   int Array_Size   = ArrayRange(Arr_Position,0);
//---  
   for(int i = 0; i < All_Position; i++){
      if(m_position.SelectByIndex(i)){
         ticket  = PositionGetInteger(POSITION_TICKET);
         new_pos = true;}
      for(int e = 0; e < Array_Size; e++){
         if(Arr_Position[e][0]==ticket){
            new_pos = false;
            n++;
            break;}}
      if(new_pos){
         int New_Size = Array_Size+1;
         ArrayResize(Arr_Position,New_Size,0);
            Arr_Position[Array_Size][0] = (int)ticket;//Ticket
            Arr_Position[Array_Size][1] = 0;//Number_Caste (0 = начальные позиции)
            n++;}}                       
//---Удаление из массива мёртвых тикетов 
      Array_Size   = ArrayRange(Arr_Position,0);
      All_Position = PositionsTotal();
//---      
      for(int e = 0; e < Array_Size; e++){
         int  ticket_dead = Arr_Position[e][0];
         bool dead_pos    = true;
         for(int i = 0; i < All_Position; i++){
            if(m_position.SelectByIndex(i)){
                  if(ticket_dead == PositionGetInteger(POSITION_TICKET)){
                        dead_pos = false;
                        n++;
                        break;}}}
         if(dead_pos){
            ArrayRemove(Arr_Position,e,1);
            Array_Size   = ArrayRange(Arr_Position,0);}}
//---     
return(n);}
//+------------------------------------------------------------------+
Dossiers :
Sower_1_6.mq5  19 kb
 

J'ai l'impression d'être un élève mal élevé, qui assiste involontairement à une dispute entre deux professeurs, chacun insistant sur la justesse de sa méthode d'enseignement.

Permettez-moi d'insérer mes trois cents délicats.

Malgré la légère imperfection du code de l'exemple postépar Alexey Viktorov, les réflexions qu'il a présentées étaient correctes et nous ont aidés à le comprendre. Et si un indépendant est prêt et disposé à aider gratuitement, sans essayer d'extorquer un centime supplémentaire - alors félicitez-le, je le respecte vraiment. Merci.

Aliaksandr Hryshyn- Merci beaucoup, vous n'étiez pas non plus indifférent, vous vouliez sincèrement aider et vous l'avez fait. Qui sait comment les événements se seraient déroulés sans vos critiques ?

 
Sergey Voytsekhovsky:

Cela a marché, merci beaucoup ! !! Ce que j'ai écrit n'a vraiment aucun sens, la fonction de suppressionArrayRemove fonctionne parfaitement sur des tableaux de toutes dimensions.

L'erreur était ailleurs. Après avoir appliqué la fonction, j'ai dû la redéfinir, cette fois pour un tableau plus petit, car à l'étape suivante, cette variable a été utilisée à nouveau dans la boucle, et le tableau est sorti de l'intervalle (je peux me tromper dans la terminologie, mais j'espère avoir été clair).

Je vais poster la version de travail ci-dessous et dans le fichier joint. Les points subtils sont mis en évidence.

Tutoriel rapide.

C'est ici

      if(m_position.SelectByIndex(i)){
         ticket  = PositionGetInteger(POSITION_TICKET);

peut être remplacé par

      t icket = PositionGetTicket(i);
 
Alexey Viktorov:

Un peu d'alphabétisation.

Celui-là

peut être remplacé par.

Super, si d'autres endroits dans le code provoquent un rejet - montrez-moi, je suis un codeur amateur, ce que j'ai creusé, c'est à moi, la connaissance n'est pas systématique et fragmentaire. Je vous serais très reconnaissant de me guider sur la bonne voie.

Corrigé, maintenant c'est comme ça :

//---Запись новых тикетов в массив позиций        
   int All_Position = PositionsTotal();
   int Array_Size   = ArrayRange(Arr_Position,0);
//---  
   for(int i = 0; i < All_Position; i++){
      ticket = (int)PositionGetTicket(i);
      new_pos = true;
      for(int e = 0; e < Array_Size; e++){
         if(Arr_Position[e][0]==ticket){
            new_pos = false;
            n++;
            break;}}
      if(new_pos){
         int New_Size = Array_Size+1;
         ArrayResize(Arr_Position,New_Size,0);
            Arr_Position[Array_Size][0] = (int)ticket;//Ticket
            Arr_Position[Array_Size][1] = 0;//Number_Caste (0 = начальные позиции)
            n++;}}                       
 
Sergey Voytsekhovsky:

Super, s'il y a d'autres endroits dans le code qui provoquent un rejet - montrez-moi, je suis un codeur amateur, ce que j'ai trouvé est à moi, les connaissances ne sont pas systématiques et fragmentaires. Je vous serais très reconnaissant de me guider sur la bonne voie.

Seulement à l'occasion. Je n'en tiendrai pas compte. En fait, je suis un autodidacte et un vieil autodidacte, aussi.

Les tickets dans mql5 sont de type ulong

Il y a donc moins de choses à apporter au type.

 
Alexey Viktorov:

Seulement s'il y a une occasion. Je ne regarderai pas. Et en général, je suis aussi autodidacte, et un vieil autodidacte en plus.

Les tickets dans mql5 sont de type ulong

Il y a donc moins de choses à apporter au type.

Merci, j'en tiens compte, et je le referai ici plus tard.