Gestionar operaciones por separado

Foro dedicado a todo lo relacionado con la versión 4 de la plataforma de Metaquotes.
Responder
luirmi
Mensajes: 7
Registrado: 10 Ago 2016 22:07

Gestionar operaciones por separado

Mensaje por luirmi »

Código: Seleccionar todo

int alerta = 0;
bool velanueva = False; // Variable que nos detecta la vela
extern int numeromagico = 6;
extern int periodo = 20;
extern int desviacion = 2;
extern double lote = 0.08;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
    nuevabarra ();
   int totalordenes = OrdersTotal();
         for (int i=0; i <= (totalordenes); i++){
        
   //Seleccionamos la orden del mercado
   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==TRUE){
   if (OrderSymbol()==Symbol() && OrderMagicNumber()==numeromagico){   
   double Nbollsup1 = NormalizeDouble (iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_UPPER,1),0); 
        double precioentrada = OrderOpenPrice();
        double precioactual = MarketInfo(Symbol(),MODE_ASK);
      
               if (Close[1]>Nbollsup1&&precioactual>precioentrada){
                      int cerrar;
                        cerrar = OrderClose(OrderTicket(),lote,Bid,3,Black);
                        return;
           }    
        }
     }
  }
  
//---
    if (velanueva == True){
   double bollsup1 = iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_UPPER,1);
   double bollinf1 = iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_LOWER,1);
   double mmbb1 = iMA (Symbol(),0,periodo,0,MODE_EMA,PRICE_CLOSE,1);
 
 
   double bollsup2 = iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_UPPER,2);
   double bollinf2 = iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_LOWER,2);
   double mmbb2 = iMA (Symbol(),0,periodo,0,MODE_EMA,PRICE_CLOSE,2);        
         } 
           
         if (Close[1] > bollinf1 && Open[1] < bollinf1 && (Close[1]>Low[2]-stop1) ){
            int compra;
              compra = OrderSend(Symbol(),OP_BUY,lote,Ask,3,0,0,NULL,numeromagico,0,Red);
         minima2 = Low[2]-stop1;
         return;
         }
   }
  }
//+------------------------------------------------------------------+
// Funcion encargada de cambiar la variable nuevavela
void nuevabarra(){
static datetime nuevotime = 0; //Detectar nuevo tiempo
velanueva = False; // 0 - misma vela, 1 - vela nueva
if (nuevotime != Time[0]){
nuevotime = Time[0];
velanueva = True;
  }
}

Hola, he creado este sencillo EA para que cuando el precio corte hacia arriba la banda de bollinger inferior abra un largo y que cierre el largo cuando la vela cierre por encima de la banda superior. Solo quiero que cierre las operaciones si estan en positivo, y el problema es que al abrir una operación nueva al tener el mismo numero magico al cerrar una me cierra todas las que estan abiertas. Cómo podría hacer para que me gestione cada buy por separado?

Muchas gracias
Avatar de Usuario
Rafa7
Mensajes: 4923
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Gestionar operaciones por separado

Mensaje por Rafa7 »

Hola, luirmi.



Yo no tengo ni idea de programación de Metatrader.

A ver, abres largos cada vez que el precio cruce por encima de la banda inferior de Bollinger, y cierras largos cada vez que el precio cruce por encima de la banda superior de Bollinger.
Supongamos que has abierto n operaciones sin que en ningún momento el cierre haya cruzado por encima de la banda de Bolllinger, entonces quieres que cada vez que el cierre cruce por encima de la banda de Bolliinger se cierre solamente una operación. Es decir, que la 1a vez que el cierre cruce por encima de la banda de Bollinger, se cierre solo una operación y la segunda vez que suceda que el precio cruze por encima de la banda superior de Bollinger se cierre solo una operación, y así susesivamente. ¿He entendido bien?

En el código veo algo raro. Veo que para abrir la operación le pasas el parámetro numeromagico, pero para cerrar la operación no le pasas el parámetro numeromagico. Encuentro lógico que el programa entienda que si no le indicas con cuantos lotes cerrar, sobreentienda que quieres cerrar con todos los lotes. Ojo, te digo que no tengo ni idea de MetaTrader.

Veo que pones:
compra = OrderSend(Symbol(),OP_BUY,lote,Ask,3,0,0,NULL,numeromagico,0,Red);
cerrar = OrderClose(OrderTicket(),lote,Bid,3,Black);

En "compra" le pasas numeromagico y en "cerrar" no les pasas numeromagico.
No sé si debería ser cerrar asÍ:
cerrar = OrderClose(OrderTicket(),lote,Bid,3,0,0,NULL,numeromagico,0,Black);

Tal vez lo que he escrito es un disparate porque como te digo no tengo ni idea de MetaTrader. Lo que escribo es solo un palo de ciego.

En resumen, creo que lo que pasa es que indicas el número de lotes con que abrir una operación pero no indicas el número de lotes con que cerrar una operación. Y, entonces, al no indicar el número de lotes que quieres cerrar, el sistema sobreentiende que quieres cerrar todos los lotes. Solución: indicarle el número de lotes con que quieres cerrar. ¿Sabes cómo? Yo no lo sé, que alguien que sepa MetaTrader te lo diga.

Espero que te haya dado luz aunque mi aporte no sea del todo acertado.
Ejem, ejem, ... ¿y los compañeros que sí saben de MetaTrader, no podrían echar una mano a Luirmi? (y de paso aprendo yo un poco de MetaTrader).



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12793
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Gestionar operaciones por separado

Mensaje por X-Trader »

Pues aunque no te lo creas Rafa7, esa es justamente la solución :D.

Luirmi, ¿has pensado en utilizar diferente Magic Numbers para cada orden nueva que abras?

Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
INtrader
Mensajes: 419
Registrado: 05 Nov 2009 13:54
Contactar:

Re: Gestionar operaciones por separado

Mensaje por INtrader »

Hola Luirmi,

El problema creo que lo tienes en la condición de cierre de la operación, por cierto he compilado tu programa y no funciona tal cual lo presentas, incluso falta definir un par de variables :? .

Veamos, tu has puesto:

if (Close[1]>Nbollsup1&&precioactual>precioentrada){
int cerrar;
cerrar = OrderClose(OrderTicket(),lote,Bid,3,Black);
return;

Y esto lo repites con todas las ordenes abiertas existentes. Al ejecutarlo tal cual me cierra todas las ordenes nada más abrirlas...

He cambiado el if(Close... por if (Close[1]>Nbollsup1&& OrderProfit() > obj){ .
Nota: he añadido también un parametro obj para definir un objetivo en cada trade.


Y ahora genera trades tan bonitos como este:
bollinger.JPG
I have not failed. I've just found 10,000 ways that won't work - Thomas A. Edison
Sigueme en Twitter: @INtrader_ :smt006
luirmi
Mensajes: 7
Registrado: 10 Ago 2016 22:07

Re: Gestionar operaciones por separado

Mensaje por luirmi »

Muchas gracias a los 3 :D
Rafa7, tienes razon en lo del número mágico, lo subí así porque estuve haciendo varias pruebas y no me di cuenta, tengo que poner eso bien :) . La variable lote está definida al principio del código, tiene un valor de 0.08

x-trader, si que he pensado en asignar un nuevo número mágico a cada nueva operación pero no sé como hacerlo y después hacer que me seleccione el que tengo que usar para cerrar la operación que quiero, esa creo que es la solución yo también, solamente que no sé como hacerlo :?

INtrader, también tienes razón, está sin definir la variable stop1 y minima2 que no se usa para nada. He compilado cambiando la linea que me decias y no me cierra ninguna operacion

Código: Seleccionar todo

int alerta = 0;
bool velanueva = False; // Variable que nos detecta la vela
extern int numeromagico = 6;
extern int periodo = 20;
extern int desviacion = 2;
extern double lote = 0.08;
extern double stop1 = 0;
extern double obj = 2000;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
    nuevabarra ();
   int totalordenes = OrdersTotal();
         for (int i=0; i <= (totalordenes); i++){
        
   //Seleccionamos la orden del mercado
   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==TRUE){
   if (OrderSymbol()==Symbol() && OrderMagicNumber()==numeromagico){   
   double Nbollsup1 = NormalizeDouble (iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_UPPER,1),0); 
        double precioentrada = OrderOpenPrice();
        double precioactual = MarketInfo(Symbol(),MODE_ASK);
      
               if ((Close[1]>Nbollsup1)&&(OrderProfit() > obj)){
                      int cerrar;
                        cerrar = OrderClose(numeromagico,lote,Bid,3,Black);
                        return;
           }    
        }
     }
  }
  
