Problema de los pedidos múltiples

 

Hola a todos,

Tengo un problema con mi código. Cuando una orden (de compra o de venta) se abre otras vienen en una fila.

Lo que estoy tratando de hacer es;

si la ultima orden es de venta entonces abrir una orden de compra cuando el precio este por encima de la orden Openprice mas algunos pips(ReturnDist).

si la ultima orden es de compra entonces abrir una orden de venta cuando el precio este por debajo del Openprice menos algunos pips.

¿Puede alguien ayudarme con esto?

Gracias de antemano

Luis

Archivos adjuntos:
 
luisneves:

Hola a todos,

Tengo un problema con mi código. Cuando una orden (de compra o de venta) se abre otras vienen en una fila.

Lo que estoy tratando de hacer es;

si la ultima orden es de venta entonces abrir una orden de compra cuando el precio este por encima de la orden Openprice mas algunos pips(ReturnDist).

si la ultima orden es de compra entonces abrir una orden de venta cuando el precio este por debajo del Openprice menos algunos pips.

¿Puede alguien ayudarme con esto?

Gracias de antemano

Luis

¿Cuál es tu plan para restringirlo?

Inicializas OpenOpposite con 1.

int    Ticket,total,OpenOpposite=1,UseSlippage,i;

En cada tick, llamas a OpenOppositeOrder()

   int start()
     {
      if (OrdersTotal()==0)GoToOpen();
       else GoToClose();      
      if(OpenOpposite>0)OpenOppositeOrder(); //<-- here 
      if(OrdersTotal()>0)OpPendingDel();
      
     }

No veo ninguna otra referencia a OpenOpposite.

El bucle for en OpenOppositeOrder no tiene ninguna restricción por lo que he visto hasta ahora... ¿debería?

¿En qué parte del código crees que está el error?

 

Hola Kronin,

Ante todo gracias por tu pronta respuesta.

Disculpa el desorden pero lo que he intentado es tener bloques de código independientes que funcionen.

Así que he limpiado la línea que has marcado y la parte superior que dice void OpenOpposite () y ahora vienen algunos errores como;

expresión en ámbito global no permitida,etc.

Si no te quito mucho tiempo ¿podrías ayudarme en esto?

Gracias

Luis



 
luisneves:

Hola Kronin,

Ante todo gracias por tu pronta respuesta.

Disculpa el desorden pero lo que he intentado es tener bloques de código independientes que funcionen.

Así que he limpiado la línea que has marcado y la parte superior que dice void OpenOpposite () y ahora vienen algunos errores como;

expresión en ámbito global no permitida,etc.

Si no te quito mucho tiempo ¿podrías ayudarme en esto?

Gracias

Luis

No he dicho que tengas que limpiar nada. Sólo quería saber, dónde intentas restringir que el EA abra más de una orden.

Prueba esto (no lo he probado):

Cambia la función de inicio por (Tal vez tengas que filtrar sólo las órdenes de mercado abiertas -> dependiendo de tu estrategia):

   int start()
     {
      if(OrdersTotal()==0){GoToOpen();OpenOpposite=0;} //<-- set OpenOpposite to 0 if no order is open (pending and market)
      else GoToClose();      
      if(OpenOpposite==0)OpenOppositeOrder();          //<-- only run OpenOpositeOrder, if OpenOpposite is 0.
      if(OrdersTotal()>0)OpPendingDel();      
     }

