Files
2025-02-07 19:08:31 +03:30

1 line
19 KiB
Plaintext

// https://www.mql5.com/ru/forum/1111/page2440#comment_11395809
//+------------------------------------------------------------------+
//| Structure for trade statistics |
//+------------------------------------------------------------------+
struct ExpTradeSummary
{
public:
long Pass;
double initial_deposit; // initial deposit
double withdrawal; // withdrawal amount
double profit; // profit (+)
double grossprofit; // gross profit
double grossloss; // gross loss
double maxprofit; // the most profitable trade
double minprofit; // the most losing trade
double conprofitmax; // the profit from a longest series of profitable deals
double maxconprofit; // the highest profit among the profitable series
double conlossmax; // the loss from a longest series of losing deals
double maxconloss; // the highest loss among the losing series
double balance_min; // the minimum balance value (for calculating the absolute drawdown)
double maxdrawdown; // the maximum balance drawdown
double drawdownpercent; // the ratio of the maximum balance drawdown to the highest value
double reldrawdown; // maximum relative balance drawdown in money
double reldrawdownpercent; // maximum relative balance drawdown in percent
double equity_min; // the minimum equity value (for calculating the absolute equity drawdown)
double maxdrawdown_e; // the maximum equity drawdown
double drawdownpercent_e; // the ratio of the maximum equity drawdown to the highest value
double reldrawdown_e; // maximum relative equity drawdown in money
double reldrawdownpercnt_e; // maximum relative equity drawdown in percent
double expected_payoff; // expected payoff (+)
double profit_factor; // profit factor (+)
double recovery_factor; // recovery factor (+)
double sharpe_ratio; // Sharpe ratio (+)
double margin_level; // minimum margin level
double custom_fitness; // custom fitness - OnTester result (+)
int deals; // the total number of deals
int trades; // the number of out/inout deals
int profittrades; // the number of profitable deals
int losstrades; // the number of losing deals
int shorttrades; // the number of short deals
int longtrades; // the number of long deals
int winshorttrades; // the number of profitable short deals
int winlongtrades; // the number of profitable long deals
int conprofitmax_trades; // the longest series of consecutive profitable deals
int maxconprofit_trades; // maximum profit series
int conlossmax_trades; // the longest series of consecutive losing deals
int maxconloss_trades; // maximum losing series
int avgconwinners; // the average number of consecutive profitable deals
int avgconloosers; // the average number of consecutive losing deals
#define TOSTRING(A) #A + " = " + (string)(A) + "\n"
string ToString( void ) const
{
return(
TOSTRING(Pass) +
TOSTRING(initial_deposit) + // initial deposit
TOSTRING(withdrawal) + // withdrawal amount
TOSTRING(profit) + // profit (+)
TOSTRING(grossprofit) + // gross profit
TOSTRING(grossloss) + // gross loss
TOSTRING(maxprofit) + // the most profitable trade
TOSTRING(minprofit) + // the most losing trade
TOSTRING(conprofitmax) + // the profit from a longest series of profitable deals
TOSTRING(maxconprofit) + // the highest profit among the profitable series
TOSTRING(conlossmax) + // the loss from a longest series of losing deals
TOSTRING(maxconloss) + // the highest loss among the losing series
TOSTRING(balance_min) + // the minimum balance value (for calculating the absolute drawdown)
TOSTRING(maxdrawdown) + // the maximum balance drawdown
TOSTRING(drawdownpercent) + // the ratio of the maximum balance drawdown to the highest value
TOSTRING(reldrawdown) + // maximum relative balance drawdown in money
TOSTRING(reldrawdownpercent) + // maximum relative balance drawdown in percent
TOSTRING(equity_min) + // the minimum equity value (for calculating the absolute equity drawdown)
TOSTRING(maxdrawdown_e) + // the maximum equity drawdown
TOSTRING(drawdownpercent_e) + // the ratio of the maximum equity drawdown to the highest value
TOSTRING(reldrawdown_e) + // maximum relative equity drawdown in money
TOSTRING(reldrawdownpercnt_e) + // maximum relative equity drawdown in percent
TOSTRING(expected_payoff) + // expected payoff (+)
TOSTRING(profit_factor) + // profit factor (+)
TOSTRING(recovery_factor) + // recovery factor (+)
TOSTRING(sharpe_ratio) + // Sharpe ratio (+)
TOSTRING(margin_level) + // minimum margin level
TOSTRING(custom_fitness) + // minimum margin level
TOSTRING(deals) + // the total number of deals
TOSTRING(trades) + // the number of out/inout deals
TOSTRING(profittrades) + // the number of profitable deals
TOSTRING(losstrades) + // the number of losing deals
TOSTRING(shorttrades) + // the number of short deals
TOSTRING(longtrades) + // the number of long deals
TOSTRING(winshorttrades) + // the number of profitable short deals
TOSTRING(winlongtrades) + // the number of profitable long deals
TOSTRING(conprofitmax_trades) + // the longest series of consecutive profitable deals
TOSTRING(maxconprofit_trades) + // maximum profit series
TOSTRING(conlossmax_trades) + // the longest series of consecutive losing deals
TOSTRING(maxconloss_trades) + // maximum losing series
TOSTRING(avgconwinners) + // the average number of consecutive profitable deals
TOSTRING(avgconloosers) // the average number of consecutive losing deals
);
}
double TesterStatistics( const ENUM_STATISTICS Statistic_ID ) const
{
switch (Statistic_ID)
{
case STAT_INITIAL_DEPOSIT:
return(this.initial_deposit);
case STAT_WITHDRAWAL:
return(this.withdrawal);
case STAT_PROFIT:
return(this.profit);
case STAT_GROSS_PROFIT:
return(this.grossprofit);
case STAT_GROSS_LOSS:
return(-this.grossloss);
case STAT_MAX_PROFITTRADE:
return(this.maxprofit);
case STAT_MAX_LOSSTRADE:
return(-this.minprofit);
case STAT_CONPROFITMAX:
return(this.maxconprofit);
case STAT_CONPROFITMAX_TRADES:
return(this.maxconprofit_trades);
case STAT_MAX_CONWINS:
return(this.conprofitmax);
case STAT_MAX_CONPROFIT_TRADES:
return(this.conprofitmax_trades);
case STAT_CONLOSSMAX:
return(-this.conlossmax);
case STAT_CONLOSSMAX_TRADES:
return(this.conlossmax_trades);
case STAT_MAX_CONLOSSES:
return(-this.maxconloss);
case STAT_MAX_CONLOSS_TRADES:
return(this.maxconloss_trades);
case STAT_BALANCEMIN:
return(this.balance_min);
case STAT_BALANCE_DD:
return(this.maxdrawdown);
case STAT_BALANCEDD_PERCENT:
return(this.drawdownpercent);
case STAT_BALANCE_DDREL_PERCENT:
return(this.reldrawdownpercent);
case STAT_BALANCE_DD_RELATIVE:
return(this.reldrawdown);
case STAT_EQUITYMIN:
return(this.equity_min);
case STAT_EQUITY_DD:
return(this.maxdrawdown_e);
case STAT_EQUITYDD_PERCENT:
return(this.drawdownpercent_e);
case STAT_EQUITY_DDREL_PERCENT:
return(this.reldrawdownpercnt_e);
case STAT_EQUITY_DD_RELATIVE:
return(this.reldrawdown_e);
case STAT_EXPECTED_PAYOFF:
return(this.expected_payoff);
case STAT_PROFIT_FACTOR:
return(this.profit_factor);
case STAT_RECOVERY_FACTOR:
return(this.recovery_factor);
case STAT_SHARPE_RATIO:
return(this.sharpe_ratio);
case STAT_MIN_MARGINLEVEL:
return(this.margin_level);
case STAT_CUSTOM_ONTESTER:
return(this.custom_fitness);
case STAT_DEALS:
return(this.deals);
case STAT_TRADES:
return(this.trades);
case STAT_PROFIT_TRADES:
return(this.profittrades);
case STAT_LOSS_TRADES:
return(this.losstrades);
case STAT_SHORT_TRADES:
return(this.shorttrades);
case STAT_LONG_TRADES:
return(this.longtrades);
case STAT_PROFIT_SHORTTRADES:
return(this.winshorttrades);
case STAT_PROFIT_LONGTRADES:
return(this.winlongtrades);
case STAT_PROFITTRADES_AVGCON:
return(this.avgconwinners);
case STAT_LOSSTRADES_AVGCON:
return(this.avgconloosers);
}
return(0);
}
#undef TOSTRING
};