aventuras de un novato

 

Hola chicos, gracias por ayudarme con mi código, son las 2.11 de la mañana en Londres, y he estado tratando de descifrar este enigma mql desde hace tiempo. Por cierto CodesGuru gracias por los tutoriales, son más claros que el material estándar ofrecido, ¡buen esfuerzo!


Estoy en una búsqueda de novatos para codificar una estrategia y como siempre necesito la ayuda de los profesionales en esto.


A continuación se muestra un código que puse juntos, pero por alguna razón se ejecuta sólo las operaciones cortas.


Estoy atascado sin saber por qué. Adicionalmente también necesito agregarle esto: 1. El código debe ejecutar tanto las operaciones largas como las cortas sin importar si ya hay una operación abierta en la dirección opuesta (por ejemplo: si hay una operación larga abierta, el código debe entrar igualmente en una posición corta si se cumplen las condiciones). Supongo que tengo que jugar con la función'OrdersTotal()==0; pero no sé qué hacer.


Por favor, ayuda. el código se adjunta. (Traté de adjuntarlo pero por alguna razón no lo hace, ¿alguna idea de lo que está pasando?)


Prometo una buena botella de champaigne para la persona que más me ayude a llevar este código a buen puerto :-)


ps: Esto lo pruebo en el simulador/estrategia de mt4.


¡espero vuestra ayuda chicos!

nick

 
//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if(Bars<75)
      {
      Print("Bars less than 100");
      return(0); 
      }
   //Declaration
   
  double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3;
  
  ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
  ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
  ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
 e1under2= ema1< ema2;
 e2under3= ema2< ema3;
 e1over2= ema1> ema2;
 e2over3= ema2> ema3;

 
 

   if(OrdersTotal()==0)   // one order at the time
      {
      // Short  Entry
      static int ticket;
      if( e1under2 && e2under3)     // short function
         {                                                                    
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);   
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
            }
            if(OrdersTotal()==0)   // one order at the time
            if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
         
         {
         if( e1over2 && e2over3) //buy function                                                                    
         ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);   //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
            }
            else Print("Error opening BUY order : ",GetLastError());
            return(0);     
         }
 
            
            

            
            
            
            return(0);     
         }
         
         
  
   return(0);
   }
   }
¡ese es el código chicos!
 

¡Wow! Muy buen trabajo de codificación para un "novato". Puedes escribir tu código de forma mucho más concisa que yo.


Observo que tienes dos líneas condicionales-if idénticas para la sección de COMPRA, mientras que la sección de VENTA sólo tiene una.


La segunda declaración condicional idéntica para la función de COMPRA es probablemente inofensiva, pero ¿es necesaria?


            if(OrdersTotal()==0)   // una orden a la vez
if(e1over2 && e2over3) // esto puede ser complicado porque la versión antigua tenía ==1 para todas las variables <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<aquí está la primera

{
if(e1over2 && e2over3) //función de compra <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<aquí está la segunda
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //¿Para qué sirve 12345? Añado ASk-30*Punto para el stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de COMPRA abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de COMPRA : ",GetLastError());
return(0);
}


Además, parece que tiene las funciones de venta y compra dentro del mismo condicional:



if(OrdersTotal()==0) // una orden a la vez
{
// Entrada en corto
static int ticket;
if(e1under2 && e2under3) // función en corto
{ // El paréntesis de coincidencia para esto está muy por debajo de la función de VENTA y COMPRA<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ver abajo
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point, "Short Order ",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden SHORT abierta : ",OrderOpenPrice());
}


if(OrdersTotal()==0) // una orden a la vez
if(e1over2 && e2over3) //esto puede ser complicado porque la versión antigua tenía ==1 para todas las variables

{
if(e1over2 && e2over3) //función de compra
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //¿Para qué sirve el 12345? Añado ASk-30*Punto para el stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de COMPRA abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de COMPRA : ",GetLastError());
return(0);
}







return(0);
} // este es el paréntesis que coincide con el mostrado arriba<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ver arriba


return(0);
}
}





La orden de COMPRA está sujeta al criterio de VENTA de la forma en que se ha dispuesto el condicional-si anotado.









 
niko:
¡ese es el código chicos!

La razón por la que no hace nunca una orden larga es que no has cerrado el bloque de código que realiza la orden corta con una llave de cierre. Esto significa que esencialmente sólo está ejecutando una orden larga si (e1bajo2 && e2bajo3) Y (e1sobre2 && e2sobre3) lo cual imagino que no ocurrirá.


Dices que quieres abrir una orden aunque ya haya una orden abierta en la otra dirección. De esto asumo que quieres limitar el número de órdenes a un máximo de una en cada dirección. Al incluir la comprobación de que OrdersTotal() es igual a cero, esto le limita efectivamente a 1 orden en total, no una en cada dirección. Lo que tienes que hacer es comprobar el número y el tipo de órdenes existentes usando un bucle y contadores (hay muchos ejemplos en este sitio), y luego usar el resultado para determinar si se debe hacer una orden.


