El Trailingstop EA no funciona - página 4

 
WHRoeder:
Cree que puede cortar y pegar y 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


Realmente aprecio la ayuda que tú y todos los demás estáis proporcionando. He intentado todo en los últimos días para conseguir que se compile y me disculpo por no haber preguntado. La mayoría de vosotros habéis sugerido que deje de usar mi propio código y use el de otros, pero no voy a aprender si no entiendo lo que estoy haciendo mal. A mí me parece que mi código es correcto. Le pido que cuente las órdenes por posición y que seleccione sólo las que cumplen mis criterios y que luego modifique esa operación concreta. Hasta ahora, después de 4 páginas nadie me ha señalado qué línea de mi código está rota. A menos que primero vea y entienda lo que estoy haciendo mal, no me servirá de nada aprender usando el código de otra persona. Mi objetivo ahora no es tener un EA de Trailingstop que funcione, porque hay muchos por ahí, sino que yo aprenda a codificar, para poder seguir adelante. De hecho, mi código era casi idéntico al código que Jimdandy publicó en su Tutorial de Youtube sobre Trailingstops. Como es prácticamente idéntico al suyo, copié el código casi al pie de la letra (excepto que quiero operar manualmente), pero su código sólo funciona a veces también.

He imprimido algunas cosas. Este comercio es casi 300 puntos más allá del punto donde especifiqué que el Trailingstop entra en acción(que era 150 puntos):

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderModify = false

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Ask = 1.45926

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbypos = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbyticket = 1

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: ticket = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSelect = true

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrdersTotal = 16

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSymbol = EURUSD

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828

2016.04.22 00:17:58.934 Trailing_v33 EURAUD,M15: OrderModify = false

Este EA sólo está colocado en el EURAUD. Como puede ver hay 16 órdenes abiertas en otros 9 gráficos. El número de ticket seleccionado para este par es completamente erróneo y el OrderSymbol es completamente erróneo. Ambos son para una orden abierta en el EURUSD. Basado en lo anterior, mi bucle for seleccionó la posición 0 en este caso, mientras que el EURAUD que debía seleccionar estaba en la posición 14 (15-1). ¿Por qué? Le dije que ignorara esto.

En el video mencionado anteriormente Jim realmente se mete en este problema, y dijo que utiliza el siguiente código para superar mi problema, sin embargo, este es un contador para enviar correctamente las órdenes y no una función para filtrar las órdenes. Traté de usarlo como un filtro, pero no tuvo éxito.

int OpenOrdersThisPair(string pair){
   int total=0;
      for(int s= OrdersTotal()-1; s>= 0; s--){
         OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
           if(OrderSymbol()==pair) total++;
       }
   return(total);  
}

Mi código ahora se ve así. ¿Podría alguien criticar mi código para que pueda aprender de esto y decirme por qué no funciona en múltiples gráficos. Sé que no puede ser tan malo porque en realidad funciona perfectamente a veces.Gracias

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=10;
extern string Label_TrailingStop="Pips trailing behind";
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10,Pip=Point*10;
int TS=TrailingStart-TrailingStop;
bool UseTrailingStop=true,UseAutotrading=true;
//+------------------------------------------------------------------+
//|  Expert initialization function                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
    MessageBox("Please note: Your inputs cannot be less than the minimum levels required"+
            "\nby your broker. Please reload the EA and either increase the value of the"+
            "\nTrailingStart and/or decrease the value of the TrailingStop so that "+
            "\nTrailingStart-TrailingStop >= "+StringConcatenate(stoplevel)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|    Expert deinitialization function                              |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|   Expert start function                                          |
//+------------------------------------------------------------------+
int start(){
   if(UseTrailingStop) Trailing(); 
   if(UseAutotrading) Autotrading();  
   return(0);
}
//+------------------------------------------------------------------+
void Trailing(){
for(int b=OrdersTotal()-1; b>=0; b--){
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_BUY)
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip))
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip))
                        OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue);
   }     
   for(int s=OrdersTotal()-1; s>=0; s--){
     if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_SELL)
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip))
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0)
                        OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red);
   }
}
void Autotrading(){
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
}


 
Trader3000:

Hasta ahora, después de 4 páginas nadie ha señalado qué línea de mi código está rota.

No es cierto. Hemos descrito tus errores y te hemos ofrecido soluciones para ellos de muchas formas y alternativas. Sin embargo, las ignoras y sigues haciéndolo a TU MANERA. No sólo eso, sino que ahora incluso lo has empeorado añadiendo más errores.

Cuando un pintor aprende a pintar, lo hace copiando primero las técnicas de otros que lo han dominado. Sólo cuando se siente cómodo con estas técnicas, empieza a crear su PROPIA FORMA de pintar.

