Ciclo operatore 'per' domande

 

Ciao comunità MQL4,


Primo riferimento: https://book.mql4.com/operators/for

Secondo il primo riferimento, un esempio di formato dell'operatore 'for' è scritto così:

  for (Expression_1; Condition; Expression_2)         // Cycle operator header
      One operator, cycle body                     // Cycle body is one operator


Secondo riferimento: https://docs.mql4.com/basis/operators/for

Secondo il secondo riferimento, l'esempio fornito dell'operatore 'for' è descritto come segue:

for (Expression1; Expression2; Expression3)
   operator;


Perché questo primo esempio contiene una "condizione" come secondo parametro mentre il secondo esempio contiene "Expression2" come secondo parametro?

Qual è il significato di questa contraddizione?

Ha anche importanza?

Se devo usare l'operatore del ciclo "for", credo che devo avere una comprensione approfondita di tutti i suoi parametri.

Grazie.

 

Forse potreste capire meglio un ciclo for capendo prima un ciclo while... un ciclo for è solo un ciclo while con condizione iniziale e incremento incorporati...

Controllate la documentazione sufor che dice . . .

"L'operatorefor è equivalente alla seguente successione di operatori:"

Expression1;
while(Expression2)
  {
   operator;
   Expression3;
  };


Specificamente collegato alla tua domanda,"Perché questo primo esempiocontiene una "condizione" come secondo parametro mentre il secondo esempio contiene "Expression2"come secondo parametro?"un'espressione può essere una condizione, una condizione si traduce in un valore vero o falso, per esempio (a > b) o (c || d) o (OrdersTotal() >= 0) , inoltre la documentazione dice anche . ."Expression2 è il test condizionale per la terminazione del ciclo."

 

Simon,

un'espressione può essere una condizione

Quindi, il parametro due nell'intestazione di un operatore 'for' può essere un'espressione O una condizione? Presumo che Expression_1 e Expression_3 debbano rimanere espressioni e non cambiare in condizioni, giusto? Non vedo perché l'espressione 1 & 3 non possano essere anche condizioni. Entrambe le espressioni 1&3 sono solo parametri da riempire. (essendo una condizione POTREBBE essere in alternativa il parametro due aka lo scopo di Expression_2)

Si prega di confermare i pensieri.

Le espressioni possono essere operazioni aritmetiche (2+2=4), assegnazioni, ecc. (tutte elencate nel dizionario di MetaEditor).

La condizione è vera || falsa (esempi: a>b, a>=b, a==b, ecc.).

Anche le operazioni sono contenute nel dizionario MetaEditor (esempi: Break, Continue, Return, while, for, ecc.)

Grazie

 
WhooDoo22:

Simon,

un'espressione può essere una condizione

Quindi, il parametro due nell'intestazione di un operatore 'for' può essere un'espressione O una condizione? Presumo che Expression_1 e Expression_3 debbano rimanere espressioni e non cambiare in condizioni, giusto? Non vedo perché l'espressione 1 & 3 non possano essere anche condizioni. Entrambe le espressioni 1&3 sono solo parametri da riempire. (essendo una condizione POTREBBE essere in alternativa il parametro due aka lo scopo di Expression_2)

Impara ad usare correttamente while . . . un ciclo for è un ciclo while solo organizzato in un modo esteticamente più gradevole. Poi la cosa delle espressioni vs condizioni avrà senso. . . fatevi un favore e riducete le opzioni per il mal di testa . . . . studiatewhile

Documentazione - while

Libro - while
 
WhooDoo22: Quindi, il parametro due nell'intestazione di un operatore 'for' può essere un'espressione O una condizione?
Qualsiasi espressione dà come risultato un numero. Il numero, convertito in un booleano è una condizione. La stessa cosa. Tu dici tuh-mey-toh , e io dicotuh-mah-toh
 

Simon, mi eserciterò nell'uso dell'operazione while nel codice. fatti un favore... Mi piace il suono di questo! :) Grazie.

William, Il numero, convertito in un booleano è una condizione ... (1=vero, 0=falso). Molte grazie.

Grazie a te.

 

Simon,

Ho scritto un EA che dovrebbe ;) essere in grado di fare quanto richiesto.

Sto condividendo una combinazione di questo EA accoppiato con un'istantanea del risultato dalla scheda "Esperti" nel terminale.


L'EA sembra essere in grado di selezionare l'ordine USDJPY e stampare le sue informazioni nella scheda Esperti. Perché l'EA non chiude l'ordine e non stampa le informazioni dell'ordine?

