English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Utilización de la función TesterWithdrawal() para modelizar las retiradas de beneficio

Utilización de la función TesterWithdrawal() para modelizar las retiradas de beneficio

MetaTrader 5Probador | 11 marzo 2014, 10:54
1 205 0
Andriy Voitenko
Andriy Voitenko

Introducción

El objetivo del trading especulativo es conseguir un beneficio. Por lo general, cuando se prueba un sistema de trading, se analizan todos los aspectos, menos el siguiente: la retirada de parte del dinero ganado para vivir. Incluso si el trading no es la única fuente de dinero para el trader, tarde o temprano surgen preguntas sobre el beneficio previsto para un intervalo de trading (mes, trimestre, año). La función TesterWithdrawal() de MQL5 está diseñada para simular las retiradas de dinero de la cuenta.


1. ¿Qué podemos comprobar?

En el trading como en los sistemas de trading, hay opiniones que sugieren retirar el exceso de fondos en situación de riesgo. Solo una pequeña parte del capital corresponde a la cuenta de las operaciones; es una protección frente a la pérdida de todos los fondos a causa de circunstancias imprevistas.

En realidad, es un ejemplo de estrategias de gestión de fondos. Muchos fondos que aceptan la gestión de inversiones proporcionan cierta cuota (una parte de todo el capital) a cada trader, pero nunca se proporciona el capital entero a los traders. En otras palabras, además de los límites sobre el volumen de las posiciones abiertas, hay limitaciones sobre el capital que puede controlar un trader. Al final, cada trader tiene acceso a una pequeña parte de los activos para hacer especulaciones de riesgo.

Otro problema, es la reinversión agresiva de los activos obtenidos durante las pruebas. Los traders intentan que las líneas de saldo y de patrimonio suban hacia arriba durante la optimización. Aunque todo el mundo entiende que hay ciertas reglas para cada nivel del fondo; no tiene ningún sentido creer que un sistema rentable con una operación de 0.1 lotes también lo es con una operación de 100 lotes.

Además, hay un problema psicológico; cualquier trader experimentado reconoce haber intervenido en el trabajo de un sistema de trading hasta cierta cantidad del fondo de la cuenta, aunque haya prometido no hacerlo. Desde este punto de vista, la retirada de los excesos es un factor estabilizador en el trading.

Hay una función en MQL5 destinada a implementar la retirada de fondos durante la prueba de un Asesor Experto. Se explica esto a continuación.


2. ¿Cómo utilizar la función?

La función TesterWithdrawal() se utiliza solo para modelizar la retirada de fondos de la cuenta en el probador de estrategias y no afecta el funcionamiento del Asesor Experto en el modo normal. 

bool TesterWithdrawal(double money);

El parámetro de entrada money se utiliza para determinar la cantidad de fondos a retirar en la divisa del depósito. Mediante el valor devuelto puede averiguar si la operación ha tenido éxito. Se muestra cada operación de retirada realizada durante la prueba con la entrada correspondiente en la pestaña "Diario" (Journal) y en la pestaña "Resultados" (Results) que se muestran en la figura 1.

Entradas sobre las retiradas satisfactorias de activos durante la prueba

 Figura 1. Entradas sobre la retirada satisfactoria de activos durante la prueba

Si el tamaño de la retirada supera el tamaño del margen libre y no se ha llevado a cabo la retirada, aparecerá la siguiente entrada en el "Diario":

 Entrada sobre retirada infructuosa de activos durante la prueba

Figura 2. Entrada sobre retirada infructuosa de activos durante la prueba

Al llamar a esta función, el tamaño del saldo y del patrimonio se reduce en función de la cantidad del fondo retirado. Sin embargo, el probador de estrategias no tiene en cuenta la retirada durante el cálculo de las pérdidas y ganancias, pero calcula la suma total de las retiradas en el ritmo de "Withdrawal", como se muestra en la figura 3

Ritmo de la suma total de las retiradas en el informe

Figura 3. Cuota de la suma total de las retiradas en el informe

Cabe destacar que en MQL5 aún no existe una función inversa de depósito de activos en una cuenta de trading, es poco probable que se lleve a cabo. ¿Quién necesita sistemas que requieran un aumento constante del depósito?

La siguiente sección está dedicada a un ejemplo de un Asesor Experto, no solo con la estrategia de trading implementada, pero con un conjunto de herramientas para modelizar las retiradas de fondos mediante la función que hemos visto..


