2025-09-22 09:08:13 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| CustomOptimization.mqh |
|
| | | //| Copyright 2025, Niquel Mendoza. |
|
| | | //| https://www.mql5.com/es/users/nique_372/news |
|
| | | //+------------------------------------------------------------------+
|
| | | #property copyright "Copyright 2025, Niquel Mendoza."
|
| | | #property link "https://www.mql5.com/es/users/nique_372/news"
|
| | | #property strict
|
| | |
|
2025-11-10 09:33:53 -05:00 | | | #ifndef MQLARTICLES_UTILS_CUSTOMOPTIMIZATION_MQH
|
| | | #define MQLARTICLES_UTILS_CUSTOMOPTIMIZATION_MQH
|
| | |
|
2026-08-27 15:59:12 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | #include "Basic.mqh"
|
2025-09-22 09:08:13 -05:00 | | |
|
2026-09-13 08:47:52 -05:00 | | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | namespace TSN
|
| | | {
|
2025-09-22 09:08:13 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | typedef double (*FCustomOptimizerResult)();
|
| | |
|
| | | //---
|
| | | enum ENUM_SIMPLE_CUSTOM_CRITERIA
|
| | | {
|
| | | CTS_CRITERIA_OP_ESPERANZA_MATEMATICA = 0,
|
| | | CTS_CRITERIA_OP_MIN_DD_AND_MAX_BALANCE
|
| | | };
|
| | |
|
| | | //---
|
| | | class CCustomCriteria //clase para implementar un criterio custom de otpimaicion en el probador, ADEVERTENCIA: todas las funciones son de maximizacion
|
| | | {
|
| | | private:
|
| | | FCustomOptimizerResult f_ptr;
|
| | |
|
| | |
|
| | | public:
|
| | | CCustomCriteria(void);
|
| | |
|
| | | //---
|
| | | void Set(FCustomOptimizerResult funcion_rest) { this.f_ptr = funcion_rest; }
|
| | | void Set(ENUM_SIMPLE_CUSTOM_CRITERIA type_op);
|
| | |
|
| | | //---
|
| | | inline double OnTesterEvent() const { return this.f_ptr(); }
|
| | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | CCustomCriteria::CCustomCriteria(void)
|
| | | : f_ptr(NULL)
|
| | | {
|
| | |
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | void CCustomCriteria::Set(ENUM_SIMPLE_CUSTOM_CRITERIA type_op)
|
| | | {
|
| | | const static FCustomOptimizerResult types_valid[2] =
|
| | | {
|
| | | CCustomCriteria_FuncionEsperanzaMatematica,
|
| | | CCustomCriteria_FuncionMinDdAndMaxBalance
|
| | | };
|
| | |
|
| | | this.f_ptr = types_valid[type_op];
|
| | | }
|
| | |
|
| | |
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | double CCustomCriteria_FuncionEsperanzaMatematica()
|
| | | {
|
| | | double trades = TesterStatistics(STAT_TRADES);
|
| | |
|
| | | if(trades <= 0)
|
| | | return 0.0;
|
| | |
|
| | | //---
|
| | | double procentaje_accierto = TesterStatistics(STAT_PROFIT_TRADES) / trades;
|
| | | double percentage_fallo = TesterStatistics(STAT_LOSS_TRADES) / trades;
|
| | |
|
| | | //---
|
| | | double total_profits = TesterStatistics(STAT_PROFIT_TRADES);
|
| | | double avg_profit = total_profits > 0.00 ? TesterStatistics(STAT_GROSS_PROFIT) / total_profits : 0.00;
|
| | |
|
| | | //---
|
| | | double total_losses = TesterStatistics(STAT_LOSS_TRADES);
|
| | | double avg_loss = total_losses > 0.00 ? fabs(TesterStatistics(STAT_GROSS_LOSS)) / total_losses : 0.00;
|
| | |
|
| | | return (procentaje_accierto * avg_profit) - (percentage_fallo * avg_loss);
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | double CCustomCriteria_FuncionMinDdAndMaxBalance()
|
| | | {
|
| | | double gross;
|
| | | if((gross = TesterStatistics(STAT_GROSS_PROFIT)) < TesterStatistics(STAT_GROSS_LOSS))
|
| | | return 0.00 ;//Si hay mas peridas qeu gannacias entonces retorna 0, bot no es rentalbe
|
| | |
|
| | | double dd = TesterStatistics(STAT_BALANCEDD_PERCENT);
|
| | |
|
| | | if(dd > 30.00) //d + 50%, demasiado
|
| | | return 0.00;
|
| | |
|
| | | return gross / dd;
|
| | | }
|
2026-09-13 08:47:52 -05:00 | | | }
|
2025-09-22 09:08:13 -05:00 | | | //+------------------------------------------------------------------+
|
2026-09-13 08:47:52 -05:00 | | | #endif // MQLARTICLES_UTILS_CUSTOMOPTIMIZATION_MQH
|