Me di cuenta en su otro post, como usted mencionó que quería aprender a escribir MQL así que no voy a escribir esto para usted. Este ejemplo es exactamente el tipo de código simple y la lógica que es esencial en el proceso de aprendizaje.


Por favor, hazlo por ti mismo y hazme saber cómo te va.

 

¡¡¡Hola chicos, sois unas leyendas !!!

Gracias por vuestros comentarios FXTrader2008 y cloudbreaker. No me di cuenta de que había una condición repetida para la compra, il cortar eso, y tiene sentido con respecto al soporte no se cierra. Buena idea no darme la respuesta codificada, ya que quiero aprender el código yo mismo. Voy a echar un vistazo en línea para el bucle / contadores.

Oh, la razón por la que el código es tan agradable y compacto es porque un amigo mío me ayudó a ponerlo juntos (que es un programador).

¡Voy a continuar con mi lado de las cosas y si me quedo atascado te lo haré saber!

¿Ustedes operan los mercados en vivo de forma independiente o trabajan para metaquotes?

 

No he mirado en profundidad tu código, pero un primer consejo:


Intenta estructurar tu código de forma más clara, no lo hacemos por diversión sino para una mejor lectura y comprensión. No influye en el "sentido" o significado del código...


Veamos cómo debería ser tu código (sólo la parte esencial):

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   if( e1under2 && e2under3)     // short function
     {                                                                    
      ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);  
      if( ticket>0)
        {
         if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
        }
      if(OrdersTotal()==0)   // one order at the time
      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
            ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);   //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError());
         return(0);    
        }
      return(0);    
     }
   return(0);
  }
 

Como puede ver ahora: Sólo pruebas tu condición "corta".

   // Short  Entry
   static int ticket;
   if( e1under2 && e2under3)     // short function

y dentro de esta prueba para la condición "larga", dos veces - para la seguridad ; ) - esto no puede funcionar.

      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
 

Mejor: (pero lejos de ser perfecto)

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   if ( e1under2 && e2under3)     // short function
     {                                                                    
      ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);  
      if ( ticket>0)
        {
         if (OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
        } }
   if( e1over2 && e2over3) //buy function {
      ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);   //What's 12345 for? I ADDED ASk-30*Point for stop loss
      if ( ticket>0)
        {
         if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
        }
      else Print("Error opening BUY order : ",GetLastError());
     }
  return(0);
  }

Ahora debería funcionar para operaciones cortas y largas.

Recomiendo encarecidamente leer este libro aquí sobre MQL4 - especialmente la sección Creación de un programa normal - está muy bien escrito y se puede implementar fácilmente su estrategia. Yo también empecé así...

Si descargas los archivos de allí y tienes problemas con los comentarios (ya que están en cirílico) abre "word", copia&pega la fuente de cada archivo desde la página de internet (ya que los comentarios allí están en inglés) a word y finalmente copia&pega desde word a Metaeditor. A partir de ahora puedes estudiar los programas en inglés.


Espero que os haya servido de ayuda...


(Por cierto: Yo también soy muy nuevo en MQL4 pero trabajo como programador y por lo tanto la sintaxis y la estructura no son un problema para mí...)


Saludos TuRRiCAN

 
Uy, en el tiempo que he necesitado para contestar, los demás han sido más rápidos...
 
TuRRiCAN wrote >>
Ooops, en el tiempo que necesitaba para responder, los otros han sido más rápidos ...

¡Hey Tourrican esto es muy útil gracias! El cirílico no es un problema, soy ruso, de siberia en realidad.

Sí, he estudiado el libro mql, pero todavía está fuera de aprendizaje práctico, es una cosa totalmente diferente a estudiarlo y luego tratar de escribir un programa de ti mismo (porque no explican claramente con ejemplos de la vida real en cada parte del libro, por qué y cómo se utilizan esas cosas que usted sabe.

Pero lo conseguiré, el deseo ardiente dentro de mí de hacer que esto funcione es mayor que cualquier obstáculo.

 
niko:

¿Operan ustedes en los mercados en vivo de forma independiente o trabajan para metaquotes?

En respuesta a su pregunta, normalmente trabajo como piloto de helicóptero. Sin embargo, dada la situación económica, la empresa para la que trabajo no quiere volar en este momento. Así que, mientras tanto, he estado desarrollando EAs para una empresa que es propiedad de mi mejor amigo. Estamos operando en vivo en nombre de algunos fondos bastante conocidos.

Me alegro de que estés intentando aprender a codificar y te ayudaré siempre que pueda. Es refrescante encontrar a alguien que se une al foro y quiere aprender a ser autosuficiente.