Añade un contador OpenOpposite a la función OpenOppositeOrder():

         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY  && Ask < (OrderOpenPrice()- ReturnDist*pt))
               {                
               Ticket = OrderSend(Symbol(), OP_SELL, mlots, SellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  OpenOpposite++;
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError());
                  }
               }
               
            if(Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt))
               {               
               Ticket = OrderSend(Symbol(), OP_BUY, mlots, BuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  OpenOpposite++;
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }

Esto debería resolver el problema de las órdenes múltiples abiertas en una fila. Restringe el EA a abrir más de una orden (opuesta).

 
luisneves:

Hola a todos,

Tengo un problema con mi código. Cuando una orden (de compra o de venta) se abre otros vienen en una fila.

¿Por qué necesita un segundo hilo sobre la misma pieza de código?

RaptorUK:

Mirando tu código me resulta muy difícil seguir lo que estás tratando de hacer, veo muy pocos comentarios para ayudarme, tu función start() no me muestra lo que estás tratando de hacer en cada tick, no tienes un diseño consistente de sangría.


De este hilo:https: //www.mql5.com/en/forum/142629 página 3

 
RaptorUK:

Mirando tu código me resulta muy difícil seguir lo que intentas hacer, veo muy pocos comentarios que me ayuden, tu función start() no me muestra lo que intentas hacer en cada tick, no tienes una disposición consistente de la sangría.

Estoy de acuerdo con eso. No he comprobado nada más, que el tema de las órdenes múltiples, porque el código no es fácil de leer. Parece que partes del código son copiadas y pegadas de otro código, escrito por alguien más. Mejor escribe tus propias funciones con tu propio estilo (consistente).

 
kronin:

No he dicho que tengas que limpiar nada. Sólo quería saber, donde tratas de restringir el EA de abrir más de una orden.

Prueba esto (no lo he probado):

Cambia la función de inicio a (Tal vez tengas que filtrar sólo las órdenes de mercado abiertas -> dependiendo de tu estrategia):

Añade un contador OpenOpposite a la función OpenOppositeOrder():

Esto debería resolver el problema de las órdenes múltiples abiertas en una fila. Restringe el EA a abrir más de una orden (opuesta).


Hola kronin,

Gracias por su pronta respuesta a mi problema. Lo que estoy tratando de conseguir es una condición para abrir órdenes como esta;

La primera apertura por medio de un indicador es una compra (podría ser una venta, por supuesto) y luego se abre una orden de compra, si el precio rebota hacia abajo a un nivel por debajo del precio abierto de la orden de compra, se abrirá una orden de venta, pero si el precio sube de nuevo no debería ocurrir una nueva compra abierta. En este caso, una nueva orden de compra sólo debería producirse cuando el precio rebote desde la orden de venta. Lo mismo si una orden de venta es la primera en ocurrir.
He intentado conseguirlo con el siguiente código adjunto pero no funciona. Aquí lo que funciona es que la primera ordenque se abre es de compra, luego y como es de esperar se abre una orden de venta, pero a partir de aquí no se abre ninguna otra orden...

Tengo estos dos bloques de código y parece que el primero está haciendo lo que se espera que haga; Abrir una orden de compra o venta si las condiciones definidas por el indicador están ahí. Una vez que se recibe un ticket de
orden entonces se realiza una modificación de la orden para enviar los límites de la misma.

Estoy usando BuyTicket y SellTicket en el código para evitar la apertura de múltiples órdenes pero parece que no es el método correcto...

// Buy Order Condition to Open

  if(Volume[0] > volume_previous + OpenDistance*pt && BuyTicket == 0)                       
          {//5  
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)
        {//6
         Print("Opposite Buy order placed # ",BuyTicket);
         AddLimitsBuy();        
         }//6
      else
         {//7 
         Print("Order Send failed, error # ", GetLastError());
         }//7 
         
      return(0);
      }//5
  //-----------------------------------------------------------------------------+      
  
  // Sell Order Condition to Open

  if(Volume[0] < volume_previous - OpenDistance*pt && SellTicket == 0)                   
     {//8                                 
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                                                
          SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,RealSlippage,0,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket > -1)
                  {//9
        Print("Opposite Sell order placed # ", SellTicket);
        AddLimitsSell();       
        }//9
     else
        {//10
        Print("Order Send failed, error # ", GetLastError());
        }//10      
     return(0);
     }//8                       


El siguiente código identifica las órdenes abiertas y las filtra por símbolo de compra, número mágico y tipo de orden. Una vez que detecta la última orden abierta en el pool y si la condición para abrir (considerando que la última orden es de compra) y confirma que no hay un ticket de venta, entonces se abre una orden de venta. Lo mismo si la última orden es de venta. Y aquí el código funciona.

El problema viene cuando viene una condición para abrir una tercera orden y así sucesivamente. Aquí, sin embargo, las condiciones para abrir están ahí y el código ha tratado bien con la segunda orden, ¿por qué el código no funciona aquí?

int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {//14
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {//15
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//16
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0)
               {//17               
               SellTicket = OrderSend(Symbol(), OP_SELL, MLots, Bid, RealSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(SellTicket > -1) 
                  {//18
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }//18
               else
                  {//19
                  Print("Order Send failed, error # ", GetLastError() );
                  }//19
                }//17
                           
            if(Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0)
               {//20             
               BuyTicket = OrderSend(Symbol(), OP_BUY, MLots, Ask, RealSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(BuyTicket > -1)
                  {//21
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }//21
               else
                  {//22  
                  Print("Order Send failed, error # ", GetLastError());
                  }//22   
               }//20
            }//16
         }//15    
      }//14

El código completo se adjunta en caso de que usted necesita para ver lo que estoy tratando de explicar.