He aquí una breve lista de "mis críticas":

  1. Utilice los corchetes (paréntesis "rizados"). No trate de escatimar y ahorrar en ellos. Hasta que su código sea totalmente funcional y esté depurado, añádalos aunque sea para una sola línea contenida en el bloque. Colóquelos también en una línea separada. No te preocupes si te sobra espacio en blanco. Siempre puedes volver atrás y limpiarlo, pero al principio, quieres asegurarte de que todo está dentro de su bloque de código correcto y los corchetes y paréntesis están equilibrados. Encadenar varias sentencias "if" en una cadencia es una receta para el desastre ya que es muy difícil de depurar, especialmente con un compilador quisquilloso como este.
  2. Tu código original tenía un solo bucle que ahora has convertido en dos sin ninguna razón aparente, excepto para hacer tu código aún más lento y repetir los lugares que tienes que arreglar cuando hay bugs.
  3. Utiliza variables para almacenar los resultados de las expresiones. Repites las mismas expresiones varias veces, haciendo tu código no sólo más lento, sino más propenso a errores y más difícil de leer y arreglar porque tienes que cambiarlas en varios lugares.

Hay más cosas que podría enumerar, pero arregla estas al menos, ¡de una vez por todas!

La codificación es como cualquier otro lenguaje. Sí, puedes encadenar palabras, pero eso no te convierte en poeta. En la codificación también hay que tener ritmo y estructura, para que sea legible y funcional.

 
FMIC:

Aquí está una breve lista de "mi crítica":

En realidad tenía corchetes para todas mis sentencias 'if' inicialmente según el código que publiqué aquí antes, pero como ese código no funcionaba probé otras cosas, que incluían copiar el código que pegué en mi post anterior. Como mencioné, este código ni siquiera es mío, pero tampoco funciona en todos los pares. Sin embargo, volveré a reemplazar los paréntesis y seguiré los otros consejos. Mientras tanto, aprendí que OrderSelect imprimirá el símbolo de la primera orden en la terminal y no en la que está el EA, así que en realidad no estaba mal.

EDIT: Gracias por la sugerencia #3!!!!!!! Creo que este era el problema, porque la Orden debe ser seleccionada primero por el Símbolo y LUEGO el valor debe ser almacenado. Así que moví la variable a debajo de esas funciones como abajo, y parece que ahora funciona (pero se requieren más pruebas antes de saber con certeza

int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10,TSTP=TrailingStart*Pip,Trail=TrailingStop*Pip,SL=StopLoss*Pip;               
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail,OrderTakeProfit(),Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
 
Trader3000:

En realidad tenía corchetes para todas mis sentencias 'if' inicialmente según el código que publiqué aquí antes, pero como ese código no funcionó probé otras cosas, que incluían copiar el código que pegué en mi post anterior. Como mencioné, este código ni siquiera es mío, pero tampoco funciona en todos los pares. Sin embargo, volveré a reemplazar los paréntesis y seguiré los otros consejos. Mientras tanto, aprendí que OrderSelect imprimirá el símbolo de la primera orden en la terminal y no en la que está el EA, así que en realidad no estaba mal.

EDIT: Gracias por la sugerencia #3!!!!!!! Creo que este era el problema, porque la Orden debe ser seleccionada primero por el Símbolo y LUEGO el valor debe ser almacenado. Así que moví la variable a debajo de esas funciones como abajo, y parece que ahora funciona (pero se requieren más pruebas antes de saber con certeza

Echando un vistazo a su último código, tengo que decir esto - ¡Me rindo ! ¡(Te niegas a seguir)!
 
FMIC: Echando un vistazo a tu último código, tengo que decir lo siguiente: ¡Me rindo ! ¡(Te niegas a seguir)!
Ahora quizás entiendas mi "dura crítica " cuando hacen perder el tiempo a todo el mundo. Aunque entiendo que "cosas sencillas " les parezca aceptable hacer perder el tiempo a todo el mundo, yo no.

Trader3000: Creo que este era el problema,...
int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip, SL=StopLoss*Pip;
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail, OrderTakeProfit(), Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
Tu problema es que no piensas.
int start(){
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()!= Symbol()) continue;
// Everything below is executed if NO order is selected or a selected order is symbol
      double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip,SL=StopLoss*Pip;
      if(OrderType()==OP_BUY)
      && Bid-OrderOpenPrice()>TSTP)
      && OrderStopLoss()<Bid-Trail){
         if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Trail, OrderTakeProfit(), Orange))
            Print("Error Buy TrailingStop: ",GetLastError());
      }
   :
 
WHRoeder:
Ahora quizás entiendas mi "dura crítica " cuando hacen perder el tiempo a todo el mundo. Si bien entiendo "cosas simples " que piensan que es aceptable para perder el tiempo de todos, no lo hago.

Sí. Desgraciadamente, ¡parece que tienes razón!

 

Gracias por las respuestas.Así que, he cambiado el código de nuevo a una versión anterior como por debajo. Con él como este parece estar trabajando perfectamente en todos los pares donde el stoplevel es de 50 puntos, pero no en los pares donde el stoplevel es más alto por ejemplo, EURAUD incluso si las variables externas es mayor que el stoplevel. Así que esto es extraño

