Autoaprendizaje del lenguaje MQL5 desde cero - página 66

 
Valeriy Yastremskiy:

El operador de bucle y los operadores en el cuerpo del bucle. No es exactamente el clásico ruso.

Todo está bien, por supuesto, pero ¿dónde está el iterador i en el cuerpo del bucle? Y para obtener el símbolo de posición y su número mágico, primero hay que seleccionarlo. La descripción de la posición es una estructura (en MQL5 toda la estructura y las órdenes y el tiempo y los tratos) y se rellena a través de la selección, por el iterador que no es un ticket de posición, sino un número de posición. Y debemos recordar que en la estructura de la descripción de la posición, siempre es la última selección de posición.

¡Hola Valery! Gracias por la aclaración.

Ahí es donde vino toda mi confusión, porque todo funcionaba sin el operador de bucle for, mientras que no funcionaba con él por alguna razón. ¿He entendido bien que primero debo hacer todas las consultas necesarias a través de la solicitud?

Saludos, Vladimir.

 
MrBrooklin:

¡Hola Valery! Gracias por la aclaración.

Ahí es donde estaba toda mi confusión, porque todo funcionaba sin el operador de bucle for, pero con él, por alguna razón, no. ¿He entendido bien que tenía que hacer primero todas las consultas necesarias a través de la solicitud?

Saludos, Vladimir.

No, no sé muy bien MKL5 . Se trata de una solicitud de ejecución. Y hay que seleccionar la posición por número, para seguir trabajando con ella.

PositionSelect

Creo que sí.

 
MrBrooklin:

¡Buen día y buen humor a todos!

Queridos profesionales Por favor, aconséjame, pero no con palabras, porque si no nunca aprenderé el lenguaje de programación MQL5.

Saludos, Vladimir.

Hola! El asunto es que has aplicado el bucle de posiciones abiertas, y no lo has definido en términos de "if", es decir, lo que busca exactamente el bucle for, y aún no lo has completado, debe devolver algo...

Las posiciones abiertas se cuentan todo el tiempo, por lo que es mejor crear un bloque con un ciclo, y cuando se abre, se puede llamar, por ejemplo, de esta manera;

input int MaxOpenedPositions=1;
.
.
.
int Total=TotalPositions(-1);
if(Total<MaxOpenedPositions && другие условия для открытия) OpenBUY();//например
if(Total<MaxOpenedPositions && другие условия для открытия) OpenSELL();//например

//+------------------------------------------------------------------+
//| Total Positions                                                  |
//+------------------------------------------------------------------+
int TotalPositions(int Type)
   {
int cnt=0;
if(PositionsTotal()>0)
for(int i=PositionsTotal()-1;i>=0;i--)
   
if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==MagicNumber) 
   {
   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) {cnt++;continue;}
   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) {cnt++;}
   }
   return(cnt);
   }
 
Valeriy Yastremskiy:

no, realmente no conozco MKL5 . Esta es una solicitud de ejecución. Y hay que seleccionar una posición por número, para seguir trabajando con ella.

PositionSelect

Creo que sí.

Lo he intentado todo, incluido PositionSelect. Ninguno de ellos ayudó.

Saludos, Vladimir.

 
VVT:

Hola! Con palabras; la cuestión es que cuando aplicaste el bucle de posiciones abiertas, no lo especificaste en condiciones "if", es decir, qué es exactamente lo que intenta el bucle for, además no lo terminaste de ninguna manera, debería devolver algo....

Las posiciones abiertas se calculan todo el tiempo, por lo que es mejor crear un bloque con un bucle y llamarlo cuando se abra, por ejemplo;

¡Hola!

Gracias por el consejo. Intentaré analizar y aplicar su método de enumeración de posiciones abiertas.

Saludos, Vladimir.

 
VVT:

Hola! En palabras; la cuestión es que cuando aplicaste el bucle para buscar puestos vacantes, no lo especificaste en el "if", es decir, qué busca exactamente el bucle for, y no lo terminaste de ninguna manera, debería devolver algo...

Por cierto, la Referencia MQL5 no dice nada sobre el hecho de que el bucle debe devolver algo al finalizar. Tal vez, ¿he entendido algo mal? ¿O tal vez se refiere a la sentencia if?

Saludos cordiales, Vladimir.

 
MrBrooklin:

Lo he intentado todo, incluido PositionSelect. Nada ayudó.

Saludos, Vladimir.

Sólo se entiende, sí, la selección de posición en la red por herramienta, no por número. Oh, lo han estropeado).

Es posible a través de

  • PositionGetTicket devuelve el ticket de posición por número de posición (y tenemos un número) y después de recibir el ticket de posición podemos obtener su símbolo y magik.
O bien, si se trata de la compensación, podemos pensar en ello y decidir por qué necesitamos el número total de órdenes o posiciones, si sólo podemos tener una posición en un instrumento y necesitamos saberlo. Por eso puede que no necesitemos un ciclo. En nuestro instrumento hacemos Si el PositionSelect devuelve False, abre una posición y si es True, selecciona una posición en este instrumento y podemos trabajar con ella y modificarla para el arrastre.
 
Valeriy Yastremskiy:

Acabo de darme cuenta, sí, la selección de posiciones en la red por instrumento, no por número. Oh, son un desastre).

Es posible a través de

  • PositionGetTicket devuelve un ticket de posición por número de posición (y tenemos un número) y obteniendo el ticket de posición podemos obtener su símbolo y magik.
O bien, si se trata de la compensación, podemos pensar en ello y decidir por qué necesitamos el número total de órdenes o posiciones, si sólo podemos tener una posición en un instrumento y necesitamos saberlo. Por eso puede que no necesitemos un ciclo. En nuestro símbolo, hacemos Si el PositionSelect devuelve False, abre una posición y si True, selecciona una posición en este símbolo y podemos trabajar con ella y modificarla para el arrastre.

Así que el código fue escrito originalmente sin el operador de bucle, aunque tuve la curiosidad de probarlo después.

Saludos, Vladimir.

 
MrBrooklin:

Por cierto, no hay nada en la Referencia MQL5 sobre el hecho de que el bucle debe devolver algo al finalizar. ¿Quizá me he equivocado de nuevo?

Sinceramente, Vladimir.

La redacción no es del todo correcta. Las acciones deben realizarse en el cuerpo del bucle, en función del iterador. Según el iterador. Y es el resultado de realizar estas acciones en el cuerpo del bucle lo que se debe devolver. Si se pasó el bucle y no hubo operadores de ruptura o contingencia, significa que iremos a la Expresión 3 y luego a la Expresión 2 y si es True, la devolveremos con el nuevo iterador al cuerpo del bucle.

 
MrBrooklin:

Así que originalmente el código estaba escrito sin el operador de bucle, aunque luego me interesó probar cómo aplicarlo.

Respetuosamente, Vladimir.

Puede solicitar

  • PositionGetTicket devuelve un billete de posición por número de posición (y tenemos un número) y habiendo recibido el billete de posición podemos obtener su símbolo y magik.

Revisa todas las entradas por número. Y a través de los billetes averiguar los símbolos de la posición y comparar con los nuestros. Consigue el magik de posición y compáralo con el nuestro.

if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetString(POSITION_SYMBOL)==_Symbol && 
PositionGetInteger(POSITION_MAGIC)==MagicNumber) // вот эта строчка

Pero sólo por qué.