
Utilizzo della Funzione TesterWithdrawal() per il Modeling dei Prelievi di Profitto
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.
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":
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.
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 withdrawalsIl 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.
Figura 4. Impostazioni per il test dell’Expert Advisor
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.
Figura 6. Cambio di bilancio per 6 mesi di lavoro di prova 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.
Figura 8. Il parametro dell'Expert Advisor con ottimizzazione e prelievi abilitati
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.
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.
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.
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.
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.
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:
- 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.
- 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.
- 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





- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso