English Русский 中文 Deutsch 日本語 Português
preview
Kit de herramientas de negociación MQL5 (Parte  5): Ampliación de la libreria EX5 de gestión del historial con funciones de posición

Kit de herramientas de negociación MQL5 (Parte 5): Ampliación de la libreria EX5 de gestión del historial con funciones de posición

MetaTrader 5Ejemplos |
283 0
Wanateki Solutions LTD
Kelvin Muturi Muigua

Introducción

En el artículo anterior, comenzamos a desarrollar las funciones principales de la libreria HistoryManager EX5, que constituye el motor central responsable de recuperar, clasificar y categorizar datos históricos en diversos tipos, incluyendo órdenes, operaciones, órdenes pendientes y posiciones. La mayoría de estas funciones se diseñaron para funcionar en segundo plano, sin que los usuarios de la libreria se dieran cuenta, y no eran directamente accesibles. Las únicas funciones exportables eran las funciones de impresión, que permitían a los usuarios generar listas descriptivas sencillas de órdenes, operaciones, órdenes pendientes o posiciones en el registro de MetaTrader 5.

En este artículo, ampliaremos el código fuente HistoryManager.mq5 introduciendo funciones adicionales accesibles para el usuario que se basan en las funciones fundamentales que creamos en el artículo anterior. Estas nuevas funciones permitirán a los usuarios de la libreria consultar sin esfuerzo los datos del historial comercial. Los usuarios podrán recuperar datos clave, como la duración de la operación en segundos, los tickets de apertura y cierre de la última posición cerrada, si la posición se inició mediante una orden pendiente o una entrada directa en el mercado, métricas basadas en pips como el beneficio, el stop loss y el take profit, así como el beneficio neto tras contabilizar gastos como comisiones y swaps. Todo esto le permitirá importar la libreria EX5 en sus proyectos MQL5 y poder consultar el historial de varias posiciones con un mínimo esfuerzo mediante llamadas de función sencillas.

Para empezar, abriremos el archivo HistoryManager.mq5 del artículo anterior y comenzaremos creando la función GetTotalDataInfoSize(). El archivo fuente inicial HistoryManager.mq5 se adjunta al final del artículo anterior o también se puede encontrar al final de este artículo (HistoryManager_Part1.mq5). Continuaremos añadiendo nuevo código debajo de la función PrintPendingOrdersHistory(), que es donde lo dejamos anteriormente.


Obtener función de tamaño total de datos

La función GetTotalDataInfoSize() está diseñada para recuperar y devolver el tamaño de una matriz de datos históricos especificada. Esta función trabaja en conjunto con la función FetchHistoryByCriteria(), lo que garantiza que podamos determinar dinámicamente la cantidad de datos disponibles en una estructura de datos específica. Su función principal es identificar qué conjunto de datos nos interesa (operaciones, órdenes, posiciones u órdenes pendientes) y devolver el número total de elementos de ese conjunto de datos.

La función GetTotalDataInfoSize() ayudará a optimizar las operaciones en las que se requiere acceso dinámico a diversos conjuntos de datos históricos. Al pasar los criterios adecuados como argumento, consultaremos de manera eficiente el tamaño de la estructura de datos relevante.

Comenzaremos definiendo la firma de la función. Dado que esta función devuelve un enteroque representa el tamaño de una matriz de datos especificada, utiliza un tipo de retorno int. El parámetro o argumento de entrada es un entero sin signo (uint), lo que nos permitirá pasar constantes predefinidas para especificar el tipo de datos que estamos consultando.

int GetTotalDataInfoSize(uint dataToGet)
  {
//-- Our function's code will go here
  }

A continuación, declararemos una variable local, totalDataInfo, que almacenará el tamaño del conjunto de datos solicitado.

int totalDataInfo = 0;

Usaremos una instrucción switch para comprobar el valor del parámetro dataToGet. En función de su valor, identificaremos el conjunto de datos correspondiente y utilizaremos la función ArraySize() para determinar su tamaño.

  • Datos del historial de transacciones: Si dataToGet es igual a GET_DEALS_HISTORY_DATA, calcularemos el tamaño de la matriz dealInfo y lo guardaremos en totalDataInfo.
  • Datos del historial de órdenes: Si dataToGet es igual a GET_ORDERS_HISTORY_DATA, calcularemos el tamaño de la matriz orderInfo y lo guardaremos en totalDataInfo.
  • Datos históricos de posiciones: Para GET_POSITIONS_HISTORY_DATA, calcularemos el tamaño de la matriz positionInfo y lo guardaremos en totalDataInfo.
  • Datos de órdenes pendientes: Cuando dataToGet coincida con GET_PENDING_ORDERS_HISTORY_DATA, determinaremos el tamaño de la matriz pendingOrderInfo y lo guardaremos en totalDataInfo.
  • Caso predeterminado: Si ninguna de las constantes predefinidas coincide, estableceremos totalDataInfo en 0 como alternativa.

Por último, devolveremos el valor almacenado en totalDataInfo después de salir del switch. Esto garantizará que la función genere el tamaño correcto para el tipo de datos especificado o 0 si no se proporciona ningún tipo de datos válido.

switch(dataToGet)
  {
   case GET_DEALS_HISTORY_DATA:
      totalDataInfo = ArraySize(dealInfo);
      break;

   case GET_ORDERS_HISTORY_DATA:
      totalDataInfo = ArraySize(orderInfo);
      break;

   case GET_POSITIONS_HISTORY_DATA:
      totalDataInfo = ArraySize(positionInfo);
      break;

   case GET_PENDING_ORDERS_HISTORY_DATA:
      totalDataInfo = ArraySize(pendingOrderInfo);
      break;

   default:
      totalDataInfo = 0;
      break;
  }
return(totalDataInfo);

A continuación se muestra la implementación completa de la función GetTotalDataInfoSize() con todos los segmentos de código en su secuencia correcta.

int GetTotalDataInfoSize(uint dataToGet)
  {
   int totalDataInfo = 0; //- Saves the total elements of the specified history found
   switch(dataToGet)
     {
      case GET_DEALS_HISTORY_DATA: //- Check if we have any available deals history data
         totalDataInfo = ArraySize(dealInfo); //- Save the total deals found
         break;

      case GET_ORDERS_HISTORY_DATA: //- Check if we have any available orders history data
         totalDataInfo = ArraySize(orderInfo); //- Save the total orders found
         break;

      case GET_POSITIONS_HISTORY_DATA: //- Check if we have any available positions history data
         totalDataInfo = ArraySize(positionInfo); //- Save the total positions found
         break;

      case GET_PENDING_ORDERS_HISTORY_DATA: //- Check if we have any available pending orders history data
         totalDataInfo = ArraySize(pendingOrderInfo); //- Save the total pending orders found
         break;

      default: //-- Unknown entry
         totalDataInfo = 0;
         break;
     }
   return(totalDataInfo);
  }


Función para recuperar el historial según criterios

Al consultar datos del historial reciente con MQL5, como recuperar las últimas cinco posiciones de compra cerradas para un símbolo específico, no es necesario solicitar el historial completo de la cuenta al servidor, ya que esto desperdiciaría recursos valiosos. En lugar de ello, debería adoptar un enfoque óptimo consultando primero el historial comercial más reciente, por ejemplo, el del día actual. Si los datos específicos que estás buscando no están disponibles dentro de este período, puedes ampliar gradualmente el rango de tiempo hasta encontrar los datos deseados. Este método garantiza la eficiencia y minimiza el uso de recursos, proporcionando el mejor rendimiento al recuperar los datos históricos necesarios.

La función FetchHistoryByCriteria() recupera sistemáticamente datos históricos basándose en criterios específicos, comenzando por las últimas 24 horas y ampliando el periodo de recuperación si es necesario. Comienza verificando los datos más recientes y, si no se encuentra ningún historial relevante, escanea progresivamente los datos más antiguos, primero por semana, hasta un año. Si no se encuentran datos después de escanear todo el año, intentará recuperar todo el historial de cuenta disponible.

La función FetchHistoryByCriteria() servirá como una utilidad clave para recuperar datos comerciales de diferentes períodos y permitirá a la libreria EX5 escanear y recuperar el historial hasta encontrar los datos requeridos. Si no se encuentran datos relevantes, se asegurará de que la libreria pueda seguir intentando recuperar el historial de la cuenta más antiguo o completo.

Comencemos por definir la firma de la función. Dado que esta función será utilizada internamente por los módulos centrales de la libreria, no será exportable.

bool FetchHistoryByCriteria(uint dataToGet)
  {
//-- Our function's code will go here
  }

Definiremos la variable de intervalo, que modula el período de recuperación del historial. Inicialmente, se establecerá en 1 para comenzar con un intervalo de tiempo de 24 horas.

int interval = 1;

Calcularemos el intervalo de tiempo desde hace 24 horas hasta la hora actual.

datetime fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_D1) * interval);
datetime toDateTime = TimeCurrent();

A continuación, utilizaremos la función GetHistoryData() para recuperar los datos dentro del intervalo de tiempo definido.

GetHistoryData(fromDateTime, toDateTime, dataToGet);

Si no se encuentran datos en las últimas 24 horas, entraremos en un bucle en el que incrementaremos el intervalo en una semana cada vez. Continuaremos este proceso hasta escanear un año completo (53 semanas). Durante cada iteración, el rango de tiempo se actualiza para reflejar la semana adicional.

while(GetTotalDataInfoSize(dataToGet) <= 0)
  {
   interval++;
   fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_W1) * interval);
   toDateTime = TimeCurrent();
   GetHistoryData(fromDateTime, toDateTime, dataToGet);

   if(interval > 53)
     {
      break;
     }
  }

Si los datos siguen sin encontrarse tras un año de búsqueda, restableceremos el intervalo de tiempo para cubrir todo el historial de la cuenta (desde el inicio hasta el momento actual). Esto garantiza que se verifique todo el historial disponible.

fromDateTime = 0;
toDateTime = TimeCurrent();
GetHistoryData(fromDateTime, toDateTime, dataToGet);

Por último, comprobaremos si se ha recuperado correctamente algún historial. Si no se encuentran datos después de escanear todo el historial de la cuenta, registraremos el error y devolveremos false. Si se encuentran datos, devolveremos true para indicar que la operación se ha realizado correctamente.

if(GetTotalDataInfoSize(dataToGet) <= 0)
  {
   return(false);
  }
else
  {
   return(true);
  }

Aquí está la implementación completa de la función FetchHistoryByCriteria() con todos los segmentos de código incluidos.

bool FetchHistoryByCriteria(uint dataToGet)
  {
   int interval = 1; //- Modulates the history period

//- Save the history period for the last 24 hours
   datetime fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_D1) * interval);
   datetime toDateTime = TimeCurrent();

//- Get the specified history
   GetHistoryData(fromDateTime, toDateTime, dataToGet);

//- If we have no history in the last 24 hours we need to keep increasing the retrieval
//- period by one week untill we scan a full year (53 weeks)
   while(GetTotalDataInfoSize(dataToGet) <= 0)
     {
      interval++;
      fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_W1) * interval);
      toDateTime = TimeCurrent();
      GetHistoryData(fromDateTime, toDateTime, dataToGet);

      //- If no history is found after a one year scanning period, we exit the while loop
      if(interval > 53)
        {
         break;
        }
     }

//- If we have not found any trade history in the last year, we scan and cache the intire account history
   fromDateTime = 0; //-- 1970 (Epoch)
   toDateTime = TimeCurrent(); //-- Time now
   GetHistoryData(fromDateTime, toDateTime, dataToGet);

//- If we still havent retrieved any history in the account, we log this info by
//- printing it and exit the function by returning false
   if(GetTotalDataInfoSize(dataToGet) <= 0)
     {
      return(false); //- Specified history not found, exit and return false
     }
   else
     {
      return(true); //- Specified history found, exit and return true
     }
  }


Obtener la última función de datos de posición cerrada

La función GetLastClosedPositionData() se encarga de recuperar las propiedades de la última posición cerrada y almacenar estos datos en la referencia lastClosedPositionInfo proporcionada. Esta función se basará en la función FetchHistoryByCriteria() para recuperar los datos relevantes del historial de operaciones, asegurándose de que tiene acceso a la información necesaria sobre las posiciones. Si no se encuentran posiciones cerradas, la función registrará un mensaje de error y devolverá false. Si tiene éxito, recuperará los datos y devolverá true.

Comencemos por definir la firma de la función. Dado que esta función está destinada al uso externo, se exporta y puede ser importada por otros archivos fuente MQL5.

bool GetLastClosedPositionData(PositionData &lastClosedPositionInfo) export
  {
//-- Our function's code will go here
  }

Primero intentaremos recuperar los datos históricos de posiciones disponibles llamando a la función FetchHistoryByCriteria() con el argumento GET_POSITIONS_HISTORY_DATA . Esta llamada a la función buscará en el historial de operaciones disponible para recuperar datos relacionados con la posición.

if(!FetchHistoryByCriteria(GET_POSITIONS_HISTORY_DATA))
  {
   Print(__FUNCTION__, ": No trading history available. Last closed position can't be retrieved.");
   return(false);
  }

Si no hay datos históricos de posición disponibles (es decir, la función FetchHistoryByCriteria() devuelve falso), registramos un mensaje de error utilizando la función Print(), lo que ayuda en la depuración al proporcionar información útil sobre el fallo. A continuación, la función devuelve false, lo que indica que no ha podido recuperar la última posición cerrada.

Si se recuperan correctamente los datos del historial de posiciones, guardaremos la información de la última posición cerrada en la variable lastClosedPositionInfo . Esto se hace asignando el primer elemento de la matriz positionInfo a lastClosedPositionInfo, ya que esta matriz contiene el historial de todas las posiciones, con la posición cerrada más reciente al principio de la matriz. Para concluir la función, devolveremos true para indicar que los datos de la última posición cerrada se han recuperado correctamente y se han almacenado en la variable de referencia proporcionada.

lastClosedPositionInfo = positionInfo[0];
return(true);

Aquí está la implementación completa de la función GetLastClosedPositionData(), con todos los segmentos de código incluidos.

bool GetLastClosedPositionData(PositionData &lastClosedPositionInfo) export
  {
   if(!FetchHistoryByCriteria(GET_POSITIONS_HISTORY_DATA))
     {
      Print(__FUNCTION__, ": No trading history available. Last closed position can't be retrieved.");
      return(false);
     }

//-- Save the last closed position data in the referenced lastClosedPositionInfo variable
   lastClosedPositionInfo = positionInfo[0];
   return(true);
  }


Función de último tipo de posición cerrada

La función LastClosedPositionType() se encargará de determinar el tipo de la última posición cerrada en la cuenta de operaciones y de almacenarla en la variable referenciada lastClosedPositionType. Esta función es una extensión lógica de la función GetLastClosedPositionData() , aprovechando su capacidad para recuperar la última posición cerrada y extraer su tipo específico.

La función LastClosedPositionType() es necesaria en situaciones en las que se necesita analizar el tipo de la operación más reciente, como distinguir entre posiciones de compra y venta o identificar estrategias más complejas basadas en el tipo de posición.

Comencemos por definir la firma de la función. Dado que esta función está destinada a ser utilizada por archivos MQL5 que importan la libreria EX5, la marcaremos como exportable. Esto garantizará que la función sea accesible desde el exterior, mejorando tanto la modularidad como la usabilidad.

bool LastClosedPositionType(ENUM_POSITION_TYPE &lastClosedPositionType) export
  {
//-- Our function's code will go here
  }

Comenzamos declarando una variable local lastClosedPositionInfo de tipo PositionData. Esta variable almacenará temporalmente los detalles de la última posición cerrada, que extraeremos utilizando la función GetLastClosedPositionData().

PositionData lastClosedPositionInfo;

Invocamos la función GetLastClosedPositionData() , pasando lastClosedPositionInfo como argumento. Si la función devuelve true, significa que los datos de la última posición cerrada se han recuperado correctamente.

if(GetLastClosedPositionData(lastClosedPositionInfo))
{
   //- Process the retrieved data
}

Si GetLastClosedPositionData() falla (devuelve false), esta función se cierra inmediatamente y devuelve false para indicar que la operación no se ha podido completar.

Dentro del bloque if, extraemos la propiedad type de lastClosedPositionInfo y la asignamos a la variable referenciada lastClosedPositionType. Esto garantiza que el código de llamada tenga acceso al tipo de la última posición cerrada. Después de guardar correctamente el tipo, devolvemos true para indicar que la operación se ha realizado correctamente y salimos de la función.

lastClosedPositionType = lastClosedPositionInfo.type;
return(true);

Si falla la recuperación de la última posición cerrada, la función omite el bloque if y devuelve directamente false. Esto indica que no se pudo determinar el tipo de posición.

return(false);

Aquí está la implementación completa de la función LastClosedPositionType() con todos los segmentos de código en su orden correcto.

bool LastClosedPositionType(ENUM_POSITION_TYPE &lastClosedPositionType) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionType = lastClosedPositionInfo.type;
      return(true);
     }
   return(false);
  }


Función de volumen de la última posición cerrada

La función LastClosedPositionVolume() se encarga de recuperar el volumen de la posición cerrada más recientemente en el historial de operaciones. Guarda este volumen en la variable referenciada lastClosedPositionVolume.. Si la función LastClosedPositionVolume() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionVolume con el valor volume y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionVolume permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionVolume(double &lastClosedPositionVolume) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionVolume = lastClosedPositionInfo.volume;
      return(true);
     }
   return(false);
  }


Función última posición cerrada por símbolo

La función LastClosedPositionSymbol() se encarga de recuperar el símbolo de la posición cerrada más recientemente en el historial de operaciones. Guarda este símbolo en la variable referenciada lastClosedPositionSymbol. Si la función LastClosedPositionSymbol() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionSymbol con el valor symbol y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionSymbol permanece sin cambios y la función indica el fallo devolviendo false.

bool LastClosedPositionSymbol(string &lastClosedPositionSymbol) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSymbol = lastClosedPositionInfo.symbol;
      return(true);
     }
   return(false);
  }


Función de último ticket de posición cerrada

La función LastClosedPositionTicket() se encarga de recuperar el número de ticket de la posición cerrada más recientemente en el historial de operaciones. Guarda este número de ticket en la variable referenciada lastClosedPositionTicket. Si la función LastClosedPositionTicket() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionTicket con el número de ticket y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionTicket permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionTicket(ulong &lastClosedPositionTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionTicket = lastClosedPositionInfo.ticket;
      return(true);
     }
   return(false);
  }


Función de beneficio de la última posición cerrada

La función LastClosedPositionProfit() se encarga de recuperar la ganancia de la posición cerrada más recientemente en el historial de operaciones. Guarda esta ganancia en la variable referenciada lastClosedPositionProfit. Si la función LastClosedPositionProfit() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionProfit con el valor de la ganancia y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionProfit permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionProfit(double &lastClosedPositionProfit) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionProfit = lastClosedPositionInfo.profit;
      return(true);
     }
   return(false);
  }


Función de beneficio neto de la última posición cerrada

La función LastClosedPositionNetProfit() se encarga de recuperar el beneficio neto de la última posición cerrada en el historial de operaciones. La posición beneficio neto es el valor final después de deducir todos los gastos, como la comisión y los swaps , de la posición beneficio. Guarda este beneficio neto en la variable referenciada lastClosedPositionNetProfit. Si la función LastClosedPositionNetProfit() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionNetProfit con el valor beneficio neto (net profit) y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionNetProfit permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionNetProfit(double &lastClosedPositionNetProfit) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionNetProfit = lastClosedPositionInfo.netProfit;
      return(true);
     }
   return(false);
  }


Función de beneficio en pips (puntos) de la última posición cerrada

La función LastClosedPositionPipProfit() se encarga de recuperar la ganancia en pips de la posición cerrada más recientemente en el historial de operaciones. Guarda este beneficio en pips en la variable referenciada lastClosedPositionPipProfit. Si la función LastClosedPositionPipProfit() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionPipProfit con el valor pip profit y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionPipProfit permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionPipProfit(int &lastClosedPositionPipProfit) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionPipProfit = lastClosedPositionInfo.pipProfit;
      return(true);
     }
   return(false);
  }


Función del precio de cierre de la última posición cerrada

La función LastClosedPositionClosePrice() se encarga de recuperar el precio de cierre de la posición cerrada más recientemente en el historial de operaciones. Guarda este precio de cierre en la variable referenciada lastClosedPositionClosePrice. Si la función LastClosedPositionClosePrice() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionClosePrice con el valor del precio de cierre y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionClosePrice permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionClosePrice(double &lastClosedPositionClosePrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionClosePrice = lastClosedPositionInfo.closePrice;
      return(true);
     }
   return(false);
  }


Función de precio de apertura de la última posición cerrada

La función LastClosedPositionOpenPrice() se encarga de recuperar el precio de apertura de la posición cerrada más recientemente en el historial de operaciones. Guarda este precio de apertura en la variable referenciada lastClosedPositionOpenPrice. Si la función LastClosedPositionOpenPrice() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionOpenPrice con el valor precio de apertura y confirma que la operación se ha realizado correctamente devolviendo true.< Si no se pueden recuperar los datos, la variable lastClosedPositionOpenPrice permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionOpenPrice(double &lastClosedPositionOpenPrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpenPrice = lastClosedPositionInfo.openPrice;
      return(true);
     }
   return(false);
  }


Función de precio de stop loss de la última posición cerrada

La función LastClosedPositionSlPrice() se encarga de recuperar el precio de stop loss de la posición cerrada más recientemente en el historial de operaciones. Guarda este precio de stop loss en la variable referenciada lastClosedPositionSlPrice. Si la función LastClosedPositionSlPrice() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionSlPrice con el valor del precio de stop loss y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionSlPrice permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionSlPrice(double &lastClosedPositionSlPrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSlPrice = lastClosedPositionInfo.slPrice;
      return(true);
     }
   return(false);
  }


Función de precio de take profit de la última posición cerrada

La función LastClosedPositionTpPrice() se encarga de recuperar el precio take profit de la posición cerrada más recientemente en el historial de operaciones. Guarda este precio de take profit en la variable referenciada lastClosedPositionTpPrice. Si la función LastClosedPositionTpPrice() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionTpPrice con el valor del precio de take profit y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionTpPrice permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionTpPrice(double &lastClosedPositionTpPrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionTpPrice = lastClosedPositionInfo.tpPrice;
      return(true);
     }
   return(false);
  }


Función de stop loss en pips (puntos) de la última posición cerrada

La función LastClosedPositionSlPips() se encarga de recuperar el valor stop loss de la posición cerrada más recientemente en puntos (pips). Guarda este valor de stop loss en la variable referenciada lastClosedPositionSlPips. Si la función LastClosedPositionSlPips() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionSlPips con el valor stop loss en pips y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionSlPips permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionSlPips(int &lastClosedPositionSlPips) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSlPips = lastClosedPositionInfo.slPips;
      return(true);
     }
   return(false);
  }


Función de take profit en pips (puntos) de la última posición cerrada

La función LastClosedPositionTpPips() se encarga de recuperar el valor take profit de la posición cerrada más recientemente en puntos (pips). Guarda este valor take profit en la variable referenciada lastClosedPositionTpPips. Si la función LastClosedPositionTpPips() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionTpPips con el valor take profit en pips y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionTpPips permanece sin cambios y la función indica el fallo devolviendo false.

bool LastClosedPositionTpPips(int &lastClosedPositionTpPips) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionTpPips = lastClosedPositionInfo.tpPips;
      return(true);
     }
   return(false);
  }


Función de hora de apertura de la última posición cerrada

La función LastClosedPositionOpenTime() se encarga de recuperar la hora de apertura de la posición cerrada más recientemente. Guarda este tiempo de apertura en la variable referenciada lastClosedPositionOpenTime. Si la función LastClosedPositionOpenTime() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionOpenTime con el valor hora de apertura (open time) y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionOpenTime permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionOpenTime(datetime &lastClosedPositionOpenTime) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpenTime = lastClosedPositionInfo.openTime;
      return(true);
     }
   return(false);
  }


Función de hora de cierre de la última posición cerrada

La función LastClosedPositionCloseTime() se encarga de recuperar la hora de cierre de la posición cerrada más recientemente. Guarda este tiempo de cierre en la variable referenciada lastClosedPositionCloseTime. Si la función LastClosedPositionCloseTime() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionCloseTime con el valor hora de cierre (close time) y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionCloseTime permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionCloseTime(datetime &lastClosedPositionCloseTime) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionCloseTime = lastClosedPositionInfo.closeTime;
      return(true);
     }
   return(false);
  }


Función de swap de la última posición cerrada

La función LastClosedPositionSwap() se encarga de recuperar el valor swap de la posición cerrada más recientemente. Guarda este valor swap en la variable referenciada lastClosedPositionSwap. Si la función LastClosedPositionSwap() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionSwap con el valor swap y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionSwap permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionSwap(double &lastClosedPositionSwap) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSwap = lastClosedPositionInfo.swap;
      return(true);
     }
   return(false);
  }


Función de comisión de la última posición cerrada

La función LastClosedPositionCommission() se encarga de recuperar el valor de la comisión de la posición cerrada más recientemente. Guarda este valor comisión en la variable referenciada lastClosedPositionCommission. Si la función LastClosedPositionCommission() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionCommission con el valor de la comisión y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionCommission permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionCommission(double &lastClosedPositionCommission) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionCommission = lastClosedPositionInfo.commission;
      return(true);
     }
   return(false);
  }


Función del tipo de orden que inició la última posición cerrada

La función LastClosedPositionInitiatingOrderType() se encarga de recuperar el tipo de orden inicial de la posición cerrada más recientemente. Esto nos permite saber si la posición se inició mediante una orden pendiente (Buy Stop, Buy Limit, Sell Stop, Sell Limit, Buy Stop Limit o Sell Stop Limit) o una orden directa de entrada en el mercado. Guarda este tipo de orden inicial en la variable referenciada lastClosedPositionInitiatingOrderType. Si la función LastClosedPositionInitiatingOrderType() obtiene correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionInitiatingOrderType con el valor del tipo de orden que la inició y confirma la operación devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionInitiatingOrderType permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionInitiatingOrderType(ENUM_ORDER_TYPE &lastClosedPositionInitiatingOrderType) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionInitiatingOrderType = lastClosedPositionInfo.initiatingOrderType;
      return(true);
     }
   return(false);
  }


Función de ID de la última posición cerrada

La función LastClosedPositionId() se encarga de recuperar el ID de la posición cerrada más recientemente. Guarda este ID de la posición en la variable referenciada lastClosedPositionId. Si la función LastClosedPositionId() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionId con el valor ID de posición y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionId permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionId(ulong &lastClosedPositionId) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionId = lastClosedPositionInfo.positionId;
      return(true);
     }
   return(false);
  }


Función de posición cerrada iniciada por orden pendiente

La función LastClosedPositionInitiatedByPendingOrder() se encarga de comprobar si la posición cerrada más recientemente se inició a partir de una orden pendiente. Guarda esta información en la variable referenciada lastClosedPositionInitiatedByPendingOrder. Si la función LastClosedPositionInitiatedByPendingOrder() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionInitiatedByPendingOrder con el resultado y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionInitiatedByPendingOrder permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionInitiatedByPendingOrder(bool &lastClosedPositionInitiatedByPendingOrder) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionInitiatedByPendingOrder = lastClosedPositionInfo.initiatedByPendingOrder;
      return(true);
     }
   return(false);
  }


Función del ticket de la orden de apertura de la última posición cerrada

La función LastClosedPositionOpeningOrderTicket() se encarga de recuperar el número de ticket de la orden de apertura de la posición cerrada más recientemente. Guarda este número de ticket en la variable referenciada lastClosedPositionOpeningOrderTicket. Si la función LastClosedPositionOpeningOrderTicket() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionOpeningOrderTicket con el número de ticket y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionOpeningOrderTicket permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionOpeningOrderTicket(ulong &lastClosedPositionOpeningOrderTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpeningOrderTicket = lastClosedPositionInfo.openingOrderTicket;
      return(true);
     }
   return(false);
  }


Función del ticket de la operación de apertura de la última posición cerrada

La función LastClosedPositionOpeningDealTicket() se encarga de recuperar el número de ticket de la operación de apertura de la posición cerrada más recientemente. Guarda este número de ticket de operación en la variable referenciada lastClosedPositionOpeningDealTicket. Si la función LastClosedPositionOpeningDealTicket() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionOpeningDealTicket con el número del ticket de la operación y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionOpeningDealTicket permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionOpeningDealTicket(ulong &lastClosedPositionOpeningDealTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpeningDealTicket = lastClosedPositionInfo.openingDealTicket;
      return(true);
     }
   return(false);
  }


Función del ticket de la operación de cierre de la última posición cerrada

La función LastClosedPositionClosingDealTicket() se encarga de recuperar el número de ticket de la operación de cierre de la posición cerrada más recientemente. Guarda este número de ticket de operación en la variable referenciada lastClosedPositionClosingDealTicket. Guarda este número de ticket de operación en la variable referenciada lastClosedPositionClosingDealTicket. Si no se pueden recuperar los datos, la variable lastClosedPositionClosingDealTicket permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionClosingDealTicket(ulong &lastClosedPositionClosingDealTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionClosingDealTicket = lastClosedPositionInfo.closingDealTicket;
      return(true);
     }
   return(false);
  }


Función del número mágico de la última posición cerrada

La función LastClosedPositionMagic() se encarga de recuperar el número mágico de la posición cerrada más recientemente. Guarda este número mágico en la variable referenciada lastClosedPositionMagic. Si la función LastClosedPositionMagic() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionMagic con el número mágico y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionMagic permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionMagic(ulong &lastClosedPositionMagic) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionMagic = lastClosedPositionInfo.magic;
      return(true);
     }
   return(false);
  }


Función del comentario de la última posición cerrada

La función LastClosedPositionComment() se encarga de recuperar el comentario asociado a la posición cerrada más recientemente. Guarda este comentario en la variable referenciada lastClosedPositionComment. Si la función LastClosedPositionComment() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionComment con el comentario y confirma que la operación se ha realizado correctamente devolviendo true.

bool LastClosedPositionComment(string &lastClosedPositionComment) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionComment = lastClosedPositionInfo.comment;
      return(true);
     }
   return(false);
  }


Función de la duración de la última posición cerrada

Si no se pueden recuperar los datos, la variable lastClosedPositionComment permanece sin cambios y la función indica el error devolviendo false. Guarda esta duración en la variable referenciada lastClosedPositionDuration. Si la función LastClosedPositionDuration() recupera correctamente los datos de la última posición cerrada, actualiza la variable lastClosedPositionDuration con la duración y confirma que la operación se ha realizado correctamente devolviendo true. Si no se pueden recuperar los datos, la variable lastClosedPositionDuration permanece sin cambios y la función indica el error devolviendo false.

bool LastClosedPositionDuration(long &lastClosedPositionDuration) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionDuration = lastClosedPositionInfo.duration;
      return(true);
     }
   return(false);
  }


Conclusión

En este artículo, has aprendido cómo funciones utilitarias más pequeñas y específicas, como las que hemos diseñado para recuperar propiedades concretas de las últimas posiciones cerradas, pueden trabajar juntas para realizar tareas específicas, al tiempo que se mantiene la claridad y la modularidad dentro del código base de la libreria EX5. Al aislar la lógica para extraer diversas propiedades de las posiciones, estas funciones agilizan el proceso de recopilación de datos específicos de forma clara y eficiente.

Para que este artículo sea conciso y conciso, dejaremos para el próximo artículo la creación de funciones de libreria que recuperen las distintas propiedades de las últimas órdenes pendientes completadas y canceladas. En ese artículo, exploraremos estas funciones en detalle, asegurándonos de que estén bien integradas con el marco existente. A continuación, pasaremos a desarrollar un conjunto de funciones de informes analíticos, que permitirán a los usuarios generar resúmenes detallados e informes exhaustivos basados en los datos históricos de las operaciones. Este enfoque paso a paso garantizará la claridad y nos permitirá cubrir cada tema de forma exhaustiva sin abrumarle con tanta información de golpe.

Al final de este artículo, encontrará la última versión del código fuente de la libreria HistoryManager.mq5, que incluye todas las funciones creadas en este artículo, así como las presentadas en el anterior. Gracias por seguirnos y esperamos volver a conectar con usted en el próximo artículo.

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/16681

Archivos adjuntos |
HistoryManager.mq5 (55.17 KB)
Características del Wizard MQL5 que debe conocer (Parte 51): Aprendizaje por refuerzo con SAC Características del Wizard MQL5 que debe conocer (Parte 51): Aprendizaje por refuerzo con SAC
Soft Actor Critic es un algoritmo de aprendizaje por refuerzo que utiliza tres redes neuronales. Una red de actores y dos redes de críticos. Estos modelos de aprendizaje automático se emparejan en una relación maestro-esclavo en la que los críticos se modelan para mejorar la precisión de las previsiones de la red de actores. Al tiempo que introducimos ONNX en esta serie, exploramos cómo estas ideas podrían ponerse a prueba como una señal personalizada de un asesor experto ensamblado por un asistente.
Cambiando a MQL5 Algo Forge (Parte 3): Uso de repositorios de terceros en su propio proyecto Cambiando a MQL5 Algo Forge (Parte 3): Uso de repositorios de terceros en su propio proyecto
Hoy veremos cómo podemos conectar el código de otra persona desde cualquier repositorio en el almacenamiento MQL5 Algo Forge a nuestro proyecto. En el presente artículo, finalmente abordaremos esta tarea prometedora pero también compleja: cómo conectar y utilizar en la práctica bibliotecas de repositorios de terceros del almacenamiento MQL5 Algo Forge en nuestro proyecto.
Redes neuronales en el trading: Transformador jerárquico de doble torre (Final) Redes neuronales en el trading: Transformador jerárquico de doble torre (Final)
Seguimos construyendo el modelo del transformador jerárquico Hidformer de dos torres, diseñado para analizar y predecir series temporales multivariantes complejas. En este artículo llevaremos el trabajo iniciado anteriormente a su conclusión lógica probando el modelo con datos históricos reales.
Creación de un modelo de restricción de tendencia de velas (Parte 10): Estrategia de Cruce Dorado y Cruce de la Muerte (EA) Creación de un modelo de restricción de tendencia de velas (Parte 10): Estrategia de Cruce Dorado y Cruce de la Muerte (EA)
¿Sabías que el Cruce Dorado y el Cruce de la Muerte están entre las estrategias más fiables para detectar tendencias de mercado a largo plazo? Un Cruce Dorado señala una tendencia alcista cuando una media móvil corta cruza por encima de una más larga, mientras que un Cruce de la Muerte indica una tendencia bajista cuando la media corta cruza por debajo. A pesar de su sencillez y eficacia, aplicar estas estrategias manualmente suele llevar a perder oportunidades o a ejecutar operaciones con retraso.