Se necesita un código simple para el EA (modificar dos órdenes abiertas) - página 3

 

Básicamente pongo dos órdenes pendientes a una hora determinada, concretamente a las 23:00 GMT+2 creo. Una de las órdenes pendientes como stop de venta y la otra como stop de compra, ambas órdenes están a igual distancia de la apertura de la vela de las 23:00, en este caso 14 pips. Ambas tienen un TakeProfit de 28 pips (en este caso) y un StopLoss de 55 pips.

Ahora cuando ambas órdenes se cumplan (esencialmente subiendo y bajando 14 pips desde el precio de apertura en la vela de las 23:00 antes de que las órdenes expiren), quiero que ambas órdenes tengan sus take profits incrementados en, por ejemplo, 20 pips. Así que su nuevo take profit es de 58 pips en este caso. El stop loss, sin embargo, debe mantenerse igual en todo momento. Esencialmente lo que estoy tratando de hacer es una especie de cobertura.

Si se abren dos operaciones, es probable que el precio vaya en una dirección bastante, lo suficiente como para anular cualquier pérdida si se aumentan los take profits de ambas operaciones. Para obtener algún beneficio sólo se abriría una operación y alcanzaría el take profit o se abrirían las dos operaciones y alcanzarían el take profit sin ir muy lejos en una dirección.

Espero que esto esté claro, si no lo está aportaré una imagen que debería ser más clara.

 
WHRoeder:

Me refería a tu post directamente anterior

madmax3 2012.03.09 14:52
Aquí está el código revisado para todo el EA:
Que sigue mostrando los problemas que expuse.
Esa parte del código es para otra parte del EA creo, la parte que abre las órdenes pendientes, ¿tendría algún efecto en la parte que estoy tratando de arreglar? Lo siento, creo que he confundido partes del código sobre todo en el post original. Sin embargo, he hecho lo que has indicado en la parte del código para la que lo necesito específicamente.
 
madmax3:

Espero que esto esté claro, si no lo está proporcionaré una imagen que debería ser más clara.

Está claro, gracias.

Así que sólo quieres modificar estas órdenes una vez... entonces la respuesta es sencilla. Tienes que comprobar la barra de las 23:00 y determinar los TPs en los que las órdenes deberían haber sido abiertas. . . si las órdenes están en el mismo TP entonces necesitan ser modificadas, si no están en el mismo TP entonces ya han sido modificadas y no necesitan ser modificadas de nuevo. . . simple.

 
RaptorUK:

Está claro, gracias.

Así que sólo quiere modificar estas órdenes una vez... entonces la respuesta es sencilla. Tienes que comprobar la barra de las 23:00 y determinar los TPs en los que las órdenes deberían haber sido abiertas. . . si las órdenes están en el mismo TP entonces necesitan ser modificadas, si no están en el mismo TP entonces ya han sido modificadas y no necesitan ser modificadas de nuevo. . . simple.

Sin embargo, la modificación y la comprobación sólo deben ocurrir cuando hay dos operaciones abiertas, ¿cómo puedo hacer esto? ¿Debo añadir al código que ya tengo o empezar de nuevo?

Así que esencialmente, si hay dos operaciones (mismo símbolo y número mágico) el EA debe comprobar los beneficios de las operaciones abiertas en comparación con las órdenes pendientes existentes anteriormente (que ahora se ejecutan) y luego si son iguales, se debe cambiar, y una vez que los bucles que comprobar de nuevo y encontrar que no son los mismos y por lo tanto no se modificará más las operaciones?
 
madmax3:
1. 1. La modificación y la comprobación sólo deben ocurrir cuando hay dos operaciones abiertas, sin embargo, ¿cómo puedo hacer esto? ¿Debo añadir al código que ya tengo o empezar de nuevo?

2. Así que esencialmente, si hay dos operaciones (mismo símbolo y número mágico) el EA debería comprobar los beneficios de las operaciones abiertas en comparación con las órdenes pendientes existentes anteriormente (que ahora se ejecutan) y entonces si son iguales, debería modificarse, y una vez que haga un bucle comprobará de nuevo y encontrará que no son iguales y por lo tanto no modificará más las operaciones?

