aventuras de un novato - página 4

 

Hola leyendas de mql. He cocinado el pseudocódigo para ustedes durante mi hora de almuerzo en el trabajo. Aquí está. Hazme saber lo que falta y lo añadiré

Pseudo Código N&P
Con esta estrategia queremos tener 1 código, poder adjuntarlo a cualquier gráfico, y que se ejecute en 5 divisas, entrando en posiciones cortas y largas en cada una si se cumplen las reglas.
---EURUSD---
Si ema7>ema14>sma50 y PriceNow es < TopFilterLevel (eg:1.3080 para eurusd. Esto lo ajustaré diariamente) entonces:
Compre lotes de EURUSD (los lotes serán una variable externa, por ejemplo 0.01). Si no: (es decir, las condiciones no se cumplen) no comprar.

Si ema7<ema14<sma50 y PriceNow es > BottomFilterLevel (ej: 1.1508 para eurusd) entonces:
Lotes cortos de EURUSD (de nuevo, variable externa). Si no (es decir, si no se cumplen las condiciones, no se pone en corto).

Si la posición de COMPRA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si la posición CORTA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si no se alcanzan los 20 pips (ya sea de compra o de venta) entonces sigue estando en el mercado hasta que se cierre la posición

manualmente. (idealmente ponemos esto en la función OrderSend para mantener el código más corto).

----GBPUSD---
exactamente el mismo código que el anterior.

----USDJPY---
IGUAL QUE EL ANTERIOR

---USDCHF---
IGUAL QUE EL ANTERIOR

---AUDUSD---
IGUAL QUE EL ANTERIOR

**Específicos del código
tanto las operaciones de compra como las de venta pueden ejecutarse simultáneamente para cualquier divisa si se cumplen los criterios indicados anteriormente
***no se necesita un stoploss para este código

**No hay código de gestión de dinero para este

¿Cómo se ve esto?

 
niko:

Hola leyendas de mql. He cocinado el pseudocódigo para ustedes durante mi hora de almuerzo en el trabajo. Aquí está. Hazme saber lo que falta y lo añadiré

N&P Pseudo Código
Con esta estrategia queremos tener 1 código, poder adjuntarlo a cualquier gráfico, y que se ejecute en 5 divisas, entrando en posiciones cortas y largas en cada una si se cumplen las reglas.
---EURUSD---
Si ema7>ema14>sma50 y PriceNow es < TopFilterLevel (eg:1.3080 para eurusd. Esto lo ajustaré diariamente) entonces:
Compre lotes de EURUSD (los lotes serán una variable externa, por ejemplo 0.01). Si no: (es decir, las condiciones no se cumplen) no comprar.

Si ema7<ema14<sma50 y PriceNow es > BottomFilterLevel (ej: 1.1508 para eurusd) entonces:
Lotes cortos de EURUSD (de nuevo, variable externa). Si no es así (es decir, si no se cumplen las condiciones, no se vende).

Si la posición de COMPRA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si la posición CORTA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si no se alcanzan los 20 pips (ya sea de compra o de venta) entonces sigue estando en el mercado hasta que se cierre la posición

manualmente. (idealmente ponemos esto en la función OrderSend para mantener el código más corto).

----GBPUSD---
exactamente el mismo código que el anterior.

----USDJPY---
IGUAL QUE EL ANTERIOR

---USDCHF---
IGUAL QUE EL ANTERIOR

---AUDUSD---
IGUAL QUE EL ANTERIOR

**Específicos del código
tanto las operaciones de compra como las de venta pueden ejecutarse simultáneamente para cualquier divisa si se cumplen los criterios indicados anteriormente
***no se necesita un stoploss para este código

**No hay código de gestión de dinero para este

Entonces, ¿cómo se ve esto?