3. Un conejillo de indias para las pruebas

  
Vamos a realizar las pruebas con un Asesor Experto bastante sencillo. Los que están interesados en los principios de las operaciones de los Asesores Expertos pueden encontrar la descripción de su sistema de trading a continuación.

Se calculan los valores máximos y mínimos de los precios en un intervalo determinado de datos de 5M, que se establece mediante la variable de entrada PERIOD. Los niveles calculados forman un canal horizontal con las líneas de soporte (la variable CalcLow) y resistencia (la variable CalcHigh). Se colocan las órdenes pendientes en los límites del canal. Todo se decide en los límites de perforación del canal.

Se coloca una orden pendiente cuando el precio se mueve dentro del canal con un valor no inferior al valor de la variable de entrada INSIDE_LEVEL. Además, solo se puede abrir una posición u orden pendiente en una dirección.

Si el canal se estrecha cuando se recalculan los niveles, y el precio aún se mantiene dentro, entonces se mueve la orden pendiente cerca del precio del mercado. Se establece el paso del movimiento de las órdenes pendientes mediante la variable de entrada ORDER_STEP.

Se especifica el tamaño de beneficio de una transacción en la variable de entrada TAKE_PROFIT, y la pérdida máxima mediante STOP_LOSS. 

El Asesor Experto implica mover el Stop Loss con un paso indicado en la variable de entrada TRAILING_STOP.

Puede operar tanto con un lote fijado o con uno calculado como un porcentaje del depósito. Se establece el valor del lote mediante la variable de entrada LOT, y se establece el método de cálculo del lote mediante la variable LOT_TYPE. Existe la posibilidad de corrección del lote (LOT_CORRECTION = true). Si realiza una operación con un lote fijado y su tamaño excede el valor permitido para la apertura de una posición, se corrige el tamaño del lote al valor permitido más cercano.

Para ajustar el algoritmo del Asesor Experto, puede activar la función de escritura del registro (WRITE_LOG_FILE = true). De modo que las entradas relacionadas con todas las operaciones de trading se vayan escribiendo en el archivo de texto log.txt.

Vamos a añadir varias variables de entrada al Asesor Experto para la gestión de los fondos retirados.

Se va a utilizar el primer parámetro para señalar la posibilidad de retirada de activos.

input bool WDR_ENABLE = true; // Allow withdrawal

 El segundo parámetro va a determinar la periodicidad de las retiradas.

enum   wdr_period
  {
   days      = -2, // Day
   weeks     = -1, // Week 
   months    =  1, // Month  
   quarters  =  3, // Quarter
   halfyears =  6, // Half a year    
   years     = 12  // Year    
  };

input wdr_period WDR_PERIOD = weeks; // Periodicity of withdrawals
  El tercer parámetro establecerá la cantidad del fondo a retirar.
input double WDR_VALUE = 1; // Amount of money to be withdrawn

El cuarto parámetro determinará el método de cálculo de la cantidad a retirar.

enum lot_type 
   {
      fixed,  // Fixed
      percent // Percentage of deposit
   };
input lot_type WDR_TYPE = percent; // Method of calculation of the withdrawal amount

Para calcular la cantidad de una retirada de fondo de la cuenta, se utiliza wdr_value. La variable wdr_summa se utiliza para el cálculo de la cantidad total del fondo a retirar.

También calcularemos el número total de operaciones satisfactorias de retirada mediante la variable wdr_count. Los valores de estas variables son necesarios para realizar nuestro propio informe acerca de los resultados de la prueba. A continuación, se implementa la función entera de la retirada de fondos.

//--- Function of withdrawing assets from the account
//+------------------------------------------------------------------+
bool TimeOfWithDrawal()
//+------------------------------------------------------------------+
  {
   if(!WDR_ENABLE) return(false); // exit if withdrawal is prohibited
   
   if( tick.time > dt_debit + days_delay * DAY) // periodic withdrawals with specified period
     {
      dt_debit = dt_debit + days_delay * DAY;
      days_delay = Calc_Delay();// Updating the value of period-number of days between withdrawal operations
      
      if(WDR_TYPE == fixed) wdr_value = WDR_VALUE;
      else wdr_value = AccountInfoDouble(ACCOUNT_BALANCE) * 0.01 * WDR_VALUE;

      if(TesterWithdrawal(wdr_value))
        {
         wdr_count++;
         wdr_summa = wdr_summa + wdr_value;
         return(true);
        }
     }
   return(false);
  }

Ahora tenemos que preparar nuestro Asesor Experto para realizar la prueba en el modo de optimización. Habrá varios parámetros de optimización, así que vamos a declarar una variable de entrada mediante la cual elegiremos el parámetro necesario.

enum opt_value
{
   opt_total_wdr,      // Total sum of withdrawal
   opt_edd_with_wdr,   // Drawdown with consideration of withdrawal
   opt_edd_without_wdr // Drawdown without consideration of withdrawal
};
input opt_value OPT_PARAM = opt_total_wdr; // Optimization by the parameter

También necesitamos añadir otra función relevante al Asesor Experto - OnTester(); el valor devuelto por esta función determina el criterio de optimización.

//--- Displaying information about testing
//+------------------------------------------------------------------+
double OnTester(void)
//+------------------------------------------------------------------+
  {
   //--- Calculation of parameters for the report
   CalculateSummary(initial_deposit);
   CalcEquityDrawdown(initial_deposit, true, false);
   //--- Creation of the report
   GenerateReportFile("report.txt");

   //--- Returned value is the optimization criterion
   if (OPT_PARAM == opt_total_wdr) return(wdr_summa);
   else return(RelEquityDrawdownPercent);
  }

En la siguiente sección se analizan en detalle las pruebas de nuestro Asesor Experto.


4. Pruebas del Asesor Experto

Para una realizar una prueba exhaustiva, necesitamos en primer lugar obtener los resultados de la prueba de nuestro Asesor Experto pero con la función de retirada desactivada. Para hacerlo, antes de la prueba, asignamos el valor false al parámetro "Allow withdrawal" como se muestra en la figura 5.

Para los que están interesados en repetir los resultados de las pruebas, está la configuración y los valores de los parámetros de entrada del Asesor Experto que se muestran en las figuras 4 y 5.

Configuración de la prueba del Expert Advisor

Figura 4. Configuración de la prueba del Asesor Experto

 Parámetros del Expert Advisor con la función de retirada desactivada

 Figura 5. Parámetros del Asesor Experto con la función de retirada desactivada

Los resultados obtenidos al finalizar la prueba se muestran en las figuras 6 y 7.

 Variación de saldo durante 6 meses de funcionamiento de prueba del Expert Advisor

  Figura 6. Variación de saldo para 6 meses de funcionamiento de prueba del Asesor Experto 

 La tabla de los resultados del funcionamiento del Expert Advisor

Figura 7. La tabla de los resultados del funcionamiento del Asesor Experto

El parámetro que nos interesa es la reducción relativa del patrimonio. En este caso es el 4.75%. 

Vamos a comprobar ahora cómo cambia este parámetro al activar las retiradas de fondos. Vamos a realizar pruebas con distintas cantidades y periodicidades de retiradas.

La figura 8 muestra los parámetros del Asesor Experto con la optimización y las retiradas activadas; y la figura 9 muestra los resultados de dicha prueba.

Los parámetros del Expert Advisor con la optimización y las retiradas activadas

 Figura 8. Los parámetros del Asesor Experto con la optimización y las retiradas activadas

Resultados del cálculo de la reducción relativa del patrimonio

Figura 9. Resultados del cálculo de la reducción relativa del patrimonio

El resultado es un poco sorprendente, ya que la reducción es más pequeña con la periodicidad de retirada de un día o una semana que con las retiradas desactivadas del todo.

Además, la línea de reducción diaria aumenta al 100% y luego vuelve a disminuir al 8% y sigue disminuyendo. Para interpretar los resultados correctamente, necesita saber de qué forma se calcula la reducción relativa del patrimonio en el probador de estrategias. Este es el tema de la siguiente sección.


5. El cálculo de la reducción del patrimonio

Las mentes curiosas querrán saber cómo se lleva a cabo el cálculo del patrimonio en el probador de estrategias, y cómo lo pueden calcular por su cuenta.

Si la función TesterWithdrawal() no está siendo utilizada en su Asesor Experto, entonces el cálculo de este parámetro no se diferencia del cálculo que se hace en MetaTrader 4; está descrito en el artículo "Lo que significan los números en el informe de prueba del Asesor Experto" ; su código fuente y el de muchos parámetros más del informe de prueba resultante están presentes en el artículo "Cómo evaluar los resultados de la prueba de un Asesor Experto".

Una descripción gráfica del cálculo de la reducción relativa y máxima en el probador de estrategias se muestra en la figura 10, que viene a continuación.

Cálculo de las reducciones de patrimonio sin tener en cuenta las retiradas 

Figura 10. Cálculo de las reducciones de patrimonio sin tener en cuenta las retiradas

Durante su funcionamiento, el probador de estrategias determina los valores máximos y mínimos actuales del patrimonio. Con la aparición de un nuevo máximo de patrimonio, que está marcado en el gráfico con una marca de comprobación azul, se calculan las reducciones máxima y mínima y se guarda el valor más grande para mostrarlo en el informe de los resultados.

Lo importante es el último cálculo de los parámetros al final de la prueba, ya que puede surgir una situación en la cual el último extremo no registrado del patrimonio, proporciona el valor máximo de la reducción. Se muestran los cambios de los valores de la reducción máxima y relativa con los colores azul y rojo respectivamente. El color gris representa la reducción registrada cada vez que llega un nuevo máximo.

Cabe señalar que la llamada de la función TesterWithDrawal() cambia el algoritmo del cálculo de las reducciones en el probador de estrategias. La diferencia con la variante anterior es el cálculo de los valores de la reducción, no solo con los nuevos máximos de patrimonio, sino también con las retiradas de activos. La prueba gráfica de esto se muestra en la figura 11.

Cálculo de las reducciones teniendo en cuenta las retiradas 

 Figura 11. Cálculo de las reducciones teniendo en cuenta las retiradas

Los momentos de retirada de activos están señalados con marcas verdes en la imagen de arriba. Las retiradas de fondos son muy frecuentes, de modo que no se permiten los valores máximos de retirada, determinados por los extremos en el gráfico, y que hay que fijar. Como resultado, la reducción obtenida teniendo en cuenta las retiradas puede ser inferior a aquella obtenido sin tenerlas en cuenta, tal y como se muestra en la figura 9.

Si las retiradas de fondos son mucho más elevadas que el crecimiento del patrimonio resultante de las ganancias obtenidas, la tasa de las reducciones puede bajar. La razón es que este caso no permite la formación de los extremos en el gráfico; y en el límite se mostrará una disminución en línea recta, donde la reducción relativa tiende a cero. En el gráfico de la figura 9, se muestra que el efecto comenzó a aparecer con las retiradas diarias superiores a 1000 $.

Vamos a proceder al cálculo de la reducción máxima y relativa del patrimonio en MQL5 mediante la combinación del algoritmo entero en un procedimiento único CalcEquityDrawdown, como se describe a continuación.

double RelEquityDrawdownPercent; // relative drawdown of equity in percentage terms
double MaxEquityDrawdown;        // maximal drawdown of equity
//--- Calculation of the drawdown of equity
//+------------------------------------------------------------------+
void CalcEquityDrawdown(double initial_deposit, // initial deposit
                        bool finally)          // flag of calculation that registers extremums
//+------------------------------------------------------------------+
  {
   double drawdownpercent;
   double drawdown;
   double equity;
   static double maxpeak = 0.0, minpeak = 0.0;

   //--- exclusion of consideration of profit withdrawals for the calculation of drawdowns
   if(wdr_ignore) equity = AccountInfoDouble(ACCOUNT_EQUITY) + wdr_summa;
   else equity = AccountInfoDouble(ACCOUNT_EQUITY);

   if(maxpeak == 0.0) maxpeak = equity;
   if(minpeak == 0.0) minpeak = equity;

   //--- check of conditions of extremum
   if((maxpeak < equity)||(finally))
    {
      //--- calculation of drawdowns
      drawdown = maxpeak - minpeak;
      drawdownpercent = drawdown / maxpeak * 100.0;

      //--- Saving maximal values of drawdowns
      if(MaxEquityDrawdown < drawdown) MaxEquityDrawdown = drawdown;
      if(RelEquityDrawdownPercent < drawdownpercent) RelEquityDrawdownPercent = drawdownpercent;
    
      //--- nulling the values of extremums
      maxpeak = equity;
      minpeak = equity;
    }

   if(minpeak > equity) minpeak = equity;
 }

Para garantizar unos cálculos precisos, tenemos que llamar al procedimiento escrito arriba desde nuestro Asesor Experto cada vez que llega un nuevo tick con los parámetros proporcionados a continuación.

CalcEquityDrawdown(initial_deposit, false);

Además, para obtener valores fiables de las reducciones, al final del Asesor Experto hay que llamar también a la función OnTester() con el parámetro finally = true que indica que el cálculo ha finalizado. Y si la reducción actual no fijada es superior al máximo registrado, sustituirá al máximo y se mostrará en el informe resultante.

CalcEquityDrawdown(initial_deposit, true);

Si el algoritmo de las retiradas está implementado en un Asesor Experto, entonces para un cálculo correcto de las reducciones, tiene que llamar a la función CalcEquityDrawdown con el parámetro finally=true cada vez que se realiza una retirada. La orden de llamada puede ser de la siguiente forma:

//--- Withdrawing assets and calculating drawdowns of equity
if(TimeOfWithDrawal())
    CalcEquityDrawdown(initial_deposit, true);
else 
    CalcEquityDrawdown(initial_deposit, false);

Para estar seguros de la exactitud de la metodología descrita antes, vamos a comparar los datos calculados con los datos del probador de estrategias. Para hacerlo, tenemos que hacer que la función OnTester() devuelva el valor del parámetro que queremos comprobar -la reducción relativa del patrimonio que está guardada en la variable RelEquityDrawdownPercent.

Se implementa en el código del Asesor Experto mediante la asignación del valor de "Drawdown with consideration of withdrawal" para el parámetro de entrada "Optimization by the parameter". No hay que modificar el resto de parámetros tal y como se muestra en la figura 8. Se muestran los resultados de esta prueba en la figura 12.

 Comparación de los resultados de nuestros cálculos con los datos del probador de estrategias

 Figura 12. Comparación de los resultados de nuestros cálculos con los datos del probador de estrategias

La comparación de los resultados obtenidos confirma que el algoritmo de cálculo de la reducción relativa es correcto.

Vamos a añadir otra variante al cálculo de la reducción. En ella, vamos a excluir la influencia de las retiradas de fondos en el patrimonio; y observamos el cambio de la reducción relativa del patrimonio.

Para este propósito, vamos a añadir una variable al Asesor Experto, la utilizaremos para determinar si es necesario tener en cuenta las retiradas al calcular los parámetros del Asesor Experto.

bool wdr_ignore; // calculation of rate without the consideration of withdrawals

El valor de wdr_ignore es igual a true si se cambia la variable "Optimization by the parameter" a "Drawdown without consideration of withdrawal".

Además, es necesario corregir el procedimiento de cálculo de la reducción CalcEquityDrawdown, añadiendo el procesamiento de este parámetro tal y como se muestra a continuación.

if (wdr_ignore) 
  equity = AccountInfoDouble(ACCOUNT_EQUITY) + wdr_summa;
else 
  equity = AccountInfoDouble(ACCOUNT_EQUITY);

Ahora, todo está listo para obtener nuevos valores de las reducciones. Vamos a realizar las pruebas con el nuevo algoritmo de cálculo activado. Se muestran los resultados de la prueba en la figura 13.

Resultados del cálculo de la reducción sin tener en cuenta las retiradas 

Figura 13. Resultados del cálculo de la reducción sin tener en cuenta las retiradas

Los resultados muestran que la reducción no depende ni de la retirada de activos, ni de la cantidad del fondo retirado. Por lo tanto, hemos obtenido un factor puro al que no afecta la función TesterWithDrawal(). Sin embargo, para el uso de este tipo de cálculo, tenemos que corregir los valores de las pérdidas y ganancias, ya que sus valores reales han cambiado, y estos factores no son correctos en el informe resultante del probador.

Vamos a calcular la ganancia, la pérdida y su relación (rentabilidad) y guardar los valores obtenidos en un archivo de texto. Este es el procedimiento de cálculo de los parámetros enumerados.

