//--- defines
#define BALANCE_PROFIT_WITHDRAWAL 5 // la valeur du bénéfice du solde, auquel les fonds sont retirés du compte dans le testeur
//--- paramètres d'entrée
input double InpLots = 0.1; // Lots
input uint InpStopLoss = 50; // Stop loss en points
input uint InpTakeProfit = 150; // Take Profit en points
sinput ulong InpMagic = 123; // Magic number
sinput ulong InpDeviation = 5; // Déviation
//--- variables globales
CTrade trade; // instance de class trade
CSymbolInfo symb; // instance de classe symbol
CAccountInfo account; // instance de la classe compte de trading
...
double balance_op_sum; // montant total des opérations sur le solde
uint balance_op_total; // nombre d'opérations sur le solde
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
...
//--- sauvegarde les valeurs initiales du solde
balance_prev=account.Balance();
balance_op_sum=0;
balance_op_total=0;
//--- initialisation réussie
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- met à jour les cotations actuelles
if(!symb.RefreshRates())
return;
...
//--- si le profit du solde dépasse le solde actuel de la valeur spécifiée dans la substitution de macro BALANCE_PROFIT_WITHDRAWAL,
//--- il est nécessaire de retirer ces fonds du compte. Appeler la fonction TesterWithdrawal().
//--- vérifie le bénéfice du solde pour dépasser BALANCE_PROFIT_WITHDRAWAL
if(balance_prev!=account.Balance())
{
if(account.Balance()>balance_prev+BALANCE_PROFIT_WITHDRAWAL)
{
double profit=account.Balance()-balance_prev;
PrintFormat("The account balance has been increased by %.2f %s. Need to withdraw these funds from the account.",profit,account.Currency());
if(TesterWithdrawal(profit))
{
balance_op_total++;
balance_op_summ+=profit;
balance_prev=account.Balance();
PrintFormat("Funds have been withdrawn from the account. Account balance: %.2f %s.",account.Balance(),account.Currency());
PrintFormat("Total withdrawals: %lu. Amount of withdrawals: %.2f %s.",balance_op_total,balance_op_summ,account.Currency());
}
/*
Résultat :
The account balance has been increased by 21.00 USD. Need to withdraw these funds from the account.
deal #13 balance -21.00 [withdrawal] done
Funds have been withdrawn from the account. Account balance: 10000.00 USD.
Total withdrawals: 1. Amount of withdrawals: 21.00 USD.
*/
}
}
}
//+------------------------------------------------------------------+
//| Tester function |
//+------------------------------------------------------------------+
double OnTester()
{
//--- définit le drawdonw maximum du solde en termes monétaires comme valeur du gestionnaire de sortie
double ret=TesterStatistics(STAT_BALANCE_DD);
//--- affiche un message concernant le drawdown, le nombre de retraits et leur montant total dans le journal
PrintFormat("%s: Maximum balance drawdown in money: %.2f %s. Total withdrawals: %lu. Amount of withdrawals: %.2f %s.",__FUNCTION__,ret,account.Currency(),balance_op_total,balance_op_summ,account.Currency());
//--- retourne le résultat
return(ret);
/*
Résultat :
OnTester: Maximum balance drawdown in money: 5188.50 USD. Total withdrawals: 2. Amount of withdrawals: 36.00 USD.
final balance 4867.50 USD
OnTester result 5188.5
*/
}
|