grazie.

 
WhooDoo22:

Simon,

Ho scritto un EA che dovrebbe ;) essere in grado di fare quanto richiesto.

Sto condividendo una combinazione di questo EA accoppiato con un'istantanea del risultato dalla scheda "Esperti" nel terminale.


L'EA sembra essere in grado di selezionare l'ordine USDJPY e stampare le sue informazioni nella scheda Esperti. Perché l'EA non chiude l'ordine e non stampa le informazioni dell'ordine?

grazie.

Hai detto che hai capito le parentesi graffe?https://www.mql5.com/en/forum/142732


Per favore, spiega il tuo codice e cosa dovrebbe fare... in particolare parlami del mentre, per favore.
 

Simon,

Per favore, spiega il tuo codice e cosa dovrebbe fare... in particolare parlami del mentre, per favore.

Farò del mio meglio per spiegare il codice e il suo scopo.


Scopo del codice:

1. Selezionare l'ordine USDJPY da un gruppo di tre ordini.

2. Modificare TP e SL dell'ordine USDJPY.

3. Eseguire la funzione OrderPrint().

4. Chiudere l'ordine USDJPY.


Spiegazione del codice:

In primo luogo, le variabili sono dichiarate.

   int i;
   double bid_ask;

In secondo luogo, viene eseguito il ciclo 'while'.

Logica del ciclo 'while':

Lafunzione OrderSelect() usa la variabile 'i' come sostituto di un numero 1,2,3,ecc. (tenetelo a mente per favore)

Quindi, se la variabile i all'interno della funzione OrderSelect() e OrderSymbol() NON è USDJPY, aumenta la variabile i di 1. ( i++; )

   while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")

         i++;

Il ciclo 'while' aumenta la variabile 'i' fino a quando la funzione OrderSelect() seleziona il biglietto d'ordine corretto E la funzione OrderSymbol() seleziona un ordine USDJPY. Quando entrambi gli obiettivi sono stati raggiunti, il ciclo while diventa falso e il controllo viene passato sotto i++; (il corpo del ciclo while).

In terzo luogo, viene eseguita la funzione OrderModify().

OrderModify(i,OrderOpenPrice(),50*Point,50*Point,0,CLR_NONE);

Quarto, viene eseguita la funzione OrderPrint().

OrderPrint();

Quinto, i parametri sono inclusi per discernere se l'ordine da chiudere è un ordine di acquisto o di vendita.

         if(OrderType()==OP_BUY){bid_ask=Bid;}
         if(OrderType()==OP_SELL){bid_ask=Ask;}

Insesto luogo, una volta che il programma distingue se l'ordine è di acquisto o di vendita, esegue la funzione OrderClose().

OrderClose(i,OrderLots(),bid_ask,3,CLR_NONE);

Settimo (e ultimo), il programma include un commento che mostrerà la variabile 'i' per confermare che il numero del ticket è effettivamente il ticket su USDJPY durante il test visivo in strategy tester.

Comment("i = " ,i);

Grazie.

 
WhooDoo22:

Simon,


logica del ciclo 'while':

La funzione OrderSelect() usa la variabile 'i' come sostituto di un numero 1,2,3,ecc. (tenetelo a mente per favore)

Quindi, se la variabile i nella funzione OrderSelect() e OrderSymbol() NON è USDJPY, aumenta la variabile i di 1. ( i++; )

Il ciclo 'while' aumenta la variabile 'i' fino a quando la funzione OrderSelect() seleziona il biglietto d'ordine corretto E la funzione OrderSymbol() seleziona un ordine USDJPY. Quando entrambi gli obiettivi sono stati raggiunti, il ciclo while diventa falso e il controllo viene passato sotto i++; (il corpo del ciclo while).

Scusa, stavo interpretando male il tuo codice . Il problema che hai è molto semplice... basta guardare il messaggio di errore nello screen grab che hai postato... guarda cosa produce OrderPrint(), incluso il numero dell'ordine, poi guarda l'errore.

Se avessi incluso il controllo dei valori di ritorno e la segnalazione degli errori, probabilmente avresti visto il tuo problema da solo.
 

Simon,

Non capisco cosa stai vedendo ma ;) Includerò prontamente la funzione GetLastOrder() per far luce su questo problema. Mi scuso per aver postato una domanda senza aver prima incluso la funzione GetLastOrder() nel codice.

Grazie.