English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Utilizzo della Funzione TesterWithdrawal() per il Modeling dei Prelievi di Profitto

Utilizzo della Funzione TesterWithdrawal() per il Modeling dei Prelievi di Profitto

MetaTrader 5Tester | 16 dicembre 2021, 10:54
242 0
Andriy Voitenko
Andriy Voitenko

Introduzione

Lo scopo del trading speculativo è ottenere un profitto. Di solito, quando viene testato un sistema commerciale, vengono analizzati tutti gli aspetti tranne il seguente: prelevare una parte del denaro guadagnato per vivere. Anche se il trading non è l'unica fonte di denaro per il trader, le domande sul profitto pianificato per un periodo commerciale (mese, trimestre, anno) sorgono prima o poi. La funzione TesterWithdrawal() in MQL5 è quella destinata all'emulazione dei prelievi di denaro dal conto.


1. Cosa possiamo controllare?

Ci sono opinioni sul trading e sui sistemi di trading che implicano il prelievo di un eccesso di denaro in una situazione rischiosa. Solo una piccola parte del capitale totale si trova sul conto commerciale; questa è una protezione dalla perdita di tutti i soldi come motivo di alcune circostanze impreviste.

In pratica, è un esempio delle strategie di Money Management. Molti fondi che accettano investimenti per la gestione danno una certa quota (una parte del capitale totale) a ciascun trader, ma l'intero capitale non viene mai dato ai trader. In altre parole, oltre ai limiti sul volume delle posizioni aperte, ci sono limitazioni sul capitale che un trader può comandare. Alla fine, ogni trader ha accesso solo a una piccola parte delle attività per fare speculazioni rischiose.

Un altro problema è il reinvestimento aggressivo delle attività guadagnate durante i test. I trader mirano a far salire verticalmente il saldo e le linee azionarie durante l'ottimizzazione. Anche se tutti capiscono che ci sono alcune regole ad ogni livello di denaro; non ha senso credere che un sistema redditizio nel trading con 0,1 lotti sia buono quando si negoziano 100 lotti.

Inoltre c'è un problema psicologico: ogni trader praticante può confessare di intervenire nel funzionamento del sistema di trading a un certo livello di denaro sul conto, anche se hanno promesso di non farlo. Pertanto, da questo punto di vista, il ritiro degli eccessi è un fattore stabilizzante nel trading.

C'è una funzione in MQL5 destinata a implementare il prelievo di denaro durante il test di un Expert Advisor. La prossima sezione è dedicata ad esso.


2. Come utilizzare la funzione?

La funzione TesterWithdrawal() è destinata solo alla modellazione del prelievo di denaro dal conto nel tester di strategia e non influisce sul funzionamento di Expert Advisor in modalità normale. 

bool TesterWithdrawal(double money);

Il parametro di input money è destinato a specificare la quantità di denaro da ritirare nella valuta di deposito. Dal valore restituito è possibile rilevare se l'operazione ha esito positivo. Ogni operazione di prelievo eseguita durante il test viene mostrata con la voce corrispondente nella scheda "Journal" e nella scheda "Risultati", come mostrato nella figura 1.

Voci sul prelievo riuscito delle risorse durante il test

 Figura 1. Voci sul prelievo riuscito delle risorse durante i test

Nel caso in cui l'entità del prelievo superi l'entità del margine libero e il prelievo non venga eseguito, la seguente voce appare nella "Journal":

  Voce sull'operazione di prelievo non riuscita durante il test

Figura 2. Voce sull'operazione di prelievo non riuscita durante il test

Quando si chiama questa funzione, la dimensione del saldo corrente e del patrimonio netto diminuisce dalla quantità di denaro prelevato. Tuttavia, lo Strategy Tester non considera il prelievo nel calcolo del profitto e della perdita, ma calcola la somma totale dei prelievi nel tasso "Prelievo", come mostrato nella figura 3.

Tasso della somma totale dei prelievi nel rapporto

Figura 3. Tasso della somma totale dei prelievi nel rapporto

Va notato che una funzione inversa di deposito di attività su un conto di trading non esiste ancora in MQL5 ed è improbabile che venga implementata. Chi ha bisogno di sistemi che richiedono un costante aumento dei depositi?

La sezione successiva è dedicata all'esempio di un Expert Advisor non solo con una strategia di trading implementata, ma con un toolkit per modellare i prelievi di denaro utilizzando la funzione che osserviamo.


3. Una cavia per i test

  
Condurremo i test su un Expert Advisor piuttosto semplice. Coloro che sono interessati ai principi del funzionamento di Expert Advisor possono trovare la descrizione del suo sistema di trading di seguito.

I valori massimo e minimo del prezzo sono calcolati in un periodo specificato di 5 milioni di dati, che viene impostato utilizzando la variabile di input PERIOD. I livelli calcolati formano un canale orizzontale con le linee di supporto (variabile CalcLow) e di resistenza (variabile CalcHigh). Gli ordini in sospeso vengono effettuati ai bordi del canale. Il gioco si effettua sul buco del canale.

Un ordine in sospeso viene effettuato quando il prezzo entra nel canale per non meno del valore della variabile di input INSIDE_LEVEL. Inoltre, è possibile aprire una sola posizione o un ordine in sospeso in una direzione.

Se il canale diventa più stretto quando i livelli vengono ricalcolati e il prezzo rimane ancora al suo interno, l'ordine in sospeso viene spostato più vicino al prezzo di mercato. Il passaggio di spostamento degli ordini in sospeso viene impostato utilizzando la variabile di input ORDER_STEP.

La dimensione del profitto derivante da un'operazione è specificata nella variabile di input TAKE_PROFIT e la perdita massima viene specificata utilizzando STOP_LOSS. 

L'Expert Advisor implica lo spostamento dello Stop Loss con un passo specificato nella variabile di input TRAILING_STOP.

Puoi fare trading sia con un lotto fisso che con uno calcolato come percentuale del deposito. Il valore del lotto viene impostato utilizzando la variabile di input LOT e il metodo di calcolo del lotto viene impostato utilizzando la variabile LOT_TYPE. Esiste la possibilità di correggere il lotto (LOT_CORRECTION = true). Nel caso in cui si negozia con un lotto fisso e la sua dimensione superi quella consentita per l'apertura di una posizione, la dimensione del lotto viene corretta al valore consentito più vicino.

Per la messa a punto dell'algoritmo di Expert Advisor, è possibile attivare la funzione di scrittura del log (WRITE_LOG_FILE = true). In modo che le voci su tutte le operazioni commerciali vengano scritte nel file di testo log.txt.

Aggiungiamo diverse variabili di input all'Expert Advisor per la gestione dei prelievi di denaro.

I primi parametri saranno utilizzati come un’eventualità di prelievo di beni.

input bool WDR_ENABLE = true; // Allow withdrawal

 Il secondo parametro determinerà la periodicità dei prelievi.

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
 Il terzo parametro imposta la quantità di denaro da prelevare.
input double WDR_VALUE = 1; // Amount of money to be withdrawn

Il quarto parametro determinerà il metodo di calcolo dell'importo da prelevare.

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

Per calcolare l'importo del prelievo una tantum di denaro dal conto, viene utilizzata la wdr_value. La variabile wdr_summa viene utilizzata per calcolare l'importo totale di denaro da prelevare.

Inoltre calcoleremo il numero totale di operazioni di prelievo riuscite utilizzando la variabile wdr_count. I valori di tali variabili sono necessari per formare il nostro rapporto sul risultato del test. L'intera funzionalità di prelievo di denaro è implementata nella funzione seguente.

//--- 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);
  }

Ora dobbiamo preparare il nostro Expert Advisor per i test in modalità di ottimizzazione. Ci saranno diversi parametri di ottimizzazione, quindi scegliamo una variabile di input con la quale sceglieremo il parametro necessario.

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

Inoltre dobbiamo aggiungere un'altra funzione significativa all'Expert Advisor - OnTester(); il valore restituito di questa funzione determina il criterio di ottimizzazione.

//--- 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);
  }

La sezione successiva è dedicata alla considerazione dettagliata dei test del nostro Expert Advisor.


4. Test dell'Expert Advisor

Per l'integrità del test, prima di tutto dobbiamo ottenere i risultati dei test del nostro Expert Advisor con la funzione di prelievo disabilitato. Per farlo, prima del test, impostare il parametro "Consenti prelievo" su false come mostrato in figura 5.

Per coloro che sono interessati a ripetere i risultati dei test, le impostazioni e i valori dei parametri di input dell'Expert Advisor sono riportati di seguito nelle figure 4 e 5.

Impostazioni per il test dell’Expert Advisor

Figura 4. Impostazioni per il test dell’Expert Advisor

  Parametri dell'Expert Advisor con la funzione di prelievo disabilitata

Figura 5. Parametri dell'Expert Advisor con funzione di prelievo disabilitata