1. Haga un bucle a través de las órdenes abiertas, compruebe el símbolo, el número mágico, cuando tenga una coincidencia que no sea un tipo de orden pendiente incremente un contador... cuando termine de comprobar las órdenes si ha contado 2 entonces tiene 2 órdenes abiertas para el símbolo y el número mágico correctos... así que ahora puede modificarlas... vea 2.

2. No, no puedes ver el TP de las órdenes pendientes si se han activado y ya no están pendientes. El EA debe comprobar la barra de las 23:00 y calcular cuáles habrían sido los TP originales. . . luego compararlos con los TP de las 2 órdenes abiertas. . . . a partir de esta información se puede tomar la decisión de modificar o no modificar.

 
RaptorUK:

1. Haga un bucle a través de las órdenes abiertas, compruebe el símbolo, el número mágico, cuando tenga una coincidencia que no sea un tipo de orden pendiente incremente un contador... cuando termine de comprobar las órdenes si ha contado 2 entonces tiene 2 órdenes abiertas para el símbolo y el número mágico correctos... así que ahora puede modificarlas... vea 2.

2. No, no puedes ver el TP de las órdenes pendientes si se han activado y ya no están pendientes. El EA debería comprobar la barra de las 23:00 y calcular cuáles habrían sido los TP originales. . . luego compararlos con los TP de las 2 órdenes abiertas. . . . a partir de esta información se puede tomar la decisión de modificar o no modificar.

Ah ya veo, creo que esto es lo que he intentado hacer todo el tiempo. De momento se modifica una de las órdenes (concretamente la de compra que es la orden 2 en mis pruebas) pero se sigue modificando, ¿utilizo 'break' para que no se repita? También como hago para contar y modificar sólo las órdenes abiertas cuando y sólo hay dos de ellas abiertas? He intentado usar OrdersTotal() para esto pero no funciona, no creo que tenga que hacer dos piezas de código separadas para cada orden ¿verdad?
Sólo los números pares órdenes abiertas están siendo modificados y como he dicho que en repetidas ocasiones se modifican, he intentado varias combinaciones para OrderSelect (), pero todavía no puedo averiguarlo, como he dicho que soy un novato total en MQL y esta EA es muy casi hecho así que me gustaría que acaba de terminar. He leído estehttps://book.mql4.com/trading/ordermodify ¿tendría esto algo que ver con mi situación? Es para un stop loss pero lo necesito para un take profit esencialmente.

¿Qué estoy haciendo mal aquí?

     for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    && (OrderType() == OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    return(0);
    
  if (
        OrderSelect(iPos-1, SELECT_BY_POS-1)                    
    &&  OrderMagicNumber()  == MagicNumber                
    &&  OrderSymbol()       == "EURUSD"                
    && (OrderType() == OP_SELL)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
return(0);
  }

¿Cómo podría comprobar si el TP es el mismo que el de la vela de las 23:00? ¿Sería necesario como tal, ya que mientras se modifiquen las órdenes abiertas cuando estén 2 de ellas se conseguiría el mismo efecto? O es sólo para evitar que la orden se modifique continuamente y sí he revisado la documentación.

Gracias,

madmax3

 

Tu return(0) te está sacando de start() antes de que se modifique la 2ª orden.

Todo lo que estás haciendo es seleccionar la orden por posición, comprobando que tiene el número mágico correcto, comprobando que es el símbolo correcto y comprobando que es OP_BUY... entonces la modificas, ¿dónde estás determinando si ya ha sido modificada o no?

Su EA tiene que ser capaz de recuperarse de ser interrumpido ... si sus órdenes se colocan y MT4 se bloquea tiene que ser capaz de continuar desde donde lo dejó cuando se reinicia.

Por eso es necesario determinar si la orden ya ha sido modificada o necesita ser modificada... ¿cómo?

"He puesto dos órdenes pendientes a una hora determinada, concretamente a las 23:00 GMT+2 creo. Una de las órdenes pendientes como stop de venta y la otra como stop de compra, ambas órdenes están a igual distancia de la apertura de la vela de las 23:00, en este caso 14 pips. Ambas tienen un TakeProfit de 28 pips (en este caso) y un StopLoss de 55 pips".

Puede calcular donde estaba el TP original por referencia a la vela de las 23:00, compruebe la orden y vea si todavía se establece en el TP original, si es así entonces se puede modificar... si no es así entonces ya ha sido modificada así que no la modifique de nuevo.

Hay otras formas de registrar que la orden ha sido modificada, llevar un registro del número de ticket escribir la información en un archivo cuando ha sido modificada, cuando se va a modificar de nuevo abrir el archivo y comprobar el número de ticket, etc . Creo que la comprobación frente al TP original es mucho más sencilla.

 

Hasta ahora tengo esto,

//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int     MagicNumber = 20080122;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double  TakeProfit  = 28;
extern double  StopLoss    = 55;
extern double  Lots        = 0.1;
extern int     StartHour   = 2300;      // Open Trade time
extern bool    OpenBuy     = true;
extern bool    OpenSell    = true;
extern int     NumBuys     = 1;
extern int     NumSells    = 1;
extern int     Slippage    = 2;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
      if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); }
   int ct;
//-------------------------------------+
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
//-------------------------------------+

//-------------------------------------+
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
//-------------------------------------+

   ct = Hour() * 100 + Minute();
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(ct == StartHour && Close[1]>Open[1] && OpenBuy)
      //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0; cnt < NumBuys; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); 
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }

          
           else Print("Error opening BUY order : ",GetLastError()); 
           

         }
         return; 
        }
      // check for short position (SELL) possibility
      if(ct == StartHour && Close[1]<Open[1] && OpenSell)
      //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0; cnt < NumSells; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
           else Print("Error opening SELL order : ",GetLastError());
         } 
         return; 
        
    
}
//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
           }   }
           
}
//---------------------------------------------------------------   
 
     
     
  void CloseAll()
{
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber) continue;
         
      //
      //
      //
      //
      //
         
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
      {
         for(int c=0; c<3; c++)
         {
            RefreshRates();
            if (OrderType()==OP_BUY)
                  { double cp = Bid;}  
            else  {        cp = Ask;}
               
            OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow);
               int err=GetLastError();
               if(err==4 || err==136 || err==137 || err==138 || err==146)
               {
                  Sleep(5000); continue;
               }  
               break;                     
         }
         break;
      }
      }
      }
   
// the end.

El código de escritura de archivos como se incluye en lo anterior es,

//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
          	 FileClose(Handle); }   }
           
}
//---------------------------------------------------------------   

Sin embargo, estoy recibiendo estos errores,

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Versión 2: FileOpen - demasiados archivos abiertos

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Version 2: invalid handle -1 in FileWrite

¿Qué pasa con eso?

 

¿Por qué has elegido la más difícil de las dos opciones?

Cuando terminas de escribir en el archivo necesitas cerrarlo... si ya está abierto no necesitas abrirlo de nuevo.

//---------------------------------------------------------------

int Handle,                         // File descriptor
    Qnt_Symb;                           // Number of recorded symbols
string File_Name="check.csv";        // File name
   
Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening    File opened here, outside the loop
   

FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
   {       
   OrderSelect(iPos,SELECT_BY_POS);
   FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime   //  this is a string - Time  to  String
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime() )  //int     //  this is a string - Time  to  String
       
        ) ; //end file write

   FileClose(Handle);      //  why close the file inside the loop when it was opened outside the loop ?
   }   
}    //  what is this code inside of ?
           
}  // end of start
//--------------------------------------------------------------- 

Tu bucle for está mal... la última posición de la orden es 0 no 1

 
RaptorUK:

¿Por qué has elegido la más difícil de las dos opciones?

¿No es esta la forma de hacer la modificación y la comprobación mediante el archivo? ¿O tengo que combinar ambos códigos, el de la modificación (mi post anterior al último) y el del archivo (que es sólo para asegurarse de que no se producen más modificaciones)?
Razón de la queja: