El Trailingstop EA no funciona - página 3

 
FMIC: Un consejo; no utilice "Ask" o "Bid" - utilice "OrderClosePrice()" en su lugar. Es un valor en tiempo real independientemente de que sea una orden de compra o de venta.
No es tiempo real.
  1. Con Ask y Bid debe RefreshRates() después de retrasos, es decir, entre varias llamadas al servidor, después de Sleep o de un cálculo largo.
  2. Con OrderClosePrice, se actualiza sólo con un OrderSelect. Por lo tanto, después de Sleep o de un cálculo largo (o de mantener una orden seleccionada entre llamadas OnTick,) debe volver a seleccionar.
    OrderSelect(OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice
 
WHRoeder:
No en tiempo real.
  1. Con Ask y Bid debe RefreshRates() después de retrasos, es decir, entre varias llamadas al servidor, después de Sleep o de un cálculo largo.
  2. Con OrderClosePrice, se actualiza sólo con un OrderSelect. Por lo tanto, después de Sleep o de un cálculo largo (o de mantener una orden seleccionada entre llamadas OnTick,) debe volver a seleccionar.

Gracias por la información. No sabía que "OrderClosePrice()" se almacenaba en el buffer. Así que supongo que ni "OrderClosePrice()" ni el "Ask"/"Bid" son la solución ideal en tiempo real.

Sin embargo, ¿está usted de acuerdo en que "OrderClosePrice()" es una solución global mejor que el uso de "Ask"/"Bid" después de que se haga el "OrderSelect()"?

Y para una solución en tiempo real, si es que se necesita, entonces supongo que podemos recurrir a las alternativas:

  • Reseleccionando la orden con "OrderSelect()" (EDIT: se me olvidó listar este en el post inicial, aunque lo señalaste)
  • "RefreshRate()" con "Ask"/"Bid"
  • "MarketInfo()" con "MODE_ASK"/"MODE_BID" (antiguo estilo MQL4)
  • "SymbolInfoDouble()" con "SYMBOL_ASK"/"SYMBOL_BID" (nuevo estilo MQL4+ y MQL5)
  • "SymbolInfoTick()" (que ya utilizo en la mayoría de mis EA's)
 
FMIC: Sin embargo, ¿está usted de acuerdo en que "OrderClosePrice()" es una solución global mejor que el uso de "Ask"/"Bid" después de que se haga el "OrderSelect()"?
absolutamente.
 

¿Por qué intentas inventar la rueda otra vez?

Mire aquí - encontrará todo lo que necesita.

Si no, empieza a modificar su código fuente.

 

Gracias por la ayuda de todos hasta ahora. Creo que ya he resuelto el problema del error 130, pero hay algo seriamente erróneo en mi función OrderSelect, que es muy probable que sea la razón por la que sólo a veces se modifican algunas de las órdenes. A continuación hay una lista de las cosas que imprimí. El OrderTicket # es completamente erróneo. Ese número de ticket pertenece a una operación que tengo abierta para el EURAUD. Aunque no incluí todos los resultados, en realidad hay múltiples pares en los que los números de OrderTicket no se corresponden con el par en la terminal de operaciones.

¿Podría alguien echar un vistazo y decirme qué es lo que falla en OrderSelect? Gracias

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 Creo que el ticket debería imprimir el mismo valor que OrdersTotal, por lo que parece que mi contador no funciona.

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = true

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrdersTotal = 11

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357

extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   Print("OrdersTotal = ",OrdersTotal());
   Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
   Print("ticket = ",ticket);                     
   Print("OrderTicket = ",OrderTicket());                     
   Print("Selectbyticket = ",SELECT_BY_TICKET);                     
   Print("Selectbypos = ",SELECT_BY_POS);                     
                        
   {for(int i=OrdersTotal()-1; i>=0; i--){ //I added more curly brackets{}
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;{
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ //For now, I have changed back to Bid and Ask and will include OrderClosePrice() later on.
                     if(TrailingStop*Pip<Bid-(TrailingStop*Pip)){ //I have added TrailingStop*Pip before the '<'
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) //I removed the !
                        return(0); //I replaced the Getlasterrror with a return value
                        RefreshRates();
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(TrailingStop*Pip>Ask+(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        return(0);
                        RefreshRates();
                       }
                    }
                }  
            }
         }
      } 
   }
}  
  return(0);
}
//+------------------------------------------------------------------+



 

Hola a todos. Gracias por toda la ayuda. He encontrado el error y los problemas se han resuelto. Como no utilizo un Stoploss, el valor de OrderStopLoss() es siempre 0. Esto no es un problema al modificar la orden de compra porque 0 siempre es menor que Bid-TrailingStop*Pip. Pero con la orden de venta 0 nunca puede ser mayor que Ask+Trailingstop*Pip. Así que tuve que añadir el or(|| OrderStopLoss()) a esta línea:

if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){ //Added OrderStopLoss()==0
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
 
Trader3000 Ese número de ticket pertenece a una operación que tengo abierta para el EURAUD.
No se filtra en el bucle OrderSelect. Symbol no es igual a Ordersymbol cuando se añade otra divisa a otro gráfico independiente .- Foro MQL4
 
WHRoeder:
Trader3000: Ese número de ticket pertenece a una operación que tengo abierta para el EURAUD.
No se filtra en el bucle OrderSelect. Symbol no es igual a Ordersymbol cuando se añade otra divisa a otro gráfico independiente . - Foro MQL4

Muchas gracias por la ayuda. Sí, definitivamente hay un problema con OrderSelect porque sólo funciona en algunos gráficos. El otro problema es que no puedo incluir un MagicNumber porque las operaciones se colocan manualmente. Utilicé la parte del código que creo que es relevante, pero no puedo conseguir que compile. Muestra este error:

'MySelect' - la función sólo puede declararse en el ámbito global Trailing_v26.mq4 31 13

y la línea 31 es esta:

bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){

Aquí está el EA completo:

#property strict;
extern int TrailingStart=10;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
           
    bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
    if (!OrderSelect(iWhat, eSelect, ePool))     return (false);
    if (OrderSymbol()      != _Symbol)           return (false);
    if (ePool != MODE_HISTORY)                   return (true);
    return(OrderType() <= OP_SELL);
}
    for(int i = OrdersTotal()-1; i >= 0; i--)
    if (MySelect(i, SELECT_BY_POS)){

    for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--)
    if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
        int nextTkt = OrderTicket();
     
              if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }     
                     }  
                  }     
               }
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }
                     }
                  }  
               }
            
         
         
  return(0);
}
//+------------------------------------------------------------------+



 
Trader3000:

Sí, definitivamente hay un problema con OrderSelect porque sólo funciona en algunos gráficos. El otro problema es que no puedo incluir un MagicNumber porque las operaciones se colocan manualmente. He utilizado la parte del código que creo que es relevante, pero no puedo conseguir que compile.

¡Te di un código perfectamente bueno en el que basarte, que soluciona tus problemas e incluso los enumeré antes de eso, sin embargo, eliges ignorarlo y seguir luchando preguntando por qué tu código no hace lo que quieres!

¿Por qué? ¿Quieres que tu código no funcione? ¡Usa el ejemplo y pruébalo tú mismo!

 
Cree que puede cortar y pegar y que no tiene que aprender a codificar. Ni siquiera puede arreglar este simple error sin preguntar:
'MySelect' - la función sólo puede declararse en el ámbito global Trailing_v26.mq4 31 13