I risultati ottenuti al termine dei test sono riportati nelle figure 6 e 7.

  Cambio di equilibrio per 6 mesi di lavoro di prova dell'Expert Advisor

 Figura 6. Cambio di bilancio per 6 mesi di lavoro di prova dell'Expert Advisor 

  La tabella dei risultati di lavoro dell'Expert Advisor

Figura 7. La tabella dei risultati di lavoro dell'Expert Advisor

Il parametro che ci interessa è il relativo drawdown del capitale. In questo caso, è pari al 4,75%. 

Ora controlliamo come cambia questo parametro se abilitiamo i prelievi di denaro. Conduciamo test con importi diversi e periodicità dei prelievi.

La figura 8 illustra i parametri dell'Expert Advisor con ottimizzazione e prelievi abilitati; e la figura 9 dimostra i risultati di tali test.

Il parametro dell'Expert Advisor con ottimizzazione e prelievi abilitati

Figura 8. Il parametro dell'Expert Advisor con ottimizzazione e prelievi abilitati

I risultati del calcolo del relativo prelievo del capitale

Figura 9. I risultati del calcolo del relativo prelievo di capitale

I risultati dei test sono un po’ sorprendenti, dal momento che il drawdown è inferiore con la periodicità di prelievo di un giorno o una settimana rispetto ai prelievi disabilitati.

Inoltre, la linea di drawdown giornaliero aumenta al 100% e poi torna all'8% e continua a scendere. Per interpretare correttamente i risultati, è necessario sapere come viene calcolato il prelievo relativo di capitale nello Strategy Tester. Questo è l'argomento della prossima sezione.


5. Calcolo del Prelievo di Capitale

Le menti curiose vorranno sapere come viene eseguito il calcolo del capitale nello Strategy Tester e come calcolare questo parametro da soli.

Se la funzione TesterWithdrawal() non viene utilizzata nel tuo Expert Advisor, il calcolo del parametro che analizziamo non ha alcuna differenza dal suo calcolo in MetaTrader 4; è descritto nell'articolo "Cosa significano i numeri nel rapporto di test degli esperti"; e il codice sorgente di esso e molti altri parametri del rapporto del tester risultante è fornito nell'articolo "Come valutare i risultati dei test degli esperti".

Una descrizione visiva del calcolo del drawdown relativo e massimo nello Strategy Tester è la figura 10 di seguito.

Calcolo dei prelievi di capitale senza considerare i prelievi 

Figura 10. Calcolo dei prelievi di capitale senza considerare i prelievi

Durante il suo lavoro, lo Strategy Tester determina gli attuali valori massimi e minimi di capitale. Con la comparsa di un nuovo massimo azionario, che è contrassegnato sul grafico con il segno di spunta blu, i drawdown massimi e minimi vengono ricalcolati e il valore più grande viene salvato per essere visualizzato nel report risultante.

L'importante è l'ultimo ricalcolo dei parametri al termine del test, perché può verificarsi una situazione in cui l'ultimo estremo di capitale non registrato dà il valore massimo di drawdown. Le modifiche dei valori massimi dei drawdown sono mostrate rispettivamente con i colori blu e rosso. Il colore grigio rappresenta il drawdown registrato ad ogni arrivo di nuovo massimo.

Va notato che la chiamata della funzione TesterWithDrawal() cambia l'algoritmo di calcolo dei drawdown nello Strategy Tester. La differenza rispetto alla variante precedente è il ricalcolo dei valori di drawdown non solo all'arrivo di nuovi massimi di capitale, ma anche ai prelievi di attività. La dimostrazione visiva è alla figura 11.

Calcolo dei prelievi considerando i prelievi 

Figura 11. Calcolo dei prelievi considerando i prelievi

Il momento del prelievo delle attività viene mostrato con i tick verdi nell'immagine sopra. I prelievi di denaro sono piuttosto frequenti, quindi non consentono di fissare i valori massimi di prelievo determinati dagli estremi sul grafico. Di conseguenza, il risultante prelievo considerando i prelievi può essere inferiore a quello senza il corrispettivo, come è stato notato nella figura 9.

Se i prelievi di denaro sono molto più grandi rispetto alla crescita del capitale come risultato dell'ottenimento dei profitti, ciò può portare a bassi tassi di drawdown. Il motivo è che questa situazione non consente agli extremum di formarsi sul grafico; e nel limite sembrerà una linea discendente retta, dove il relativo drawdown tende a zero. Questo effetto ha iniziato a manifestarsi con i prelievi giornalieri di oltre 1000 $ al grafico mostrato nella figura 9.

Riproduciamo il calcolo del drawdown massimo e relativo del capitale in MQL5 combinando l'intero algoritmo nella singola procedura CalcEquityDrawdown come descritto di seguito.

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;
 }

Per mantenere precisi i calcoli, dobbiamo chiamare la procedura scritta sopra dal corpo del nostro Expert Advisor ogni volta che arriva un nuovo tick e con i parametri indicati di seguito.

CalcEquityDrawdown(initial_deposit, false);

Inoltre, per ottenere i valori affidabili dei drawdown, dovrebbe anche essere chiamato alla fine dell'Expert Advisor nella funzione OnTester() con i parametri finally = true che indicano che il calcolo è terminato. E se l'attuale drawdown non fissato è maggiore del massimo registrato, sostituirà quello massimo e verrà mostrato nel report risultante.

CalcEquityDrawdown(initial_deposit, true);

Se l'algoritmo dei prelievi è implementato in un Expert Advisor, per il corretto calcolo dei drawdown è necessario chiamare la funzione CalcEquityDrawdown con il parametro finally=true ogni volta che viene eseguito un prelievo. L'ordine di chiamata può essere il seguente:

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

Per essere sicuri della correttezza della metodologia sopra descritta, confrontiamo i dati calcolati con i dati dello strategy tester. Per fare ciò, dobbiamo fare in modo che la funzione OnTester() restituisca il valore del parametro che vogliamo controllare - il relativo drawdown del capitale che è memorizzato nella variabile RelEquityDrawdownPercent.

Viene implementato nel codice dell'Expert Advisor impostando il valore "Drawdown con considerazione del prelievo" per il parametro di input "Ottimizzazione dal parametro". Il resto dei parametri deve essere lasciato senza modifiche, come mostrato nella figura 8. I risultati di tali test sono mostrati nella figura 12.

  Confronto dei risultati dei nostri calcoli con i dati dello strategy tester

Figura 12. Confronto dei risultati dei nostri calcoli con i dati dello strategy tester

Il confronto dei risultati ottenuti dimostra che l'algoritmo di calcolo del relativo drawdown è corretto.

Aggiungiamo un'altra variante al calcolo del drawdown. In esso, escluderemo l'influenza dei prelievi di denaro sul capitale e osserveremo il cambiamento del relativo prelievo di capitale.

A tal fine, aggiungiamo una variabile all'Expert Advisor, la useremo per determinare se è necessario considerare i prelievi nel calcolo dei parametri dell'Expert Advisor.

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

Il valore di wdr_ignore è uguale a true se la variabile "Ottimizzazione per parametro" è impostata su "Drawdown senza corrispettivo del prelievo".

Oltre a ciò, è necessario correggere la procedura di calcolo del drawdown CalcEquityDrawdown aggiungendo l'elaborazione di tale parametro ad esso come mostrato di seguito.

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

Ora tutto è pronto per ottenere nuovi valori dei drawdown. Eseguiamo test con il nuovo algoritmo di calcolo abilitato. Il risultato del test è mostrato nella figura 13.

I risultati del calcolo del prelievo senza il corrispettivo dei prelievi 

Figura 13. I risultati del calcolo del prelievo senza il corrispettivo dei prelievi

I risultati mostrano che né il fatto di prelevare attività, né la quantità di denaro prelevata dipendono dal prelievo. Pertanto, abbiamo ottenuto un fattore puro che non è influenzato dalla funzione TesterWithDrawal(). Tuttavia, per utilizzare questo tipo di calcolo, dobbiamo correggere i valori di profitti e perdite, perché i loro valori reali sono cambiati e questi fattori non sono corretti nel rapporto risultante del tester.

Calcoliamo il profitto, la perdita e il loro rapporto (redditività) e salviamo i valori ottenuti come report in un file di testo. La procedura di calcolo dei parametri elencati è riportata di seguito.

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;
  }

La funzione per generare il report in un file di testo è riportata di seguito.

//--- 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);
     }
  }

Il risultato dell'esecuzione di questa funzione è la creazione di un file di testo pieno di informazioni come mostrato nella figura 14.

  File del report generato dalla procedura GenerateReportFile

Figura 14. File del report generato dalla routine GenerateReportFile

La funzione viene scritta in modo da aggiungere ogni nuovo report al contenuto esistente del file. A causa di ciò, possiamo confrontare i valori dei risultati dei test con diversi parametri di input dell'Expert Advisor.