//---
    if (velanueva == True){
   double bollsup1 = iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_UPPER,1);
   double bollinf1 = iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_LOWER,1);
   double mmbb1 = iMA (Symbol(),0,periodo,0,MODE_EMA,PRICE_CLOSE,1);
 
 
   double bollsup2 = iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_UPPER,2);
   double bollinf2 = iBands(Symbol(),0,periodo,desviacion,0,PRICE_CLOSE,MODE_LOWER,2);
   double mmbb2 = iMA (Symbol(),0,periodo,0,MODE_EMA,PRICE_CLOSE,2);        
         } 
           
         if (Close[1] > bollinf1 && Open[1] < bollinf1 && (Close[1]>Low[2]-stop1) ){
            int compra;
              compra = OrderSend(Symbol(),OP_BUY,lote,Ask,3,0,0,NULL,numeromagico,0,Red);
         return;
         }
   }
  
//+------------------------------------------------------------------+
// Funcion encargada de cambiar la variable nuevavela
void nuevabarra(){
static datetime nuevotime = 0; //Detectar nuevo tiempo
velanueva = False; // 0 - misma vela, 1 - vela nueva
if (nuevotime != Time[0]){
nuevotime = Time[0];
velanueva = True;
  }


Disculpad que no haya subido del todo bien el código, estuve probando varias posibilidades y creía que subía el correcto


Yo creo que el numero mágico es la clave, poner un número mágico a cada nuevo buy, y que despues seleccione el numero mágico correspondiente para cerrar cuando toca. Pero no sé muy bien como programar eso.

Muchas gracias a los 3

Avatar de Usuario
INtrader
Mensajes: 419
Registrado: 05 Nov 2009 13:54
Contactar:

Re: Gestionar operaciones por separado

Mensaje por INtrader »

Hola Luirmi,

El NM te va a ayudar poco y te va a dar muchos quebraderos de cabeza si pretendes utilizarlo como imagino.

Prueba con un obj de 10 y vas variando desde ahí. Yo he probado con EURUSD de 5 min y ha funcionado bastante bien.

Ya nos contarás.
I have not failed. I've just found 10,000 ways that won't work - Thomas A. Edison
Sigueme en Twitter: @INtrader_ :smt006
luirmi
Mensajes: 7
Registrado: 10 Ago 2016 22:07

Re: Gestionar operaciones por separado

Mensaje por luirmi »

INtrader escribió:Hola Luirmi,

El NM te va a ayudar poco y te va a dar muchos quebraderos de cabeza si pretendes utilizarlo como imagino.

Prueba con un obj de 10 y vas variando desde ahí. Yo he probado con EURUSD de 5 min y ha funcionado bastante bien.

Ya nos contarás.
Hoy lo he estado probando de la manera que me recomendaste y en principio hace exactamente lo que buscaba.
Muchisimas gracias
Avatar de Usuario
INtrader
Mensajes: 419
Registrado: 05 Nov 2009 13:54
Contactar:

Re: Gestionar operaciones por separado

Mensaje por INtrader »



Enviado desde mi PLK-L01 mediante Tapatalk
I have not failed. I've just found 10,000 ways that won't work - Thomas A. Edison
Sigueme en Twitter: @INtrader_ :smt006
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Metatrader 4”