Hola chicos, el tutorial básico de codificación realmente ayudó a conseguir mi cabeza alrededor de esto (aunque la parte de codificación detallada es falta). Para mostraros que he estado ocupado, os adjunto el código de abajo. La idea creo que está ahí, pero todavía devuelve muchos errores. Verás que todo está bajo un gran paréntesis en Start() la razón por la que lo hice es porque mql seguía dando el error de que la variable no puede ser declarada globalmente, y cuando lo hice todo en un paréntesis pareció haber detenido ese error (aunque muchos otros errores persistieron). Utilicé el notepad++ para comprobar la alineación de los paréntesis. ¿Así que al menos voy por el camino correcto con esto?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
      int CalcOpenOrders()
         {
         int long=0,short=0;
      for(int i=0; i<OrdersTotal(); i++)   
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)==false)break;
         //this function selects an order for further processing
         if(OrderType()==OP_BUY)long++;
         if(OrderType()==OP_SELL)short++;
         }
      if(long>0)return(long);
      if(short>0)return(-short);
      }

//------------ (fingers crossed this is right). I still don't get it why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
   {
   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(Bars<75)
      {
      Print("Bars less than 100");
      return(0);
      }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders();
  
   // Check output of function
   if ( ReturnVal >0)  // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok=1;
      else
      {
      eurusdbuyok=0;
      return(0);
      }

   if ( ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
      eurusdshortok=1;
      else
      {
      eurusdshortok=0;
      return(0);
      }


   //--------------condition ends

   if( eurusdshortok==1)
      {
      static int ticket;
      // deleted if(OrdersTotal()==0)
      if( e1under2 && e2under3)     // short function
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"ShortOrder ",0,0,Red);
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
            Print("SHORT order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok==1)
      {
      static int ticket1;
      // deleted if(OrdersTotal()==0)
      if( e1over2 && e2over3 && eurusdbuyok==1) //buy function
         {
         ticket1=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( ticket1>0)
            {
            if(OrderSelect( ticket1, SELECT_BY_TICKET, MODE_TRADES))
            Print("BUY order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }

   return(0);
   } 
esta es la última versión del código. sintéticamente todo parece estar bien, pero cuando lo ejecuto a través de probador de la estrategia que devuelve ningún comercio. algo está mal con la lógica. necesito ayuda. Me estoy familiarizando con el código ahora, así la estructura del lado del programa de la misma.
 
niko wrote >>

Hola leyendas de mql. He cocinado el pseudocódigo para ustedes durante mi hora de almuerzo en el trabajo. Aquí está. Hazme saber lo que falta y lo añadiré

Pseudo Código N&P
Con esta estrategia queremos tener 1 código, poder adjuntarlo a cualquier gráfico, y que se ejecute en 5 divisas, entrando en posiciones cortas y largas en cada una si se cumplen las reglas.
---EURUSD---
Si ema7>ema14>sma50 y PriceNow es < TopFilterLevel (eg:1.3080 para eurusd. Esto lo ajustaré diariamente) entonces:
Compre lotes de EURUSD (los lotes serán una variable externa, por ejemplo 0.01). Si no: (es decir, las condiciones no se cumplen) no comprar.

Si ema7<ema14<sma50 y PriceNow es > BottomFilterLevel (ej: 1.1508 para eurusd) entonces:
Lotes cortos de EURUSD (de nuevo, variable externa). Si no es así (es decir, si no se cumplen las condiciones, no se vende).

Si la posición de COMPRA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si la posición CORTA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si no se alcanzan los 20 pips (ya sea de compra o de venta) entonces sigue estando en el mercado hasta que se cierre la posición

manualmente. (idealmente ponemos esto en la función OrderSend para mantener el código más corto).

----GBPUSD---
exactamente el mismo código que el anterior.

----USDJPY---
IGUAL QUE EL ANTERIOR

---USDCHF---
IGUAL QUE EL ANTERIOR

---AUDUSD---
IGUAL QUE EL ANTERIOR

**Específicos del código
tanto las operaciones de compra como las de venta pueden ejecutarse simultáneamente para cualquier divisa si se cumplen los criterios indicados anteriormente
***no se necesita un stoploss para este código

**No hay código de gestión de dinero para este

¿Cómo se ve esto?

Hola Niko

Tu pseudo código se ve muy bien para un primer intento.

Sin embargo, me gustaría verlo un poco más estructurado y hay un par de preguntas que me plantea.

He podido ponerlo fácil y rápidamente en el tipo de formato que yo mismo utilizaría normalmente. Se adjunta aquí como archivo de texto para que le eches un vistazo. Tendrá que guardar este archivo y abrirlo en el bloc de notas o en un editor similar para ver el formato.

Tenga en cuenta que en esta etapa no estamos escribiendo en ningún lenguaje informático específico. Sólo estamos tratando de especificar claramente y sin ambigüedades lo que estamos tratando de hacer.

Puedes notar que el pseudocódigo es bastante específico y "legalista". Así es como tenemos que hablar con los ordenadores. Tenemos que especificar muy claramente qué es lo que queremos que hagan. De lo contrario, tienden a generar basura.

También notarás el uso de "Bloques" para organizar las cosas en grupos lógicos. Estos pueden ser útiles más adelante para ayudarnos a estructurar el código adecuadamente. Como alguien señaló anteriormente en esta discusión, no hacemos esto sólo por diversión. Lo hacemos para que el código sea más legible, más comprensible, más fácil de mantener y, en última instancia, más fiable y libre de errores. Esto último es extremadamente importante en un software que va a ser utilizado para el comercio en vivo, a menos que, por supuesto, usted tiene cubos de dinero que está dispuesto a tirar :) . En serio, el comercio es lo suficientemente difícil como para tener que lidiar con el software con errores.

Por favor, eche un vistazo a lo que le he enviado y siéntase libre de hacer los cambios que considere necesarios. Hay un par de puntos importantes que faltan en mi pseudocódigo. ¿Puedes identificarlos?

También puede ocuparse de las dos cuestiones que he planteado en el pseudocódigo. Se me ocurren otras preguntas, pero es mejor dejarlas para la fase de codificación.

Si aún no lo ha hecho, puede probar el editor Notepad++ que FXtrader2008 mencionó anteriormente en esta discusión. Utilice cualquier herramienta que pueda encontrar que haga la vida un poco más fácil. Por favor, envíe su pseudocódigo revisado de nuevo a mí como un archivo de texto adjunto. Me parece que tratar de escribir el código estructurado, pseudo o de otra manera, en este editor de HTML un poco tedioso y desordenado.

Saludos

Tim

Archivos adjuntos:
 
TSWilson:

Hola Niko

Tu pseudocódigo tiene muy buena pinta para ser un primer intento.

Sin embargo, me gustaría verlo un poco más estructurado y hay un par de preguntas que me plantea.

He podido ponerlo fácil y rápidamente en el tipo de formato que yo mismo utilizaría normalmente. Se adjunta aquí como archivo de texto para que le eches un vistazo. Tendrá que guardar este archivo y abrirlo en el bloc de notas o en un editor similar para ver el formato.

Tenga en cuenta que en esta etapa no estamos escribiendo en ningún lenguaje informático específico. Sólo estamos tratando de especificar claramente y sin ambigüedades lo que estamos tratando de hacer.

Puedes notar que el pseudocódigo es bastante específico y "legalista". Así es como tenemos que hablar con los ordenadores. Tenemos que especificar muy claramente qué es lo que queremos que hagan. De lo contrario, tienden a generar basura.

También notarás el uso de "Bloques" para organizar las cosas en grupos lógicos. Estos pueden ser útiles más adelante para ayudarnos a estructurar el código adecuadamente. Como alguien señaló anteriormente en esta discusión, no hacemos esto sólo por diversión. Lo hacemos para que el código sea más legible, más comprensible, más fácil de mantener y, en última instancia, más fiable y libre de errores. Esto último es extremadamente importante en un software que va a ser utilizado para el comercio en vivo, a menos que, por supuesto, usted tiene cubos de dinero que está dispuesto a tirar :) . En serio, el comercio es lo suficientemente difícil como para tener que lidiar con el software con errores.

Por favor, eche un vistazo a lo que le he enviado y siéntase libre de hacer los cambios que considere necesarios. Hay un par de puntos importantes que faltan en mi pseudocódigo. ¿Puedes identificarlos?

También puede ocuparse de las dos cuestiones que he planteado en el pseudocódigo. Se me ocurren otras preguntas, pero es mejor dejarlas para la fase de codificación.

Si aún no lo ha hecho, podría probar el editor Notepad++ que FXtrader2008 mencionó anteriormente en esta discusión. Utilice cualquier herramienta que pueda encontrar que haga la vida un poco más fácil. Por favor, envíe su pseudocódigo revisado de nuevo a mí como un archivo de texto adjunto. Me parece que tratar de escribir el código estructurado, pseudo o de otra manera, en este editor de HTML un poco tedioso y desordenado.

Saludos

Tim

Hola TSW. Gracias por esto. Veo que le dedicaste bastante tiempo a esto, así que te lo agradezco mucho. Adjunté el pseudocódigo actualizado, pero en caso de que no se adjunte, aquí está abajo. Intenté ver lo que te faltaba, pero no pude entenderlo del todo, algunas cosas las añadí pero eran solo aclaraciones de cosas.


¿A dónde vamos a partir de aquí? Mientras creamos este código "adecuado", sigo intentando resolver el rompecabezas del código anterior. No sigue nuestro pseudocódigo ya que es un código antiguo parcheado, pero todavía estoy bastante desconcertado con él ya que debería funcionar, al menos para 1 moneda. La clave es que construirlo de esta manera desordenada me está enseñando los elementos de codificación reales (como la forma en que los corchetes afectan a la secuencia de comandos, donde declarar las variables, etc). ¿Alguna idea de por qué ese código no funciona como está ahora?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote >>

Hola chicos, el tutorial básico de codificación me ha ayudado mucho a entender esto (aunque falta la parte de codificación detallada). Para mostraros que he estado ocupado, os adjunto el código de abajo. La idea creo que está ahí pero sigue dando muchos errores. Verás que todo está bajo un gran paréntesis en Start() la razón por la que lo hice es porque mql seguía dando el error de que la variable no puede ser declarada globalmente, y cuando lo hice todo en un paréntesis pareció haber detenido ese error (aunque muchos otros errores persistieron). Utilicé el notepad++ para comprobar la alineación de los paréntesis. ¿Así que al menos voy por el camino correcto con esto?

esta es la ultima version del codigo. sinteticamente todo parece estar bien, pero cuando lo paso por el probador de estrategias no devuelve ninguna operacion. algo esta mal en la logica. necesito ayuda. Me estoy familiarizando con el código, así como con la estructura del programa.

Hola chicos/chicas, cualquier ayuda con el trozo de código anterior (no el pseudocódigo sino el código) mientras aprendo a hacerlo de la manera correcta.

Hoy tuve una lluvia de ideas, creo que tal vez el error es que hay una función que cuenta las órdenes, y en cambio tal vez necesito 2 funciones por separado, una cuenta las compras y otra las ventas. Programé el código de abajo (cambié algunas cosas para tener en cuenta esto), se puede ver a continuación. Pero aun así se me hizo un lío ya que todavía soy un completo principiante. ¿Alguna idea sobre esto?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     if(long>0)return(long);
     if(short>0)return(-short);
     }

//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  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(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //buy function
        {
        ticket1=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(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
           Print("BUY order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }

  return(0);
  }

 
niko wrote >>

Hola chicos/chicas, alguna ayuda con el trozo de código de arriba (no el pseudocódigo sino el código) mientras aprendo a hacerlo de la forma correcta.

Hoy tuve una lluvia de ideas, creo que tal vez el error es que hay una función que cuenta las órdenes, y en cambio tal vez necesito 2 funciones por separado, una cuenta las compras y otra las ventas. Programé el código de abajo (cambié algunas cosas para tener en cuenta esto), se puede ver a continuación. Pero aun así se me hizo un lío ya que todavía soy un completo principiante. ¿Alguna idea sobre esto?

Hola Niko

Con referencia al pseudo código

Del código:
*** Pregunta ***
¿Qué periodos de tiempo quiere utilizar para sus medias móviles? ¿Son los periodos Minutos, Horas, Días, Semanas, Meses o tienen que ser variables?
***Respuesta: Excelente pregunta. Serán periodos de 5 minutos para todas las medias móviles, no necesitan ser variables.

Entonces sugeriría añadir al pseudocódigo en el área de parámetros de configuración una declaración algo así como

"Utilizar el marco de tiempo de 5 minutos para los indicadores"


Usted dijo:
***No fui claro en esto antes, mis disculpas. No debería haber ningún bloque como este en el código.

Saldré de las posiciones manualmente cuando sea necesario a través de la ventana de comercio/terminal

(asumo que es posible y que no estropeará la ejecución del EA, verdad).

Así que en realidad no sé si es necesario codificar esta flexibilidad o no? ¿Qué opinas?


Entonces le sugiero que elimine este bloque del pseudocódigo.

No debería haber ningún problema en codificar el EA para que puedas usar el terminal para cerrar una posición manualmente sin estropear nada.

Has añadido estas líneas:

ELSE Si ya hay 1 posición de COMPRA abierta para este par de divisas NO ABRIR posición de COMPRA para este par de divisas.

ELSE Si ya hay 1 posición de venta abierta para este par de divisas NO ABRIR POSICIÓN DE VENTA para este par de divisas


*** Pregunta *** ¿Por qué necesitas indicar específicamente lo que NO quieres que haga el programa después de que las líneas anteriores acaban de

indique lo que SÍ quiere que haga el programa. En mi opinión el pseudo código es el lugar para pensar cuidadosamente a través de su lógica. De lo contrario, es probable que

se han metido en un lío cuando empiezas a codificar de verdad.


Usted dijo:
PS: A menudo voy a utilizar sólo 1 dirección en un par de divisas (por ejemplo: sólo a corto, para eurusd durante 2 días, por ejemplo). ¿Cómo podríamos construir esto en el código. Mi suposición es que podría poner '//' delante de las partes del código que no quiero usar (por ejemplo, delante de las órdenes de compra o venta dentro de cada par de divisas) y luego eliminarlas cuando necesite usar esa parte del código la próxima vez. ¿Funcionará esto con un código estructurado de esta manera?


Comentar el código como sugieres no es una forma muy elegante de hacerlo. Además, si comentas, por ejemplo, la sección "LONG" del código, comentarías la función para abrir posiciones largas para todos los pares de divisas, a menos que produzcas código con mucha duplicación. Esto tampoco es una forma muy elegante de hacerlo y fácilmente conduce a errores.

Durante un período determinado puede querer estar largo EURUSD, corto GBPUSD y no negociar USDCHF en absoluto. Esto es bastante fácil de lograr, pero me gustaría ver que usted tiene un ir a tratar de trabajar a la forma de describir por sí mismo en el pseudo código.


Aquí hay un par de pistas sobre una posible manera de hacerlo.

1. echar un vistazo a la forma en que sus niveles se establecen y se emplean

2. Los niveles se representan como números decimales. Para las situaciones go/no go es una práctica común utilizar otro tipo de representación conocida como booleana o bandera. ¿Sería posible utilizar banderas para lograr lo que quieres hacer?


Usted dijo:

**No puedo pensar en nada que hayas omitido a propósito, para ser honesto. A menos que sea para comprobar si hay fondos suficientes para el comercio, pero eso no es necesario todavía.

Tal vez en futuras versiones de la estrategia.


No, no se trata de comprobar si hay fondos suficientes. Ha dicho específicamente que no se trata de gestionar el dinero, excepto, por supuesto, de especificar el tamaño del lote. Es algo mucho más fundamental.

¿Qué elementos de información necesita para colocar una orden? ¿Dónde y cómo se describe y maneja cada uno de estos elementos en el código psuedo?


Usted dijo:

¿A dónde vamos a partir de aquí? Mientras creamos este código "apropiado", todavía estoy tratando de resolver el rompecabezas del código anterior. No sigue nuestro pseudocódigo ya que es un código antiguo parcheado, pero todavía estoy bastante desconcertado con él ya que debería funcionar, al menos para 1 moneda. La clave es que construirlo de esta manera desordenada me está enseñando los elementos de codificación reales (como la forma en que los corchetes afectan a la secuencia de comandos, donde declarar las variables, etc). ¿Alguna idea de por qué ese código no funciona como está ahora?


Aprecio su frustración. He echado un vistazo rápido al código antiguo, pero francamente lo que estás tratando de hacer no tiene mucho sentido lógico. Podría reescribir este trozo de código en unos 15 minutos y haría lo que tú quieres, pero ese no es el objetivo, ¿verdad? Dijiste que querías aprender a escribir código. Estoy tratando de instruirte en cómo hacerlo por ti mismo.


Nico, no creo que estés muy lejos de empezar a escribir algo de código propio (nuevo), pero es importante que primero consigas clavar en el pseudocódigo la mayor parte de "lo que quieres hacer" con precisión.

Esto hará que la codificación sea "taaan fácil" como pronto verás.


Sigue con el buen trabajo

Saludos

Tim

 

Hola Tim,


Como siempre aprecio mucho tu tiempo conmigo. Seguiré adelante y modificaré el pseudocódigo para que refleje tus comentarios. Sobre el código real, no te preocupes, vamos a hacerlo bien (es que soy un poco impaciente a veces :), ya que el aprendizaje es más poderoso que todo.

 

Hola Tim,


Volví a repasar el pseudocódigo e hice todo lo que mi cerebro de novato pudo descifrar en este momento. ¡Por favor, encontrarlo adjunto, espero sus comentarios!

Archivos adjuntos:
 
niko wrote >>

Hola Tim,

Volví a repasar el pseudocódigo e hice todo lo que mi cerebro de novato pudo descifrar en este momento. Lo encuentro adjunto, ¡espero tus comentarios!

Hola Nick

Todo esto se ve bien.

He revisado tu último código psuedo y he respondido a algunas preguntas, etc.

Creo que estamos casi listos para empezar a codificar.


Como regla general, se dice que un tercio del tiempo de programación debe dedicarse a la especificación, un tercio a la codificación y un tercio a la depuración y las pruebas.


Así que podemos decir que ahora estamos aproximadamente a 1/3 del camino de este pequeño proyecto.

Ahora vamos a hablar sobre el lenguaje MT4.


Todos los lenguajes informáticos tienen formas específicas (un formato) en las que el lenguaje debe ser escrito para que el ordenador pueda entender lo que se le quiere indicar. Esta y otra información específica del lenguaje se encuentra en la documentación. La documentación para MT4 está disponible en línea en este foro. Si aún no lo has hecho, te sugiero que pases algún tiempo echando un vistazo al tipo de información que está disponible en la documentación. Así, cuando necesite información sobre algún tema o función específica, sabrá dónde buscarla.


Para hacer la vida más fácil, muchos lenguajes de computación modernos, incluyendo MT4, utilizan plantillas que establecen un diseño de programa básico para usted. Estas plantillas de programas se denominan a menudo "asistentes". Encontrará el asistente de EA en la opción de menú "Nuevo" en el MetatEditor con la cruz verde en él.


Si lo abre, encontrará una plantilla para "Asesor Experto". Selecciónela y se le pedirá un nombre para el EA, los detalles del autor, etc. y los parámetros. Los parámetros pueden ser añadidos o modificados más tarde, pero en esta etapa es posible que desee introducir los parámetros desde el bloque de configuración.

Usted tendrá que dar a cada parámetro un nombre, un tipo y un valor inicial


Los nombres de los parámetros deben ser siempre descriptivos de lo que son


por ejemplo, EURUSD_TopFilterLevel es un nombre significativo ex1 IS NOT. El uso de nombres de datos significativos hace que el programa sea mucho más fácil de entender, depurar o modificar posteriormente. Tenga en cuenta que en MT4, los nombres de datos son sensibles a las mayúsculas y minúsculas. LOTSize no es lo mismo que LotSize. Debe ser cuidadoso y consistente con los nombres de los datos.


También se le pedirá que especifique un tipo de datos (type) para cada parámetro. MT4 utiliza sólo 4 tipos de datos Número entero (int), Número decimal (doble), Texto (cadena) y Verdadero / Falso o Bandera (bool) .


Nuevamente debemos tener cuidado con los tipos de datos y no mezclarlos sin saberlo o podemos introducir sutiles errores.


Una vez que haya creado su plantilla con el asistente le sugiero que empiece a "estructurar" su programa. La unidad básica de estructura en MT4 es la FUNCIÓN.


La función básica más sencilla, que tal y como está escrita aquí, en realidad no hace nada, es



void MiFunciónBásica()

{

}


La plantilla generada por el asistente de metatrader ya tiene tres funciones vacías.



int init()

{

return(0)

}



init deinit()

{

return(0)

}



int inicio()

{

return(0)

}


La función init es llamada cada vez que el EA se inicia cuando se arrastra a un gráfico y se hace clic en el botón de Asesor Experto ON

La función deinit es llamada cada vez que el EA se detiene al arrastrarlo fuera de un gráfico o al hacer clic en el botón del Asesor Experto OFF


La función iniciar es llamada cada vez que el gráfico al que se adjunta recibe un nuevo TICK. Esto significa que puede ser llamada varias veces o más por minuto dependiendo de lo ocupado que esté el mercado. Aquí es donde haremos la mayor parte de nuestro trabajo.


Por el momento sugiero que ponga todo el pseudo código del bloque principal en la función de inicio y luego comente el pseudo código con // en cada línea.


A continuación, cree una nueva función propia para el bloque de reglas de entrada y comente el pseudocódigo en ella de la misma manera.


Deja las funciones init y deint vacías y como están por el momento.


Deberías ser capaz de compilar este código sin errores, pero por supuesto en esta etapa no hará nada.


Sigue trabajando así de bien.


Saludos

Tim

(PS podemos hablar por skype si es necesario, pero vamos a ver cómo vamos con el foro por el momento)

Archivos adjuntos:
 

Hola Tim,

Como siempre, tu ayuda y tu tiempo son muy valiosos. Como gesto de agradecimiento me gustaría enviarte una muy buena botella de champaigne una vez que hayamos terminado con el proceso de codificación.

Sí, he revisado el libro de mql bastantes veces, la dificultad era poner la teoría en práctica. También imprimí una decena de EAs publicados en este sitio web, para ver cómo se codifican y arman las cosas, para tratar de entenderlas. Y paso mucho tiempo en el simulador de trading en MT4 (es decir, haciendo backtesting y aprendiendo los EAs ya existentes).

Empezaré el proceso de codificación, y haré bloques muy claros y separados para que ambos veamos lo que pasa. Y te los enviaré por el foro.

1 Pregunta: Has dicho que los brokers ponen cosas para evitar el pipping agresivo. 1. Qué defines como pipping agresivo? 2. ¿Qué cosas ponen en su lugar?

Yo solía hacer scalping manualmente en eurusd en marcos de tiempo de 1min (con un método de spreadbetting), esto iba muy bien hasta que el brockerage hizo clic y comenzó a poner retrasos para la ejecución (entrada y salida). Así que ahora no tiene sentido hacer esto con este corredor, a pesar de que es ilegal, los retrasos seguirán ocurriendo y arruinar todo el día (como si normalmente cuero cabelludo sólo durante 1 hora, 2 retrasos y perdió el valioso tiempo). Me devolvieron todo el dinero de las operaciones retrasadas después de una agresiva amenaza de acción judicial.

2 Pregunta: ¿Utilizas diferentes brokers? ¿Qué corredores recomendaría? (si se le permite mencionar nombres aquí)

Gracias,

nick