Por favor, tenga en cuenta que todavía hay otros problemas y algunos códigos pueden parecer extraños, este es el caso de la forma en que utilizo para abrir órdenes porque todavía estoy aprendiendo a abrir órdenes basadas en la oferta más una distancia menos.

Realmente aprecio si usted podría ayudarme aquí.


Saludos cordiales
Luis

Archivos adjuntos:
 
¿Sabes lo que te da el Volumen[0]? ¿Qué sentido tiene añadir un valor de Punto a eso?
 

Hola Raptor,

Tienes razón.

Todavía estoy aprendiendo y probar varias maneras de conseguir lo que necesito y algunas veces las cosas estúpidas viene.

He tratado de hacer uso de un objeto para ponerlo en el nivel de Bid y luego obtener esa posición para abrir órdenes, parece mejor que este. Uno de los principales problemas es la forma de limitar las nuevas aperturas mientras la orden abierta no esté cerrada.

Se que tengo mucho que aprender y probar por error es una forma que encontré para entender mejor como se ejecuta esto en la práctica. Mientras que estoy haciendo mi más para entender la información del libro y la documentación algunas veces me siento perdido y tratar de obtener ayuda de los demás. Aquí en Portugal es muy difícil de conseguir la matrícula en torno a este tema y por lo que soy todo depende de la buena voluntad, la paciencia y la asertividad de los demás para obtener ayuda y asesoramiento. Cuando esa ayuda llega hago lo posible por entender, pero a veces no puedo con eso.

De todas formas gracias por mostrarme que el volumen no es el camino para conseguir ese tipo de indicador.

Saludos cordiales

Luis

 
luisneves:

Hola Raptor,

Tienes razón.

Todavía estoy aprender y probar varias maneras de conseguir lo que necesito y algunas veces las cosas estúpidas surge.

Aprecio que estés tratando y tratando de aprender también, tal vez deberías primero tratar de crear un EA más simple y trabajar con eso hasta que entiendas cómo conseguir que haga lo que necesitas, probar algunas cosas, añadir algunas declaraciones Print, ver lo que sucede, de esta manera aprenderás y entenderás, entonces cuando aprendas más puedes añadir más a tu EA. Necesitas tener una idea clara de lo que quieres que haga tu EA antes de codificarlo, demasiadas funcionalidades a la vez no harán más fácil ese proceso de pensamiento claro.

Otra cosa que le ayudará, es intentar dividir las tareas en módulos que pueda reutilizar con otros EAs, entonces puede codificar ese módulo, como una función definida por el usuario, por sí mismo como parte de un script o un EA simple para probarlo y asegurarse de que funciona y es robusto... entonces puede utilizar esa función con confianza en un EA sabiendo que funciona.
 

Hola RaptorUK,

Gracias por su respuesta honesta. Ya trato de romper las tareas y otro tipo de problemas comienzan a aparecer, es por eso que empezar a poner todo junto (y otros problemas comienza....)

Ya he tratado de hacer otro EAs y funcionó bien, pero ahora usando este enfoque sin el uso de indicadores (estándar) las cosas se complican.

La cosa es que ahora mismo estoy completamente perdido. Creo que tal y como veo el código funciona tick a tick en teoría debería funcionar y luego al intentar poner límites para evitar las aperturas múltiples la cosa empeora.

Así que ahora tengo algunos bloques de código que están trabajando bien otros que necesitan un poco de atención para refinar el rendimiento y otros (dos) que no funcionan, y aquí no sé cómo llegar desde aquí ... simple como eso y estoy totalmente acusado de la ayuda que la gente que sabe cómo lidiar con eso. Eres una de las personas que más tiempo ha dedicado a los temas m, pero aun así sigo sin copar con algunos problemas. Si tuviera el tiempo para aprender todo el código mql y luego empezar a escribir basado en mucha teoría y experiencia adquirida en el pasado tal vez no estaba aquí.

Vi un EA (adjunto) y luego tratar de entender cómo funciona en partes de código que me debe traer lo que estoy buscando, pero no tuvo éxito en eso. Lo que vi fue que hacer uso de un código para obtener aperturas basadas en el precio más y menos cierta distancia. Aqui cuando intento conseguir esto viene un problema con los limites y luego nada...no puedo puramente poner eso en funcionamiento...y luego no puedo ver por que las ordenes alternas no funcionan como en la teoria (al menos como lo estoy viendo). Pura desgracia.......

De todas formas estas son unas simples palabras de un tipo limitado...

Saludos cordiales

Luis

Archivos adjuntos:
Razón de la queja: