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

 
kwng111:


Lo siento kwng su publicación me parece que no es la solución para madmax3

No tienes que modificar las operaciones en una función( ) llamada void CloseAll()
También tienes que seleccionar allí OrderSymbol ( ) y OrderMagicNumber( )

y en esta parte del programa

        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

las operaciones pendientes se modificarán de todos modos

 

Aquí está el código revisado para todo el EA:

//+------------------------------------------------------------------+
//|                                                  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; 
        
    
}

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


   return(0);
  }
  
  
  
  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.

La función CloseAll() está ahí para cerrar las operaciones en un momento determinado si se prolongan.

Esta parte del código es la parte revisada de lo que estoy tratando de averiguar:
(como puedes ver el MagicNumber y el Symbol están ahí, sin embargo sólo las órdenes pendientes están siendo modificadas)

     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}
 
deVries:
        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
int total=OrdersTotal();
 if(total>1)

Te han dicho que el select no funcionará ayer. Y que debes probar los códigos de retorno y sobre el total

Si no te vas a molestar en leer los posts y corregir tu código, no nos vamos a molestar en intentar ayudarte.

 
WHRoeder:

Ayer te dijeron que el select no funcionará. Y que debes probar los códigos de retorno y sobre el total

Si no te vas a molestar en leer los posts y corregir tu código, no nos vamos a molestar en intentar ayudarte.


He hecho las dos cosas, te estás refiriendo a la persona equivocada, creo. Yo soy el autor original, no deVries, y he cambiado el código a este (como se publicó antes):

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

El problema ahora es que modifica las órdenes pendientes mientras que yo quiero que sólo modifique las órdenes abiertas y sólo cuando dos órdenes abiertas del mismo símbolo estén abiertas y ejecutándose al mismo tiempo. He probado diferentes combinaciones de números y números de OrderSelect pero sigo perplejo con esto.

 
madmax3:


Yo he hecho las dos cosas, pero creo que te refieres a la persona equivocada. Yo soy el autor original, no deVries, y he cambiado el código a esto (como se publicó antes):

El problema ahora es que modifica las órdenes pendientes mientras que yo quiero que sólo modifique las órdenes abiertas y sólo cuando dos órdenes abiertas del mismo símbolo estén abiertas y ejecutándose al mismo tiempo. He probado diferentes combinaciones de números y números de OrderSelect pero todavía estoy perplejo en esto.

Así que necesitas hacer un bucle a través de tus órdenes abiertas, comprobar el Symbol y el MagicNumber como tienes arriba... pero también necesitas comprobar si OrderType() <=OP_SELL... contar las órdenes que coinciden, si son 2... entonces haz un bucle de nuevo y OrderModify().

La única manera de aprender es leer la documentación de cada función y entender cómo funcionan. . . por ejemplo OrderType( )

 

He probado una variación de códigos diferentes pero sigo sin conseguir que funcione exactamente. Modifica una de las operaciones abiertas cuando hay dos abiertas y sigue modificándola, sólo necesito que se modifique una vez y que se modifiquen las dos operaciones.

     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_SELL)
    
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    
   if (OrderSelect(iPos, SELECT_BY_POS))
    if (OrderType() <= OP_BUY)
      if (!OrderSelect(iPos, SELECT_BY_POS))
      {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
     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_SELL)
    && (OrderType() <=OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    
   if  (OrderSelect(iPos-1, SELECT_BY_POS))
    {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);



   return(0);
  }}

¿Alguna sugerencia sobre lo que debo hacer? He leído la documentación, por cierto.

 
¿Cuál es la diferencia antes de modificar la orden y después de modificarla? ¿Qué cambia?
 

Primero se establecen dos órdenes, luego una de ellas (una venta en este caso cuando probé la fecha específica) se ejecuta. Más tarde en el día la segunda orden (que todavía está allí) se ejecuta, y esta operación es una compra.
La venta es la orden 1 y la compra es la orden 2. La compra (orden 2) tiene su TakeProfit modificado por 16,3 pips (no estoy seguro de por qué no es la adición de 20 pips), a continuación, el TakeProfit se incrementa en 0,2 pips en el mismo minuto, y esto sigue sucediendo, el TakeProfit se modifica continuamente durante todo el día, a veces aumenta, a veces disminuye, no estoy seguro de por qué esto está sucediendo.

Edición: Creo que los 16,3 pips y los cambios posteriores también están influenciados por el spread?

 
Bien, ¿podemos volver al principio? Sé que está tratando de modificar dos órdenes... pero ¿qué es lo que está tratando de hacer exactamente?
 
madmax3 2012.03.09 15:06
WHRoeder:

Te han dicho que el select no funcionará ayer. Y que debes probar los códigos de retorno y sobre el total

Si no te vas a molestar en leer los post y corregir tu código, no nos vamos a molestar en intentar ayudarte.


He hecho las dos cosas, te estás refiriendo a la persona equivocada me parece

Me refería a tu post directamente anterior

madmax3 2012.03.09 14:52
Aquí está el código revisado para todo el EA:
   total=OrdersTotal();
   if(total<1) 
Que todavía muestra los problemas que he dicho.