double SummaryProfit;     // Total net profit
double GrossProfit;       // Gross profit
double GrossLoss;         // Gross loss
double ProfitFactor;      // Profitability
//--- Calculation of parameters for the report
//+------------------------------------------------------------------+
void CalculateSummary(double initial_deposit)
//+------------------------------------------------------------------+
  {
   double drawdownpercent, drawdown;
   double maxpeak = initial_deposit, 
          minpeak = initial_deposit, 
          balance = initial_deposit;
          
   double profit = 0.0;
   
   //--- Select entire history
   HistorySelect(0, TimeCurrent());
   int trades_total = HistoryDealsTotal();

   //--- Searching the deals in the history
   for(int i=0; i < trades_total; i++)
     {
      long ticket = HistoryDealGetTicket(i);
      long type   = HistoryDealGetInteger(ticket, DEAL_TYPE);

      //--- Initial deposit is not considered
      if((i == 0)&&(type == DEAL_TYPE_BALANCE)) continue;

      //--- Calculation of profit
      profit = HistoryDealGetDouble(ticket, DEAL_PROFIT) +
                 HistoryDealGetDouble(ticket, DEAL_COMMISSION) +
               HistoryDealGetDouble(ticket, DEAL_SWAP);
      
      balance += profit;

      if(minpeak > balance) minpeak = balance;

      //---
      if((!wdr_ignore)&&(type != DEAL_TYPE_BUY)&&(type != DEAL_TYPE_SELL)) continue;

      //---
      if(profit < 0) GrossLoss   += profit;
      else           GrossProfit += profit;
      SummaryProfit += profit;
     }

   if(GrossLoss < 0.0) GrossLoss *= -1.0;
   //--- Profitability
   if(GrossLoss > 0.0) ProfitFactor = GrossProfit / GrossLoss;
  }

A continuación se proporciona la función para generar el informe en un archivo de texto.

//--- Forming the report  
//+------------------------------------------------------------------+
void GenerateReportFile(string filename)
//+------------------------------------------------------------------+
  {
   string str, msg;

   ResetLastError();
   hReportFile = FileOpen(filename, FILE_READ|FILE_WRITE|FILE_TXT|FILE_ANSI);
   if(hReportFile != INVALID_HANDLE)
     {

      StringInit(str,65,'-'); // separator

      WriteToReportFile(str);
      WriteToReportFile("| Period of testing: " + TimeToString(first_tick.time, TIME_DATE) + " - " +
                        TimeToString(tick.time,TIME_DATE) + "\t\t\t|");
      WriteToReportFile(str);

      //----
      WriteToReportFile("| Initial deposit \t\t\t"+DoubleToString(initial_deposit, 2));
      WriteToReportFile("| Total net profit    \t\t\t"+DoubleToString(SummaryProfit, 2));
      WriteToReportFile("| Gross profit     \t\t\t"+DoubleToString(GrossProfit, 2));
      WriteToReportFile("| Gross loss      \t\t\t"+DoubleToString(-GrossLoss, 2));
      if(GrossLoss > 0.0)
         WriteToReportFile("| Profitability       \t\t\t"+DoubleToString(ProfitFactor,2));
      WriteToReportFile("| Relative drawdown of equity \t"+
                        StringFormat("%1.2f%% (%1.2f)", RelEquityDrawdownPercent, MaxEquityDrawdown));

      if(WDR_ENABLE)
        {
         StringInit(msg, 10, 0);
         switch(WDR_PERIOD)
           {
            case day:     msg = "day";    break;
            case week:    msg = "week";  break;
            case month:   msg = "month";   break;
            case quarter: msg = "quarter"; break;
            case year:    msg = "year";     break;
           }

         WriteToReportFile(str);
         WriteToReportFile("| Periodicity of withdrawing       \t\t" + msg);

         if(WDR_TYPE == fixed) msg = DoubleToString(WDR_VALUE, 2);
         else msg = DoubleToString(WDR_VALUE, 1) + " % from deposit " + DoubleToString(initial_deposit, 2);

         WriteToReportFile("| Amount of money withdrawn     \t\t" + msg);
         WriteToReportFile("| Number of withdrawal operations \t\t" + IntegerToString(wdr_count));
         WriteToReportFile("| Withdrawn from account          \t\t" + DoubleToString(wdr_summa, 2));
        }

      WriteToReportFile(str);
      WriteToReportFile(" ");

      FileClose(hReportFile);
     }
  }

El resultado de la ejecución de esta función es la creación de un archivo de texto que contiene informaciones tal y como se muestra en la figura 14.

 Archivo del informe generado por el procedimiento GenerateReportFile

 Figura 14. Archivo del informe generado por el procedimiento GenerateReportFile

