Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 120

 
hoz:


Questo è già un segno di sonnolenza in me.

Ma d'altronde, non è questo il punto. Sto eseguendo il gufo nel tester. Nella schermata, come potete vedere non ci sono ordini pendenti o ordini a mercato.

Sia la funzione separata che il commento standard che ho duplicato la funzione separata per visualizzare i valori richiesti mostrano che ci sono sempre ordini a mercato e ordini pendenti.

Ecco come funziona la funzione:

Lo chiamo dall'inizio, dove inizialmente ho anche azzerato i valori dei contatori:

Beh, per così dire, t++ funziona in entrambi i modi
 
Forexman77:

Rielaborato un po' il tuo EA, commenti nel codice. Prestare attenzione alla formazione del segnale e dell'arresto. Li ho messi appositamente senza pensare. Cambiatelo secondo il vostro gusto, se necessario.

File:
 
artmedia70:
Beh, il t++ funziona in entrambi i casi


L'unica opzione è questa?

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
void FindOrders(int& t, int& p)
{
   t = 0;
   p = 0;
 
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderType() > 1 && OrderType() < 6)
      {
          p++;
          t++;
      }
      else if (OrderType() < 2)
          t++;
      else 
      {
         Print("Позиций в рвнке нет!");
      }
      
      pr ("FindOrders(): " + "t = " + t);
      pr ("FindOrders(): " + "p = " + p);
   }
}

Non sembra molto. Non è ottimizzato. La ripetizione di t++ non è felice...

 
hoz:


L'unica opzione è questa?

Non sembra molto. Non è ottimizzato. La ripetizione di t++ non è felice...

E perché vorresti aumentare t in ogni caso? In effetti, cosa c'è comunque:

if (OrderType() > 1 && OrderType() < 6)
      {
          p++;
          t++;
      }
      else t++;

Se il tipo di ordine è maggiore di 1 e minore di 6, aumentare p, aumentare t

Altrimenti (anche se il tipo di ordine è==6), aumentiamo nuovamente t

È strano, vero?

 
artmedia70:

Perché vorresti aumentare la t comunque? In effetti, cosa c'è comunque:

Se il tipo di ordine è superiore a 1 e inferiore a 6, aumentiamo p, aumentiamo t

Altrimenti (anche se il tipo di ordine==6) aumentiamo nuovamente t

È strano, vero?




Mentre scrivevo il tuo commento, avevo già riscritto il mio. Qui sopra c'è la versione corretta.
 
hoz:

Mentre scrivevo il tuo commento, avevo già riscritto il mio. Questa è la versione corretta.
Perché dovrei aumentare t se l'ordine è in sospeso e poi aumentare nuovamente t se l'ordine successivo è a mercato?
 
Crea una matrice di sei elementi. Passarlo alla funzione per riferimento. Una volta che un ordine è stato selezionato e si adatta a tutti i filtri (simbolo, magik), incrementa la cella dell'array indirizzata dal tipo di ordine. Dopo l'esecuzione della funzione, avrete il numero di ordini ordinati per tipo nell'array.
 
artmedia70:
E perché dovremmo aumentare t, se l'ordine è in sospeso, e poi aumentare ancora t, se l'ordine successivo è a mercato?


t è il numero di tutti gli ordini.

p - numero di ordini pendenti

Se la condizione:

if (OrderType() > 1 && OrderType() < 6)

è vero, allora sia t che p sono incrementati, poiché qualsiasi ordine del tipo da 2 a 5 è sia un ordine pendente che un ordine generale. Questo significa che dovremmo incrementare entrambi i contatori. E se la condizione è vera:

else if (OrderType() < 2)

Allora non c'è un ordine pendente ma c'è un ordine a mercato. Significa che aumenteremo il contatore t, cioè il contatore del numero totale di ordini.

E se non c'è niente, allora stamperemo che non ci sono ordini.

 
artmedia70:
Crea una matrice di sei elementi. Passarlo alla funzione per riferimento. Una volta che un ordine è stato selezionato e si adatta a tutti i filtri (simbolo, magik), incrementa la cella dell'array indirizzata dal tipo di ordine. Dopo l'esecuzione della funzione, avrete il numero di ordini ordinati per tipo nell'array.

Ho già capito che l'array è più preferibile qui))) C'è qualche incoerenza nella variante di cui sopra? (Solo per l'interesse, tutto sembra essere chiaro ora).
 
hoz:

Che qui l'array sarà preferibile, l'ho già capito))) E in quella variante, che ho descritto sopra è imprecisa? (Solo per interesse. Penso che tutto sia già chiaro)

Che ne dite di questo?

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
void FindOrders(int& t, int& p)
{
   t = 0;
   p = 0;
 
   for (int i=OrdersTotal() - 1; i>=0; i--)
      {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderType() > 1 && OrderType() < 6)   p++;
      if (OrderType() < 6)  t++;
       }
  pr ("FindOrders(): " + "t = " + t);
  pr ("FindOrders(): " + "p = " + p);
}