Preguntas "para" de los operadores de bicicletas

 

Hola comunidad MQL4,


Primera referencia: https://book.mql4.com/operators/for

Según la primera referencia, un ejemplo de formato del operador 'for' se escribe así:

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


Segunda referencia: https: //docs.mql4.com/basis/operators/for

Según la segunda referencia, el ejemplo proporcionado del operador 'for' se describe así:

for (Expression1; Expression2; Expression3)
   operator;


¿Por qué este primer ejemplo contiene una "condición" como segundo parámetro mientras que el segundo ejemplo contiene "Expresión2" como segundo parámetro?

¿Qué significa esta contradicción?

¿Tiene alguna importancia?

Si voy a utilizar el operador de ciclo "for", creo que debo conocer bien todos sus parámetros.

Gracias.

 

Quizás puedas entender mejor un bucle for entendiendo primero un bucle while... un bucle for es sólo un bucle while con condición inicial e incremento incorporado...

Revise la documentación defor que dice. . .

"El operador for es equivalente a la siguiente sucesión de operadores:"

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


Específicamente relacionado con tu pregunta,"¿Por qué este primer ejemplocontiene una "condición" como segundo parámetro mientras que el segundo ejemplo contiene "Expresión2" comosegundo parámetro?"una expresión puede ser una condición, una condición resulta en un valor verdadero o falso, por ejemplo (a > b) o (c || d) o (OrdersTotal() >= 0) , además la documentación también dice . ."La expresión2 es la prueba condicional para la terminación del ciclo."

 

Simón,

una expresión puede ser una condición

Entonces, ¿el parámetro dos en un encabezado de operador 'for' puede ser una expresión O condición? Asumo que la Expresión_1 y la Expresión_3 deben seguir siendo expresiones y no cambiar a condiciones, ¿correcto? No veo por qué las expresiones 1 y 3 no podrían ser también condiciones. Ambas expresiones 1&3 son sólo parámetros a rellenar. (siendo una condición PODRÍA ser alternativamente el parámetro dos aka el propósito de la Expresión_2)

Por favor, confirme sus pensamientos.

Las expresiones pueden ser operaciones aritméticas (2+2=4), asignación, etc. (todos los enumerados en el Diccionario MetaEditor).

La condición es verdadera || falsa (ejemplos: a>b, a>=b, a==b, etc.).

Las operaciones están contenidas en el diccionario del MetaEditor también (ejemplos: Break, Continue, Return, while, for, etc.).

Gracias

 
WhooDoo22:

Simón,

una expresión puede ser una condición

Entonces, ¿el parámetro dos en un encabezado de operador 'for' puede ser una expresión O condición? Asumo que la Expresión_1 y la Expresión_3 deben seguir siendo expresiones y no cambiar a condiciones, ¿correcto? No veo por qué las expresiones 1 y 3 no podrían ser también condiciones. Ambas expresiones 1&3 son sólo parámetros a rellenar. (siendo una condición PODRÍA ser alternativamente el parámetro dos aka el propósito de la Expresión_2)

Aprende a usar correctamente el while . . . un bucle for es un bucle while sólo que arreglado de una manera más estética. Entonces lo de las expresiones vs condiciones tendrá todo el sentido . . . hazte un favor y reduce las opciones de dolor de cabeza . . . estudiawhile

Documentación - while

Libro - while
 
WhooDoo22: Entonces, ¿el parámetro dos de una cabecera de operador 'for' puede ser una expresión O condición?
Cualquier expresión da como resultado un número. El número, convertido en un booleano es una condición. Es lo mismo. Tú dices tuh-mey-toh , y yo digotuh-mah-toh
 

Simon, voy a practicar el uso de la operación while en el código. hazte un favor... ¡Me gusta como suena esto! :) Gracias.

William, El número, convertido en booleano es una condición ... (1=true,0=false). Muchas gracias.

Gracias.

 

Simón,

He escrito un EA que debería ;) ser capaz de hacer lo que pediste.

Estoy compartiendo una combinación de este EA junto con una captura del resultado de la pestaña "Expertos" en la Terminal.