La función está escrita de modo que cada nuevo informe se añade a los contenidos ya existentes del archivo. Debido a esto, podemos comparar los valores de los resultados de la prueba con distintos parámetros de entrada del Asesor Experto.

Como puede observar en el informe, al hacer los cálculos sin tener en cuenta la retiradas (tabla inferior), el beneficio neto total es menor y la las pérdidas brutas son mayores debido a la cantidad de fondos retirada, en comparación con los cálculos del probador (tabla superior). Cabe señalar que para obtener el valor real de las ganancias y pérdidas al retirar activos en el probador de estrategias, debe restar el valor del parámetro "Withdrawal" del beneficio neto total y sumarlo a las pérdidas totales.


6. Análisis de los resultados

A partir de los resultados obtenidos de las pruebas llevadas a cabo, podemos sacar varias conclusiones:

  1. La utilización de la función TesterWithDrawal() conduce a cambios en el algoritmo de cálculo de las reducciones en el probador de estrategias. La comparación de distintos Asesores Expertos mediante el valor de la reducción relativa puede ser incorrecta si uno de estos Asesores Expertos contiene un mecanismo de retirada de fondos. Mediante esta función, puede hacer un cálculo práctico de la cantidad de fondos que puede retirar periódicamente de la cuenta en función de un determinado porcentaje aceptable de reducción de patrimonio.
  2. Se puede implementar el uso de esta función como un factor desestabilizador artificial del trading, utilizado para la comprobación de la estabilidad del funcionamiento de sus Asesores Expertos y el ajuste de la lógica del código responsable de la gestión de fondos. Si su Asesor Experto dispone de la lógica para la toma de decisiones en base a los niveles de saldo y patrimonio, entonces el uso de esta función le da unas posibilidades adicionales para las pruebas y los ajustes.
  3. A la hora de calcular la reducción relativa sin tener en cuenta las retiradas, mediante el algoritmo descrito en el artículo, puede obtener un valor puro de la reducción relativa al que no afecta el uso de esta función.


Conclusión 

En este artículo se describe el uso de la función TesterWithdrawal() para modelizar el proceso de retiradas de activos desde la cuenta, y su influencia en el algoritmo de cálculo de la reducción de saldo en el probador de estrategias. 


Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/131

Archivos adjuntos |
testexpert.mq5 (33.95 KB)
La escritura de un Asesor Experto mediante las librerías estándar de las clase de trading de MQL5 La escritura de un Asesor Experto mediante las librerías estándar de las clase de trading de MQL5
En este artículo se describe la manera de utilizar las principales funcionalidades de la librería estándar de las clases de trading de MQL5 en la escritura de Asesores Expertos que implementan el cierre y la modificación de una posición, colocan una orden pendiente y comprueban el margen antes de colocar una operación. También se muestra el modo de utilizar las clases de trading en la obtención de los detalles de una orden y una operación.
El método óptimo para el cálculo del volumen total de una posición mediante un número mágico determinado El método óptimo para el cálculo del volumen total de una posición mediante un número mágico determinado
En este artículo se analiza el problema del cálculo del volumen total de la posición de un determinado símbolo y número mágico. El método propuesto requiere solamente la parte estrictamente necesaria del historial de las transacciones, encuentra el tiempo más próximo cuando el total de la posición es igual a cero, y lleva a cabo los cálculos con las últimas transacciones. También se analiza el trabajo del terminal de cliente con variables globales.
Control de la pendiente de la curva de balance durante el funcionamiento de un Expert Advisor Control de la pendiente de la curva de balance durante el funcionamiento de un Expert Advisor
Encontrar reglas para un sistema de trading y programarlas en un Expert Advisor es la mitad del trabajo. De algún modo, hay que corregir el funcionamiento del Expert Advisor, ya que acumula los resultados del trading. En este artículo se describe una de las metodologías que permite mejorar el rendimiento de un Expert Advisor a través de una retroalimentación que mide la pendiente de la curva de balance.
Escribir un Expert Advisor mediante la programación orientada a objetos de MQL5 Escribir un Expert Advisor mediante la programación orientada a objetos de MQL5
Este artículo se centra en enfoque orientado a objetos para hacer lo que hicimos en el artículo "Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes" -creando un sencillo Expert Advisor. La mayoría de la gente piensa que esto es muy difícil, pero le quiero garantizar que al finalizar la lectura de este artículo, será capaz de escribir su propio Expert Advisor basado en la orientación a objetos.