Come si può notare dal rapporto, quando si calcola senza il corrispettivo dei prelievi (tabella inferiore) l'utile netto totale è inferiore e la perdita lorda è maggiore della quantità di denaro prelevata, rispetto ai calcoli del tester (tabella superiore). Va notato che per ottenere il valore reale di profitti e perdite quando si prelevano attività nello strategy tester, è necessario sottrarre il valore del parametro "Prelievo" dall'utile netto totale e aggiungerlo alla perdita lorda.


6. Analisi del Risultato

Sulla base dei risultati ottenuti da tutti gli esperimenti condotti, possiamo trarre diverse conclusioni:

  1. L'utilizzo della funzione TesterWithDrawal() porta alle modifiche nell'algoritmo di calcolo dei drawdown nello strategy tester. Confrontare diversi Expert Advisor in base al valore del relativo prelievo può essere errato se uno di essi contiene un meccanismo di prelievo di denaro. Utilizzando questa funzione, è possibile effettuare un calcolo pragmatico di quanti soldi è possibile prelevare periodicamente dal conto a seconda della percentuale specificata e accettabile del prelievo di capitale.
  2. L'utilizzo di questa funzione può essere implementato come fattore destabilizzante sintetico del trading utilizzato per verificare la stabilità di funzionamento del proprio Expert Advisor e regolare la logica del codice responsabile della gestione del denaro. Se il tuo Expert Advisor ha la logica di prendere decisioni sulla base del saldo o dei livelli di capitale, l'utilizzo di questa funzione offre ulteriori opportunità di test e messa a punto.
  3. Quando si ricalcola il relativo drawdown senza la considerazione dei prelievi, utilizzando l'algoritmo descritto nell'articolo, è possibile ottenere un valore puro del relativo drawdown che non è influenzato dall'utilizzo di questa funzione.


Conclusione 

Questo articolo copre l'utilizzo della funzione TesterWithdrawal() per modellare il processo di prelievo di attività da un conto e la sua influenza sull'algoritmo di calcolo del prelievo di capitale nello strategy tester.

Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/131

File allegati |
testexpert.mq5 (33.95 KB)
L'uso delle Librerie MQL5 Standard Trade Class nella scrittura di un Expert Advisor L'uso delle Librerie MQL5 Standard Trade Class nella scrittura di un Expert Advisor
Questo articolo spiega come utilizzare le principali funzionalità di MQL5 Standard Trade Class nella scrittura di Expert Advisor che implementano la chiusura e la modifica della posizione, l'immissione e l'eliminazione di ordini in sospeso e la verifica del margine prima di piazzare un trade. Abbiamo anche dimostrato come le classi di trading possono essere utilizzate per ottenere dettagli su ordini e transazioni.
Il Metodo Ottimale per il Calcolo del Volume Totale della Posizione in Base al Numero Magico Specificato Il Metodo Ottimale per il Calcolo del Volume Totale della Posizione in Base al Numero Magico Specificato
Il problema del calcolo del volume totale della posizione del simbolo specificato e del numero magico è considerato in questo articolo. Il metodo proposto richiede solo la parte minima necessaria della cronologia degli affari, trova il momento più vicino in cui la posizione totale era uguale a zero ed esegue i calcoli con le operazioni recenti. Viene anche considerato il lavoro con le variabili globali del terminale client.
Controllo dello Slope della Curva di Saldo Durante il Lavoro di un Expert Advisor Controllo dello Slope della Curva di Saldo Durante il Lavoro di un Expert Advisor
Trovare regole per un sistema di trading e programmarle in un Expert Advisor è una metà del lavoro. In qualche modo, è necessario correggere il funzionamento dell'Expert Advisor in quanto accumula i risultati del trading. Questo articolo descrive uno degli approcci che consente di migliorare le prestazioni di un Expert Advisor attraverso la creazione di un feedback che misura la pendenza della curva di bilanciamento.
Scrivere un Expert Advisor Utilizzando l'Approccio di Programmazione Orientato agli Oggetti MQL5 Scrivere un Expert Advisor Utilizzando l'Approccio di Programmazione Orientato agli Oggetti MQL5
Questo articolo si concentra sull'approccio orientato agli oggetti per fare ciò che abbiamo fatto nell'articolo "Guida Passo per Passo per Scrivere un Expert Advisor in MQL5 per Principianti" - creazione di un semplice Expert Advisor. La maggior parte delle persone pensa che sia difficile, ma voglio assicurarti che quando avrai finito di leggere questo articolo, sarai in grado di scrivere il tuo Expert Advisor che è basato sugli oggetti.