El EA parece ser capaz de seleccionar la orden USDJPY e imprimir su información en la pestaña de Expertos. ¿Por qué el EA no cierra la orden además de imprimir la información de la misma?

Gracias.

Archivos adjuntos:
 
WhooDoo22:

Simón,

He escrito un EA que debería ;) ser capaz de hacer lo que pediste.

Estoy compartiendo una combinación de este EA junto con una captura del resultado de la pestaña "Expertos" en la Terminal.


El EA parece ser capaz de seleccionar la orden USDJPY e imprimir su información en la pestaña de Expertos. ¿Por qué el EA no cierra la orden además de imprimir la información de la misma?

Gracias.

¿Dijiste que entendías los corchetes?https://www.mql5.com/en/forum/142732


Por favor, explique su código y lo que se supone que debe hacer ... en particular hablar de la mientras por favor.
 

Simon,

Por favor, explique su código y lo que está destinado a hacer ... en particular, me hablan a través de la mientras que por favor.

Haré todo lo posible para explicar el código y su propósito.


Propósito del código:

1. Seleccione la orden USDJPY de un grupo de tres órdenes.

2. 2. Modificar el TP y el SL de la orden USDJPY.

3. Ejecutar la función OrderPrint().

4. Cerrar la orden USDJPY.


Explicación del código:

En primer lugar, se declaran las variables.

   int i;
   double bid_ask;

Ensegundo lugar, se ejecuta el bucle 'while'.

Lógica del bucle 'while':

Lafunción OrderSelect () utiliza la variable 'i' como sustituto de un número 1,2,3,etc.. (tenlo en cuenta por favor)

Entonces, si la variable i dentro de la función OrderSelect() y OrderSymbol() no es USDJPY, aumenta la variable i en 1. ( i++; )

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

         i++;

El bucle 'while' incrementa la variable 'i' hasta que la función OrderSelect() selecciona la entrada de orden adecuada Y la función OrderSymbol() selecciona una orden USDJPY. Cuando ambos objetivos se han cumplido, el bucle while se convierte en falso y el control se pasa por debajo de i++; (el cuerpo del bucle while).

En tercer lugar, se ejecuta la función OrderModify().

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

En cuarto lugar, se ejecuta la función OrderPrint().

OrderPrint();

En quinto lugar, se incluyen los parámetros para discernir si la orden a cerrar es de compra o de venta.

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

En sexto lugar, una vez que el programa distingue si la orden es de compra o de venta, se ejecuta la función OrderClose().

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

En séptimo lugar (y por último), el programa incluye un comentario que mostrará la variable 'i' para confirmar que el número de ticket es efectivamente el ticket en USDJPY durante la prueba visual en el probador de estrategias.

Comment("i = " ,i);

Gracias.

 
WhooDoo22:

Simon,


la lógica del bucle 'while':

La función OrderSelect() utiliza la variable 'i' como sustituto de un número 1,2,3,etc.. (tenlo en cuenta por favor)

Entonces, si la variable i dentro de la función OrderSelect() y OrderSymbol() no es USDJPY, aumenta la variable i en 1. ( i++; )

El bucle 'while' incrementa la variable 'i' hasta que la función OrderSelect() selecciona la entrada de orden adecuada Y la función OrderSymbol() selecciona una orden USDJPY. Cuando ambos objetivos se han cumplido, el bucle while se convierte en falso y el control se pasa por debajo de i++; (el cuerpo del bucle while).

Lo siento, estaba leyendo mal tu código . . gracias por la explicación, ahora entiendo lo que estás haciendo. El problema que tienes es muy simple . . sólo mira el mensaje de error en la captura de pantalla que has publicado . . mira lo que produce OrderPrint(), incluyendo el número de orden, luego mira el error.

Si hubieras incluido la comprobación de los valores de retorno y la notificación de errores, probablemente habrías visto tu problema.
 

Simon,

No veo qué es lo que estás viendo pero ;) Incluiré de inmediato la función GetLastOrder() para arrojar algo de luz sobre esta cuestión. Disculpas por publicar una pregunta sin incluir primero la función GetLastOrder() con el código.

Gracias.

Razón de la queja: