- Preguntas de los principiantes MQL5 MT5 MetaTrader 5
- Problema al realizar Backtesting en MT4 a un Robot o asesor experto
- OnTradeTransaction
- docs.mql4.com
Esa función hace exactamente eso y puede filtrar hasta donde le dé la imaginación.
Un ejemplo:
//+------------------------------------------------------------------+ //| OnTester | /+-------------------------------------------------------------------+ double OnTester() { double rec_factor = 0; if(TesterStatistics(STAT_TRADES) < 30) rec_factor = 0; return rec_factor; } //+------------------------------------------------------------------+
Además también puede hacer, por otro lado, que al no hacer X trades fuerce el cierre/eliminación del EA ( ExpertRemove() ), por lo que el resultado no se computa.
Como ve hay varias formas de hacerlo.
Esa función hace exactamente eso y puede filtrar hasta donde le dé la imaginación.
Un ejemplo:
Además también puede hacer, por otro lado, que al no hacer X trades fuerce el cierre/eliminación del EA ( ExpertRemove() ), por lo que el resultado no se computa.
Como ve hay varias formas de hacerlo.
Muchas gracias Miguel, ahora lo voy viendo más claro.
Sin embargo, piense que está ante un neófito total. Esta función cómo /dónde la tendría que incluir para que al lanzar el probador de estrategias funcionase?
Bueno, he estado investigando un poco, he abierto mi robot en metaEditor, he buscado la parte de OnTester y he añadido el código que me da usted, me ha quedado así:
//+------------------------------------------------------------------+ //| Tester function | //+------------------------------------------------------------------+ double OnTester() { double ret=0.0; if(TesterStatistics(STAT_TRADES) < 50) rec_factor = 0; return rec_factor; if(IsOptimization()){ if(custom == criterio_br){ double profit = TesterStatistics(STAT_PROFIT); double max_dd = TesterStatistics(STAT_BALANCE_DD); if(max_dd != 0.0) ret = profit/max_dd; else ret=-1; }else if(custom == criterio_sqn){ int hstTotal=OrdersHistoryTotal(); double tradesProfits[]; ArrayResize(tradesProfits, hstTotal); double totalProfit = 0.0; for(int i=0;i<hstTotal;i++) { OrderSelect(i,SELECT_BY_POS,MODE_HISTORY); tradesProfits[i]=OrderProfit(); totalProfit += tradesProfits[i]; } if(hstTotal != 0) double average = totalProfit/hstTotal; double stdDev = standardDeviation(tradesProfits, average); if(stdDev != 0.0) ret = (average / stdDev) * MathSqrt(hstTotal); else ret = -1; }else if(custom == criterio_kratio){ double acumPips=0.0; double acumPipsArr[]; ArrayResize(acumPipsArr,OrdersHistoryTotal()); for(int j = 0; j<OrdersHistoryTotal();j++){ OrderSelect(j, SELECT_BY_POS, MODE_HISTORY); if ( OrderType() == OP_BUY ) { acumPips += ( OrderClosePrice() - OrderOpenPrice() ) / (Point*MyPoint); }else if ( OrderType() == OP_SELL ) { acumPips += ( OrderOpenPrice() - OrderClosePrice() ) / (Point*MyPoint); } acumPipsArr[j]=acumPips; } ret = getKRatio(acumPipsArr); } } return (ret); } //+------------------------------------------------------------------+Sin embargo, lo guardo con otro nombre, le doy al botón de compilar y cuando lo pongo en MT4 no me funciona.... he podido hacer algo mal?
Debe incluirlo al final del EA y usar la optimización 'Criterio máximo del usuario' en el probador.
Si lo pongo al final me da un error, seguro que lo estoy haciendo mal... le dejo el codigo
//| Tester function | //+------------------------------------------------------------------+ double OnTester() { double ret=0.0; if(IsOptimization()){ if(custom == criterio_br){ double profit = TesterStatistics(STAT_PROFIT); double max_dd = TesterStatistics(STAT_BALANCE_DD); if(max_dd != 0.0) ret = profit/max_dd; else ret=-1; }else if(custom == criterio_sqn){ int hstTotal=OrdersHistoryTotal(); double tradesProfits[]; ArrayResize(tradesProfits, hstTotal); double totalProfit = 0.0; for(int i=0;i<hstTotal;i++) { OrderSelect(i,SELECT_BY_POS,MODE_HISTORY); tradesProfits[i]=OrderProfit(); totalProfit += tradesProfits[i]; } if(hstTotal != 0) double average = totalProfit/hstTotal; double stdDev = standardDeviation(tradesProfits, average); if(stdDev != 0.0) ret = (average / stdDev) * MathSqrt(hstTotal); else ret = -1; }else if(custom == criterio_kratio){ double acumPips=0.0; double acumPipsArr[]; ArrayResize(acumPipsArr,OrdersHistoryTotal()); for(int j = 0; j<OrdersHistoryTotal();j++){ OrderSelect(j, SELECT_BY_POS, MODE_HISTORY); if ( OrderType() == OP_BUY ) { acumPips += ( OrderClosePrice() - OrderOpenPrice() ) / (Point*MyPoint); }else if ( OrderType() == OP_SELL ) { acumPips += ( OrderOpenPrice() - OrderClosePrice() ) / (Point*MyPoint); } acumPipsArr[j]=acumPips; } ret = getKRatio(acumPipsArr); } } return (ret); } double OnTester() { double rec_factor = 0; if(TesterStatistics(STAT_TRADES) < 30) rec_factor = 0; return rec_factor; } //+------------------------------------------------------------------+
La función ya la tiene creada y la está duplicando. Lo lamento, pero sin un mínimo de conocimiento de programación podríamos estar dando palos de ciego por días.
Le aconsejo que busque alguna guía sobre C++ antes de seguir adelante, al menos para como digo tener unos conocimientos básicos sobre lo que tiene delante.
Construir la casa por el tejado nunca acaba bien.
Con el código de esta manera, parece que funciona, estoy haciendo pruebas.
} acumPipsArr[j]=acumPips; } ret = getKRatio(acumPipsArr); } } return (ret); double rec_factor = 0; if(TesterStatistics(STAT_TRADES) < 30) rec_factor = 0; return rec_factor; } //+------------------------------------------------------------------+
Bueno pues el indicador no da ya errores tal y como lo he puesto pero al realizar la optimización siguen apareciendo en el informe de optimización pases con menos de 30 operaciones.
Alguna idea?
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso