ayuda con un código para cerrar todas la posiciones sell

 
hola comunidad. estoy trabajando en una ea y necesito de alguna función o método para cerrar todas las posiciones sell que esta haya abierto. agradezco su aportación
 
Alexander Dario:
hola comunidad. estoy trabajando en una ea y necesito de alguna función o método para cerrar todas las posiciones sell que esta haya abierto. agradezco su aportación

Hola Alexander, 

Espero que este código te ayude. 

//+------------------------------------------------------------------+
//|                                                        Ayuda.mq5 |
//|                        Copyright 2022, Antonio Simón Del Vecchio |
//|                    https://www.mql5.com/en/users/simondelvecchio |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Antonio Simón Del Vecchio"
#property link      "https://www.mql5.com/en/users/simondelvecchio"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
//+------------------------------------------------------------------+
//| Objetos                                                          |
//+------------------------------------------------------------------+
CTrade Trade;
CPositionInfo Posicion;
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
input int Magic = 123;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CerrarPosiciones(POSITION_TYPE_SELL);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CerrarPosiciones(ENUM_POSITION_TYPE Tipo)
  {
//Recorremos todas las posiciones
   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      //Seleccionamos la posición i
      if(Posicion.SelectByIndex(i))
         //Si el magic de esa posición es igual a Magic y su tipo es Sell, cerrar la posición
         if(Posicion.Magic() == Magic && Posicion.PositionType() == Tipo)
           {
            Trade.PositionClose(Posicion.Ticket(), -1);
           }
     }
  }

//+------------------------------------------------------------------+
 
Antonio Simon Del Vecchio #:

Hola Alexander, 

Espero que este código te ayude. 

Hola Antonio. se lo agradezco muchísimo. ese código me viene de maravillas
 

Hola Antonio y Alexander, el codigo no esta mal, pero ante cualquier falla de ejecución se pudiera quedar alguna operación colgada, les sugiero esta variante que intentaría repetir el cierre si no se ejecuta. Saludos

//-------------------------------

void CerrarPosiciones(ENUM_POSITION_TYPE Tipo)

  {

//Recorremos todas las posiciones

  int i=0;

   while(PositionsTotal()>i)

     {

      //Seleccionamos la posición i

      if(Posicion.SelectByIndex(i))

         //Si el magic de esa posición es igual a Magic y su tipo es Sell, cerrar la posición

         if(Posicion.Magic() == Magic && Posicion.PositionType() == Tipo)

           {

            Trade.PositionClose(Posicion.Ticket(), -1); 

            Sleep(40);// le damos un tiempo al mercado para intentar otra ejecución

           } else i++;

     }

  }

//------------------------------

 
Raudel Umaran Elias #:

Hola Antonio y Alexander, el codigo no esta mal, pero ante cualquier falla de ejecución se pudiera quedar alguna operación colgada, les sugiero esta variante que intentaría repetir el cierre si no se ejecuta. Saludos

//-------------------------------

void CerrarPosiciones(ENUM_POSITION_TYPE Tipo)

  {

//Recorremos todas las posiciones

  int i=0;

   while(PositionsTotal()>i)

     {

      //Seleccionamos la posición i

      if(Posicion.SelectByIndex(i))

         //Si el magic de esa posición es igual a Magic y su tipo es Sell, cerrar la posición

         if(Posicion.Magic() == Magic && Posicion.PositionType() == Tipo)

           {

            Trade.PositionClose(Posicion.Ticket(), -1); 

            Sleep(40);// le damos un tiempo al mercado para intentar otra ejecución

           } else i++;

     }

  }

//------------------------------

hola  Raudel Umaran gracias por el aporte, viene fantástico para asegurar el cierre de las operaciones
 
Raudel Umaran Elias #:

Hola Antonio y Alexander, el codigo no esta mal, pero ante cualquier falla de ejecución se pudiera quedar alguna operación colgada, les sugiero esta variante que intentaría repetir el cierre si no se ejecuta. Saludos

//-------------------------------

void CerrarPosiciones(ENUM_POSITION_TYPE Tipo)

  {

//Recorremos todas las posiciones

  int i=0;

   while(PositionsTotal()>i)

     {

      //Seleccionamos la posición i

      if(Posicion.SelectByIndex(i))

         //Si el magic de esa posición es igual a Magic y su tipo es Sell, cerrar la posición

         if(Posicion.Magic() == Magic && Posicion.PositionType() == Tipo)

           {

            Trade.PositionClose(Posicion.Ticket(), -1); 

            Sleep(40);// le damos un tiempo al mercado para intentar otra ejecución

           } else i++;

     }

  }

//------------------------------

Hola Raudel, 
El problema de utilizar un bucle while y la función sleep es que si por algún motivo no se puede cerrar una posición (que el mercado haya cerrado, el servidor se caiga,...) se va a quedar el bot en ese bucle y no va a poder ejecutar las siguientes rutinas o funciones. En la opción que yo planteo, si no se cierra una posición, en el siguiente tick lo volverá a intentar y ejecutará todo el código del EA y no se quedará pegado en ningún bucle. 
Saludos 
 
Antonio Simon Del Vecchio #:
Hola Raudel, 
El problema de utilizar un bucle while y la función sleep es que si por algún motivo no se puede cerrar una posición (que el mercado haya cerrado, el servidor se caiga,...) se va a quedar el bot en ese bucle y no va a poder ejecutar las siguientes rutinas o funciones. En la opción que yo planteo, si no se cierra una posición, en el siguiente tick lo volverá a intentar y ejecutará todo el código del EA y no se quedará pegado en ningún bucle. 
Saludos 

Hola Simón, en este caso el (for) funcionaría mejor sin duda. Lo q pasa es que por lo general, el cerrar o abrir posiciones sucede bajo determinadas circunstancias del mercado que quizas no se repitan. Ambos códigos, lógicamente, son a modo de ejemplo, pues no tendria sentido tener una funcion OnTick() cerrando todas las posiciones todo el tiempo. 

Si se usa un (for), perfectamente viable, pudiera comprobarse que se cerraron todas las posiciones al final del ciclo y con el while pudiera agregarse un (break) de protección.

Saludos