simple pregunta

 

Saludos a todos. He creado un código (modificando otros códigos) para cerrar órdenes de mercado.



int l_pos_44 = 0;

if (CheckFirstOP(OP_BUY) > 1) {

for (l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {

OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;

double Precio = OrderOpenPrice();

if (NormalizeDouble(MathAbs(Bid - Price), Digits) < NormalizeDouble(Dist, Digits)) {

Dist = MathAbs(Oferta - Precio);

int Ticket = OrderTicket();

double Lote = OrderLots();

OrderClose(Ticket, Lot, Bid, 3);

}

}


(el mismo código para cerrar posiciones de venta (obviamente con la variable OP_SELL en lugar de OP_BUY))


int CheckFirstOP(int a_cmd_0) {

int l_count_4 = 0;

for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {

if (OrderSelect(l_pos_8, SELECT_BY_POS)) {

if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {

if (OrderType() == a_cmd_0) {

l_count_4++;

romper;

}

}

}

}

return (l_count_4);

}


Necesito un código para cerrar posiciones largas o cortas cuando hay más de 1 posición abierta para el tipo...así que para mantener 2 posiciones en total (1 de compra y 1 de venta)...necesito también mantener la posición abierta más reciente es decir en este caso la de mayor precio abierto para la posición de compra y la de menor precio abierto para la posición de venta. El problema es que el código no cierra las posiciones...no cierra ninguna.


Cuando: "if (CheckFirstOP(OP_BUY) == 1)" el código cierra las primeras posiciones inmediatamente después de abrirlas...es decir, después de abrir una orden de compra y otra de venta se cierran con el siguiente tick. Y cuando: "if (CheckFirstOP(OP_BUY) > 1)" no se cierra ninguna de las posiciones. No sé qué estoy haciendo mal.

Por favor, ¿alguien puede ayudarme?

 

I forgot:


doble Dist = 1000000.0;

 
Aljohin:

Por favor, ¿alguien puede ayudarme?

1. Esto es sólo una parte de tu código, muéstranos la función CheckFirstOP() por ejemplo.

2. El bucle for se incrementa. Eso no funcionará correctamente si se cierran las órdenes en el bucle, por favor, vea -> https://www.mql5.com/en/forum/119840.

3. Tu convención de nomenclatura de variables no es muy buena.

4. Por favor, utiliza el botón SRC para publicar tu código y así conservar el formato. Es muy difícil leer tu código así.

 
gordon:

1. Esto es sólo una parte de tu código, muéstranos la función CheckFirstOP() por ejemplo.

2. El bucle for se incrementa. Eso no funcionará correctamente si se cierran las órdenes en el bucle, por favor vea -> https://www.mql5.com/en/forum/119840.

3. Tu convención de nomenclatura de variables no es muy buena.

4. Por favor, utiliza el botón SRC para publicar tu código y así mantener el formato. Es muy difícil leer tu código así.


double Dist=1000000.0;
if ( CheckFirstOP(OP_BUY) > 1) {
      for ( l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {
          OrderSelect( l_pos_44, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }

int CheckFirstOP(int a_cmd_0) {
   int l_count_4 = 0;
   for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
      if (OrderSelect( l_pos_8, SELECT_BY_POS)) {
         if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {
            if (OrderType() == a_cmd_0) {
               l_count_4++;
               break;
            }
         }
      }
   }
   return ( l_count_4);
}
my fault...i'm very new to this stuf...
 
gordon:

3. Su convención de nomenclatura de variables es... no muy buena.

parece una convención de nombres del descompilador ...

"es nuevo en estas cosas"

 
meikel:

parece una convención de nombres de descompiladores...

"es nuevo en estas cosas"

probablemente sí...quiero modificar un EA que compré...también me enviaron el código (dijeron que por error)...ahora entiendo la razón de esta nomenclatura tan extraña...como dije soy nuevo (acabo de leer el libro de MQL4 en este sitio) y no quería modificar muchas cosas al menos al principio así que dejé los nombres como los encontré.

 
Ais:

Hola

Laorden seleccionada puede cerrarse completamente mediante la expresión: "OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;"

Un saludo

no resuelve mi problema...

 
gordon:

2. El bucle for se incrementa. Eso no funcionará correctamente si se cierran las órdenes en el bucle, por favor vea -> https://www.mql5.com/en/forum/119840.

¿Por qué el incremento no funciona? en el libro de MQL4 no se menciona (creo) ... de todos modos he intentado:


if ( CheckFirstOP(OP_BUY) > 1) {
      for(int i = OrdersTotal() - 1; i >= 0; i--) {
          OrderSelect( i, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }
it doesn't work, don't know why
 
Ais:

simplemente estar seguro en esta línea ahora

Sí, por supuesto, he intentado y no cambia nada ... cosas extrañas con esta programación :) no sería difícil escribir una simple orden de cierre (pensé) ...

 
it doesn't work, don't know why
Cuando cierras el índice de la orden 5, el índice de la orden 6 se convierte en el índice 5, el 7 se convierte en el 6, etc. Contando con ello, se pierde una de cada dos órdenes abiertas.
 
WHRoeder:
Cuando cierras la orden índice 5, la orden índice 6 se convierte en índice 5, la 7 en 6, etc. Contando se pierde cada una de las otras órdenes abiertas.

ah ok, entendido...de todas formas el codigo esta pensado para mantener solo una orden abierta y empezar a trabajar imidiatamente cuando hay 2 ordenes abiertas y cierra una de ellas despues de seleccionar y analizar todas ellas (es decir 2 ordenes)...asi que no creo que sea un gran error incrementar en la seleccion de ordenes...de todas formas he probado el método de decremento sin ningún resultado...tal vez lo estoy intentando de forma equivocada...no lo sé...¿puede alguien probar mi código y ver si realmente cierra las operaciones...o puede alguien escribir un código sencillo para seleccionar y cerrar la orden abierta anterior (es decir, la que tiene mayor precio de apertura para la compra y con menor precio de apertura para la venta)?

gracias