Inicio Trading Sistemático Publicación

Gestiona tu Take Profit Basado en el Beneficio Actual con MetaTrader 4

Archivos adjuntos
47010.zip (1.03 KB, Descargar 0 veces)

Introducción

La mayoría de los asesores expertos suelen cerrar órdenes en el take profit basándose en la distancia en pips desde el precio de compra. Sin embargo, el código utilizado por EA Perceptron se centra principalmente en el beneficio actual. Este enfoque te permite gestionar fácilmente el take profit con múltiples posiciones abiertas, monitoreando el beneficio total basado en el número mágico, en caso de que uses varias instancias de bots o diferentes EAs al mismo tiempo. ¡Agrega a mis amigos! y sigue mi feed para mantenerte al tanto de las novedades.

Utilizar este código también puede tener un impacto positivo en algunos problemas que pueden surgir al usar un take profit basado en pips. Por ejemplo, un take profit basado en pips podría variar dependiendo del deslizamiento de tu corredor, limitando así las ganancias. Al usar un código basado en el beneficio actual, puedes evitar este inconveniente y tener más control sobre tus operaciones.

Si deseas aprender más sobre cómo configurar un take profit basado en el beneficio actual, puedes usar el código de EA SwingBot como referencia.


Total de Órdenes

Comencemos con el código que calcula el total de órdenes abiertas con el mismo número mágico.

El número mágico es un identificador único asignado a una orden por el trader o un EA (Asesor Experto).

El código inicializa una variable total_orders en cero. Luego, recorre todas las órdenes abiertas utilizando un bucle for y selecciona cada orden usando la función OrderSelect(). Si una orden se selecciona correctamente, incrementa la variable total_orders en uno.

//----------------- 
   int total_orders = 0;
   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderMagicNumber() == MagicNumber)
         {
         total_orders++;
        }
        }
     }


Calculando el Beneficio Actual

El código inicializa dos variables: ProfittoMinimo y Profit. La variable ProfittoMinimo se utiliza para activar el take profit en este nivel, el valor se expresa en la moneda de la cuenta. La variable Profit se utiliza para acumular el beneficio actual de todas las posiciones abiertas que tienen el mismo número mágico. La variable StopLoss se utiliza para el stop loss.

El código utiliza un bucle for para iterar a través de todas las posiciones abiertas usando la función OrdersTotal(). Para cada posición abierta, se selecciona la orden correspondiente usando la función OrderSelect(). Si la orden se selecciona correctamente y tiene el mismo número mágico, se suma el beneficio de la orden a la variable Profit.

      double ProfittoMinimo = 3; // beneficio objetivo
      double Profit = 0; // beneficio actual
      
      for(int i=0; i<OrdersTotal(); i++)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderMagicNumber() == MagicNumber) // Si usas múltiples EAs, puedes eliminar el filtro de MagicNumber para mantener la función en todas las órdenes
              {
               Profit += OrderProfit();
              }
           }
        }


El beneficio mínimo puede configurarse como una variable externa y ajustarse en las opciones del EA:

Beneficio Mínimo


Cerrando Posiciones si se Alcanza el Beneficio

El código utiliza un bucle for para iterar a través de todas las órdenes abiertas usando la función OrdersTotal(). El bucle comienza desde la última orden y va hacia la primera. Para cada orden, se selecciona el trade correspondiente usando la función OrderSelect().

Si el trade seleccionado tiene el mismo símbolo que el gráfico actual, es de tipo OP_BUY, y tiene el mismo número mágico que se especifica en el código, se verifica si el Profit del trade es mayor o igual a ProfittoMinimo. Si es así, se cierra el trade al precio de compra usando la función OrderClose() y se imprime un mensaje indicando que la orden de compra ha sido cerrada.

De manera similar, si el trade seleccionado tiene el mismo símbolo que el gráfico actual, es de tipo OP_SELL, y tiene el mismo número mágico que se especifica en el código, se verifica si el Profit del trade es mayor o igual a ProfittoMinimo. Si es así, se cierra el trade al precio de venta usando la función OrderClose() y se imprime un mensaje indicando que la orden de venta ha sido cerrada.

      for(int e = OrdersTotal() - 1; e >= 0; e--)
        {
         if(OrderSelect(e, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber) // La orden se modifica solo si el MagicNumber coincide con el de la orden en curso.
              {
               if(Profit >= ProfittoMinimo)
                 {
                  OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // Precio de compra
                  Print("Orden de compra cerrada", Profit, " - Stoploss mínimo: ",MarketInfo(Symbol(), MODE_STOPLEVEL));
                 }
          }

            if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
              {
               if(Profit >= ProfittoMinimo)
                 {
                  OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // Precio de venta
                  Print("Orden de venta cerrada", Profit, " - Stoploss mínimo: ",MarketInfo(Symbol(), MODE_STOPLEVEL));
                 }
          }
        }


Conclusión

Este código puede ser útil para todas aquellas estrategias de cierre de posiciones basadas en el take profit, pero también podría combinarse con un trailing stop en función del aumento del beneficio actual. El sistema también es útil en caso de múltiples Asesores Expertos. Si excluyes la condición if sobre el MagicNumber, puedes establecer niveles de take profit generales para controlar simultáneamente todas las posiciones abiertas de todos los EAs activos.



    Publicaciones relacionadas

    Comentarios (0)