Dividere le posizioni aperte in gruppi - pagina 5

 
Alexey Viktorov:

Con un sacco di cosa? Elementi dell'array che non sono nemmeno riempiti ad ogni spunta? Come si noterà?

Questo codice brucia agli occhi, come se fosse intenzionalmente peggiorato.

Beh, se non fa differenza, facciamo così:

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);
   }

Perché no?

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:

Questo codice brucia agli occhi, come se fosse intenzionalmente peggiorato.

Beh, se non fa differenza, facciamo così:

Perché?

ps; Ahh, capisco. Beh, questo è un esempio. Quando l'array di lavoro sarà riempito, sicuramente sarà riempito da un indice. Non la variante in cui si deve prestare attenzione a queste sottigliezze.
 
Alexey Viktorov:

Perché?

Probabilmente è il motivo per cui si fa cambiare l'array all'interno del ciclo quando la dimensione è nota in anticipo.

Non so la ragione esatta :).

Sei un freelance, vero? Terribile :).

 
Aliaksandr Hryshyn:

Probabilmente è il motivo per cui si fa cambiare l'array all'interno del ciclo quando la dimensione è nota in anticipo.

Non so la ragione esatta :).

Sei un freelance, vero? Terribile :).

E allora?

 
Alexey Viktorov:

Questa è una sciocchezza. Ho usato questa funzione senza leggere il manuale. ...

Ha funzionato, grazie mille!!! Quello che ho scritto non ha senso, la funzioneArrayRemove delete funziona bene su array di qualsiasi dimensione.

L'errore era altrove. Dopo aver applicato la funzione, ho dovuto ridefinirla, questa volta in un array più piccolo, perché nel passo successivo questa variabile è stata usata di nuovo nel ciclo, e l'array è caduto fuori dall'intervallo (potrei essere sbagliato nella terminologia, ma spero di essere stato chiaro).

Posterò la versione funzionante qui sotto e nel file allegato. I punti sottili sono evidenziati.

//+------------------------------------------------------------------+
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);}
//+------------------------------------------------------------------+
File:
Sower_1_6.mq5  19 kb
 

Mi sento come uno studente che si comporta male, involontariamente presente a una discussione tra due insegnanti che insistono sulla correttezza della loro metodologia di insegnamento.

Permettetemi di inserire i miei delicati tre centesimi.

Nonostante la leggera imperfezione del codice dell'esempio postatoda Alexey Viktorov, i pensieri che ha esposto sono corretti e ci hanno aiutato a capirlo. E se un freelance è pronto e disposto ad aiutare gratuitamente, senza cercare di estorcere un centesimo in più - allora lodatelo, lo rispetto davvero. Grazie.

Aliaksandr Hryshyn- Grazie mille, anche tu non eri indifferente e volevi sinceramente aiutare e l'hai fatto. Chissà come si sarebbero svolti gli eventi senza le sue critiche?

 
Sergey Voytsekhovsky:

Ha funzionato, grazie mille!!! Quello che ho scritto è davvero senza senso, la funzione di cancellazioneArrayRemove funziona bene su array di qualsiasi dimensione.

L'errore era altrove. Dopo aver applicato la funzione, ho dovuto ridefinirla, questa volta in un array più piccolo, perché nel passo successivo questa variabile è stata usata di nuovo nel ciclo, e l'array è caduto fuori dall'intervallo (potrei essere sbagliato nella terminologia, ma spero di essere stato chiaro).

Posterò la versione funzionante qui sotto e nel file allegato. I punti sottili sono evidenziati.

Tutorial veloce.

Ecco qui

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

può essere sostituito da

      t icket = PositionGetTicket(i);
 
Alexey Viktorov:

Un po' di alfabetizzazione.

Questo

può essere sostituito da.

Grande, se altri posti nel codice causano il rifiuto - si prega di mostrare me, io sono un homebrew coder, quello che ho scavato, che è mio, la conoscenza non è sistematica e frammentaria. Sarò molto grato per la guida sulla strada giusta.

Corretto, ora è così:

//---Запись новых тикетов в массив позиций        
   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:

Grande, se ci sono altri posti nel codice che causano il rifiuto - per favore mostratemi, sono un codificatore homebrew, quello che ho trovato è mio, la conoscenza non è sistematica e frammentaria. Sarei molto grato per una guida sulla strada giusta.

Solo a volte. Non ne terrò conto. Comunque, sono anche un autodidatta e un vecchio autodidatta.

I biglietti in mql5 sono di tipo ulong

Allora c'è meno da portare al tipo

 
Alexey Viktorov:

Solo se c'è un'occasione. Non guarderò. E in generale, sono anche un autodidatta, e un vecchio autodidatta.

I biglietti in mql5 sono di tipo ulong

Allora c'è meno da portare al tipo

Grazie, ne terrò conto e lo rifarò qui più tardi.