extern int TrailingStart=15;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
           
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
   int ticket=0,buy_ticket=0,sell_ticket=0;  
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol()){
      ticket++;
      if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
      if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
      }
            if(OrderType()==OP_BUY){
               if(OrderSelect(buy_ticket,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(OrderType()==OP_SELL){
               if(OrderSelect(sell_ticket,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);
}
//+------------------------------------------------------------------+
 

También he encontrado otro EA que tiene un código muy similar al mío y he comparado el código. He destacado las principales diferencias.

1. Incrementos en lugar de decrementos

2. Multiplica todo por Punto en lugar de Punto*10

3. Suma el Trailingstop y el Trailingstep juntos y luego resta uno y modifica la orden con el Trailingstep. Si entiendo esto correctamente, el Trailingstart se activará después de un movimiento de 15 pips (150 puntos). En mi EA, el precio se retrasará 5 pips y se detendrá si el precio cae de nuevo y alcanza este nivel de 5 pips. En su EA, también se activará después de 15 pips, pero la cantidad de pips que se retrasa es de 19 (15+5-1), por lo que el precio tiene que caer 19 pips para detenerse. Como ejemplo: OrderOpenPrice es 1.50000. El precio sube 150 puntos hasta 1.50150, lo que activa el Trailingstop. Si el precio vuelve a caer hasta 1.50100, se detendrá con un beneficio de 5 pips. En su EA, el Trailingstop también se activa en 1,50150, pero el rastro está en 1,49960, lo que creo que provocaráel error 130, ya que el stop está demasiado cerca del stoplevel. ¿O estoy entendiendo mal?

¿Podría ser mi problema con uno o más de estos?

//+------------------------------------------------------------------+
//|                                                   e-Trailing.mq4 |
//|                                           Êèì Èãîðü Â. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 12.09.2005 Àâòîìàòè÷åñêèé Trailing Stop âñåõ îòêðûòûõ ïîçèöèé    |
//|            Âåøàòü òîëüêî íà îäèí ãðàôèê                          |
//+------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ------------------------------------------
extern bool   ProfitTrailing = True;  // Òðàëèòü òîëüêî ïðîôèò
extern int    TrailingStop   = 15;     // Ôèêñèðîâàííûé ðàçìåð òðàëà
extern int    TrailingStep   = 5;     // Øàã òðàëà
extern bool   UseSound       = True;  // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound  = "expert.wav";  // Íàèìåíîâàíèå çâóêîâîãî ôàéëà

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      TrailingPositions();
    }
  }
}

//+------------------------------------------------------------------+
//| Ñîïðîâîæäåíèå ïîçèöèè ïðîñòûì òðàëîì                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  double pBid, pAsk, pp;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) {
      if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) {
        ModifyStopLoss(pBid-TrailingStop*pp);
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) {
      if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
        ModifyStopLoss(pAsk+TrailingStop*pp);
        return;
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Ïåðåíîñ óðîâíÿ StopLoss                                          |
//| Ïàðàìåòðû:                                                       |
//|   ldStopLoss - óðîâåíü StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+
 
Trader3000:

También encontré otro EA que tiene un código muy similar al mío y comparé el código.

¡Vamos a ver si entiendo esta lógica tuya! ¡Usted está dispuesto a encontrar otro EA de alguien más de quién sabe dónde y está dispuesto a incorporar ese código en el suyo, PERO NO ESTÁ DISPUESTO a tomar el código que fue escrito específicamente para ayudarle y corregir sus problemas!

¡WOW! ¡Qué lógico de tu parte! ¿Dónde está SPOCK cuando se le necesita?

¡SPOCK, que descanses en paz! ¡Todos te echamos de menos!

 
FMIC:

¡Vamos a ver si entiendo esta lógica tuya! ¡¡¡Estás dispuesto a encontrar otro EA de alguien más de quién sabe dónde y estás dispuesto a incorporar ese código en el tuyo, PERO NO ESTÁS DISPUESTO a tomar el código que fue escrito específicamente para ayudarte y corregir tus problemas!!!

¡WOW! ¡Qué lógico de tu parte! ¿Dónde está SPOCK cuando se le necesita?

¡SPOCK, que descanses en paz! ¡Todos te echamos de menos!

Finalmente lo resolví, así que gracias a todos por la ayuda (y la crítica). Después de volver al código que tú y Mike publicaron en la primera página, vi mi error. Probablemente lo pasé por alto porque era muy sutil, pero sobre todo porque no entendí bien la lógica del código. El problema fue que pensé que la cantidad de pips para el TrailingStop era la cantidad de pips que estaba arrastrando. Pero el número de pips que se arrastra detrás es en realidad TrailingStart-TrailingStop. Así que mis ajustes estaban por debajo del stoplevel para pares como el gbpjpy porque introduje 15 y 5. Ya que 5 está por debajo del stoplevel de 8. Simplemente aumentando el TrailingStop ahora funciona en todos los pares. Gracias!!!
Razón de la queja: