Optimizar un EA y obtener el mejor de los optimizados. - página 41

 

Señal gratuita - sobre-optimizada.

Actualmente hay 6 TS de la Liga en marcha, que me parecen las más óptimas.

Los resultados actuales de los favoritos de la Liga CU se encuentran en las páginas anteriores.

TCs actuales para la sobre-optimización:

Símbolo Sistema Razón
1 EURCHF ChnTrendDTS Nuevo
2 EURCHF ChnTrendSAR Nuevo
3 EURCHF ChnTrendSP Nuevo
4 EURCHF ChnFlatSP Nuevo
5 EURCHF ChnFlatSAR Nuevo
6 EURCHF ChnFlatRTS Nuevo
7 EURCHF ChnTrendRTS Nuevo
8 EURCHF ChnFlatDTS Nuevo
9 GBPUSD ChnTrendSAR No se permite SL
10 CADJPY ChnFlatSAR No se permite SL
11 CHFJPY EMAFlatRTS Gran DD
12 USDJPY EMAFlatDTS Espera máxima larga


Pongo USDJPY EMAFlatDTS

Período de optimización del 4.05.17 al 4.15.18, a partir del 4.10.17

(Como me excedo en la optimización - corregiré este post, y volveré a optimizar los TCs, empezando por los últimos, hasta los primeros)

 
Georgiy Merts:

Señal libre - reabierto.

Actualmente hay 6 CT de la Liga en marcha, que me parecen los más óptimos.

¿Tal vez se pueda seguir haciendo posible escribir los resultados de la optimización en el archivo? Sólo los indicadores estándar no me dan, y creo que otros no dan mucho.

Aquí está mi conjunto de datos, que da el optimizador, pero pienso ampliarlo también.

 
Aleksey Vyazmikin:

¿Quizás se podría seguir haciendo posible escribir los resultados de la optimización en un archivo? Es que yo, y creo que otros, no sacamos mucho provecho de los indicadores estándar.

Aquí está mi conjunto de datos proporcionados por el optimizador, pero pienso ampliarlo también.


Por supuesto, tengo todos estos datos dentro de mi Asesor Experto. ¿Sugieres que después de cada pase genere un archivo de este tipo y lo ponga en el área de archivos?

Pero estoy seguro de que mucha gente lo mirará...


Pero, digamos, en su archivo - Yo personalmente no percibo esta figura - sólo "no puede ver el bosque por los árboles". Sólo miro las columnas "Factor de recuperación", y "Fracaso".

Todos los demás datos son superfluos para mí, no me dicen nada nuevo. Creo que es necesario que los expertos tengan el menor número posible de parámetros y de indicadores de evaluación. Yo pondría todo en un solo parámetro "calidad", pero veo que es necesario otro parámetro "sostenibilidad".


Dice usted que "estos son los parámetros que tengo de salida, y tengo la intención de ampliar este conjunto", ¿cuál es el objetivo?

Muéstrame un ejemplo más concreto: ¿dónde usarías al menos un tercio de esas columnas, que emites? Eres como el participante de un tema vecino, que escribió un maravilloso motor de lienzo, que muestra maravillosos efectos visuales en el gráfico... Pero no pensó en el uso práctico de estas características. La obtención de cualquier dato debe ser de alguna utilidad particular, debe formar parte de una metodología particular de selección o de operación de CT. Y "sólo para tener"... Estos recursos se emplean mejor en la reoptimización adicional de los sistemas externos o en nuevos sistemas.

En la idea, por supuesto, es posible molestarse con el archivo de salida. Bueno, si habrá al menos un par de votos más que los tres parámetros - la calidad, la reducción y la cola SL no es suficiente - así, hacer un archivo de este tipo, y mostrará sus datos en los informes.

 

TCs actuales para la sobre-optimización:

Símbolo Sistema Razón
1 EURCHF ChnTrendSAR Nuevo
2 EURCHF ChnTrendSP Nuevo
3 EURCHF ChnFlatSP Nuevo
4 EURCHF ChnFlatSAR Nuevo
5 EURCHF ChnFlatRTS Nuevo
6 EURCHF ChnTrendRTS Nuevo
7 EURCHF ChnFlatDTS Nuevo
8 GBPUSD ChnTrendSAR No se permite SL
9 EURCHF EMATrendSP Muchos SL
10 GBPAUD EMAFlatRTS Gran DD
11 CADJPY ChnFlatSAR No se permite SL
12 CHFJPY EMAFlatRTS Gran DD
13 GBPNZD EMAFlatSAR Espera máxima larga


Tengo un GBPNZD EMAFlatSAR

Período 5.05.17 - 5.05.18, hacia adelante desde el 5.10.17

 

Situación actual de los favoritos

(Todos los CTs trabajan en demo sin MM, con lotes mínimos)

Los 20 mejores por calidad:

Cuadro de los 10 mejores en calidad:

Los 20 mejores por equilibrio:

La mejor tabla de 10 por saldo:

Sólo un recordatorio, el Experto de la Liga de Sistemas de Comercio (versiones tanto para MT4 y MT5) está en Yandex-disco. En el archivo también se adjunta una breve descripción de los principios de la Liga y una lista de la ST, que trabaja en ella.

Por defecto, la Liga trabaja con un TS (EURUSD ChnTrendSAR, magik 220141) sin ninguna restricción.

Otras TS sólo funcionan en el probador de estrategias. Para su trabajo en una cuenta demo o real se requieren códigos de registro. Los códigos de registro, válidos durante 3 meses con un enlace al número de cuenta, se emiten para la optimización de los sistemas individuales de la Liga (2-5 horas en un Core i5 de cuatro núcleos).

EALeague
EALeague
  • yadi.sk
View and download from Yandex.Disk
 
Georgiy Merts:


Por supuesto, tengo todos estos datos dentro del Asesor Experto. ¿Sugiere generar un archivo de este tipo después de cada pase y lanzarlo al área de archivos?

Pero estoy seguro de que mucha gente lo mirará...

Usted dice: "estos son los parámetros que muestro, y todavía tengo la intención de ampliar este conjunto", ¿cuál es el propósito?

Muéstrame un ejemplo más concreto: ¿dónde utilizarías al menos un tercio de las columnas que emites?

En teoría, por supuesto, la salida del archivo es posible. Bueno, si habrá al menos un par de votos más que los tres parámetros - la calidad, el hundimiento y la cola SL no es suficiente - así, hacer un archivo de este tipo, y mostrará sus datos en los informes.

Permítanme decirlo así: de pronto sentí curiosidad por ver qué tipo de Asesores Expertos estaba optimizando, pero al no conocer su algoritmo exacto, decidí centrarme en su rendimiento y de pronto me di cuenta de que no podía evaluar los resultados debido a la escasez de indicadores estadísticos.

Usted dice que los participantes en el proyecto deberían hacer la selección ellos mismos, pero esto no es realista según los datos disponibles.

Ahora estoy trabajando en un sistema de evaluación mecánica: la idea principal es equilibrar todos los indicadores, no sólo su valor absoluto, que por supuesto es igual de importante.

Por ejemplo, yo suelo utilizar la fórmula "Ingreso"-"Beneficio Máximo Continuo "*3-"Gasto"-"Pérdida Máxima Continua "*3 para estimar el beneficio, y si todavía estamos en el plus, miramos más allá, pero también en esta fase podemos cribar mucho.

Y, el drawdown sólo lo percibo en términos naturales, ya que el porcentaje depende de los beneficios acumulados en el momento del drawdown, pero esto no puede decir nada ya que no hay garantía de que la próxima vez este drawdown se produzca también, sólo después de los beneficios acumulados. Por ejemplo, una detracción del 10% con un capital inicial de 1000 es de 10 unidades, y si es del 10% con un beneficio de 2000, ya son 30 unidades, convienen en que las cifras no son comparables. El significado del porcentaje sólo si la retirada de fondos cada día, pero si se implementa, a continuación, otros indicadores se están arrastrando, que se calculan automáticamente, entonces usted tiene cada figura por sí mismo, que es molesto.

Puedo darte mi código para escribir datos en un archivo, si no lo has hecho antes.

 
Aleksey Vyazmikin:

Puedo darte mi código para escribir datos en un archivo, si no lo has hecho antes.

No deberías haber renunciado a Skype. Podrías haber mirado el código y haber encontrado la mejor manera de hacerlo.

Vamos, ¿qué indicadores necesitas?

¿Y en qué momento debe ser emitido por el Asesor Experto? Según entiendo - en la función OnTester()? Le haré tal función. La salida será un archivo CSV, que se puede abrir fácilmente en Excel.


¿Y de qué Asesor Experto estamos hablando, del Asesor Experto principal de la Liga, o de EAs separados para diferentes TS?

 
Georgiy Merts:

No deberías haber renunciado a Skype. Podrías haber mirado el código y averiguar la mejor manera de hacerlo.

Vamos, ¿qué indicadores necesitas?

¿Y en qué momento debe ser emitido por el Asesor Experto? Según tengo entendido - en la función OnTester ()? Le haré tal función.


Ah, y de qué EA estamos hablando aquí - el Asesor Experto principal de la Liga, o EAs separados para diferentes TS?

Lo tengo organizado así

//--- Кол-во показателей для записи в файл
#define  STAT_VALUES_COUNT 21
double stat_values[STAT_VALUES_COUNT]; // Массив для показателей теста


//+------------------------------------------------------------------+
//| Начало оптимизации                                               |
//+------------------------------------------------------------------+
void OnTesterInit()
  {
      //FileWrite(Statistic,"typeMAH","pMAH","pipsXH","pMAT_Sell","CalcPlan","FinRezultatTotalSell","avrMassSell","MaxOrdersSell","N_Sell","ProcTotalSell","Вершин Sell","FinRezultatTotalBuy","avrMassBuy","MaxOrdersBuy","N_Buy","ProcTotalBuy","Вершин Buy");
      //Printer.Write("OnTesterInit");

      string TimeF=TimeToString(TimeLocal(),TIME_DATE|TIME_MINUTES);
      StringSetCharacter(TimeF,13,'_');    
      Statistic=Printer.FileCreate(Symbol()+"_"+TimeF+"_S&G","S&G\\Test",false,false,EvryTick); //Создание файла для записи     
      Printer.Write("N",
      "Депо",
      "Прибыль",
      "Доход",
      "Расход",
      "Прибыльность",
      "Фактор вост.",
      "Мат ож",
      "К.Ш.",
      "Макс ДД баланса",
      "Макс ДД средств",
      "N сделок",
      "N трейдов",
      "N + трейдов",
      "N - трейдов",
      "Sell трейдов",
      "Buy трейдов",
      "Sell + трейдов",
      "Buy + трейдов",
      "Avr + трейдов",
      "Avr - трейдов",
      "% Sell от прибыльных",
      "% Buy от прибыльных",
      "% Sell от всех",
      "% Buy от всех",      
      "% + от всех",
      "Custom"            
      );
  }
//+------------------------------------------------------------------+
//| Обработчик события окончания тестирования                        |
//+------------------------------------------------------------------+
double OnTester()
  {

  
      //--- Заполним массив показателями теста
      GetTestStatistics(stat_values);
      //--- Создадим фрейм
      FrameAdd("Statistics",1,0,stat_values);

   double custom_Pokazatel_01=CustomPokazatelf(1);

  // return(0.0);
   return(custom_Pokazatel_01);

  }
//+------------------------------------------------------------------+
//| Пользовательские функции                                         |
//+------------------------------------------------------------------+
double CustomPokazatelf(int VariantPokazatel)
{

     double  profit = TesterStatistics(STAT_PROFIT);
     double  max_dd = TesterStatistics(STAT_BALANCE_DD);
   //  double  RecoveryF = TesterStatistics(STAT_RECOVERY_FACTOR);  
     double  Mat_Ojidanie = TesterStatistics(STAT_EXPECTED_PAYOFF);  
     
   double custom_Pokazatel=0;
   //=ЕСЛИ(C3-40000>0;(C3-40000)*(3000-J3);-1)
   //if (profit-40000>0)custom_Pokazatel_01=(profit-40000)*(3000-max_dd);
   //=ЕСЛИ(И(C3-40000>0;3000-J3>0);(C3-40000)*СТЕПЕНЬ(3000-J3;1,5)*H3;0)

   if (VariantPokazatel==1)
      {
      if (profit-Find_Profit>0 && Find_MaxDD-max_dd>0)custom_Pokazatel=(profit-Find_Profit)*MathPow((Find_MaxDD-max_dd),1.5)*Mat_Ojidanie/(Find_Profit+max_dd);
      else custom_Pokazatel=-1;
      }
   return(custom_Pokazatel);
}
//+------------------------------------------------------------------+
//| Очередной проход оптимизации                                     |
//+------------------------------------------------------------------+
void OnTesterPass()
  {

      string name ="";  // Публичное имя/метка фрейма
      ulong  pass =0;   // Номер прохода в оптимизации, на котором добавлен фрейм
      long   id   =0;   // Публичный id фрейма
      double val  =0.0; // Одиночное числовое значение фрейма
      //---
      FrameNext(pass,name,id,val,stat_values);
      //---
     // Print(__FUNCTION__,"(): pass: "+IntegerToString(pass)+"; STAT_PROFIT: ",DoubleToString(stat_values[0],2));
     // double a=stat_values[0];
     // Print ("a=",a);
     // Print(DotToComma(DoubleToString(stat_values[0],2)));
      
      double SellPribl_from_Pribl=0.0;//Процент прибыльных позиций Sell из всех прибыльных
      double BuyPribl_from_Pribl=0.0;//Процент прибыльных позиций Buy из всех прибыльных
      double SellPribl_from_All=0.0;//Процент прибыльных позиций Sell из всех проторгованных
      double BuyPribl_from_All=0.0;//Процент прибыльных позиций Buy из всех проторгованных
      double Pribl_from_All=0.0;//Процент прибыльных позиций из всех проторгованных
      if (stat_values[12]>0) SellPribl_from_Pribl=stat_values[16]/stat_values[12]*100.0;
      if (stat_values[12]>0) BuyPribl_from_Pribl=stat_values[17]/stat_values[12]*100.0;
      if (stat_values[11]>0) SellPribl_from_All=stat_values[16]/stat_values[11]*100.0;
      if (stat_values[11]>0) BuyPribl_from_All=stat_values[17]/stat_values[11]*100.0;
      if (stat_values[11]>0) Pribl_from_All=stat_values[12]/stat_values[11]*100.0;
      
      /*if (pass>0)*/ Printer.Write(IntegerToString(pass),
                              stat_values[0],
                              stat_values[1],
                              stat_values[2],
                              stat_values[3],
                              DoubleToString(stat_values[4],2),
                              DoubleToString(stat_values[5],2),
                              DoubleToString(stat_values[6],2),
                              DoubleToString(stat_values[7],2),
                              stat_values[8],
                              stat_values[9],
                              stat_values[10],
                              stat_values[11],
                              stat_values[12],
                              stat_values[13],
                              stat_values[14],
                              stat_values[15],
                              stat_values[16],
                              stat_values[17],
                              stat_values[18],
                              stat_values[19],      
                              DoubleToString(SellPribl_from_Pribl,2),
                              DoubleToString(BuyPribl_from_Pribl,2),  
                              DoubleToString(SellPribl_from_All,2),
                              DoubleToString(BuyPribl_from_All,2),
                              DoubleToString(Pribl_from_All,2),
                              DoubleToString(stat_values[20],2)
                              );


//--- Если включена запись результатов оптимизации
//      CreateOptimizationReport();

/*

  Print("OnTesterPass");
         Printer.Write("OnTesterPass");
*/

  }
//+------------------------------------------------------------------+
//| Завершение оптимизации                                           |
//+------------------------------------------------------------------+
void OnTesterDeinit()
  {



      FileClose(Statistic);

  }
//+------------------------------------------------------------------+
//| Заполняет массив результатами теста                              |
//+------------------------------------------------------------------+
void GetTestStatistics(double &stat_array[])
  {


stat_array[0]=     TesterStatistics(STAT_INITIAL_DEPOSIT);      //      Значение начального депозита
stat_array[1]=     TesterStatistics(STAT_PROFIT);                //     Чистая прибыль по окончании тестирования, сумма STAT_GROSS_PROFIT и STAT_GROSS_LOSS (STAT_GROSS_LOSS всегда меньше или равно нулю)
stat_array[2]=     TesterStatistics(STAT_GROSS_PROFIT);    //   Общая прибыль, сумма всех прибыльных (положительных) трейдов. Значение больше или равно нулю
stat_array[3]=     TesterStatistics(STAT_GROSS_LOSS);         //        Общий убыток, сумма всех убыточных (отрицательных) трейдов. Значение меньше или равно нулю
stat_array[4]=     TesterStatistics(STAT_PROFIT_FACTOR);           //   Прибыльность – отношение STAT_GROSS_PROFIT/STAT_GROSS_LOSS. Если STAT_GROSS_LOSS=0, то прибыльность принимает значение DBL_MAX
stat_array[5]=     TesterStatistics(STAT_RECOVERY_FACTOR);      //      Фактор восстановления – отношение STAT_PROFIT/STAT_BALANCE_DD
stat_array[6]=     TesterStatistics(STAT_EXPECTED_PAYOFF);      //      Математическое ожидание выигрыша
stat_array[7]=     TesterStatistics(STAT_SHARPE_RATIO);    //   Коэффициент Шарпа
stat_array[8]=     TesterStatistics(STAT_BALANCE_DD);         //        Максимальная просадка баланса в деньгах. В процессе торговли баланс может испытать множество просадок, берется наибольшее значение.
stat_array[9]=     TesterStatistics(STAT_EQUITY_DD);          //        Максимальная просадка средств в деньгах. В процессе торговли средства могут испытать множество просадок, берется наибольшее значение.
stat_array[10]= TesterStatistics(STAT_DEALS);               //  Количество совершенных сделок
stat_array[11]= TesterStatistics(STAT_TRADES);           //     Количество трейдов
stat_array[12]= TesterStatistics(STAT_PROFIT_TRADES);      //   Прибыльные трейды
stat_array[13]= TesterStatistics(STAT_LOSS_TRADES);           //        Убыточные трейды
stat_array[14]= TesterStatistics(STAT_SHORT_TRADES);       //   Короткие трейды
stat_array[15]= TesterStatistics(STAT_LONG_TRADES);              //     Длинные трейды 
stat_array[16]= TesterStatistics(STAT_PROFIT_SHORTTRADES);   // Короткие прибыльные трейды
stat_array[17]= TesterStatistics(STAT_PROFIT_LONGTRADES);          //   Длинные прибыльные трейды
stat_array[18]= TesterStatistics(STAT_PROFITTRADES_AVGCON);  // Средняя длина прибыльной серии трейдов
stat_array[19]= TesterStatistics(STAT_LOSSTRADES_AVGCON);          //   Средняя длина убыточной серии трейдов
//stat_array[20]=       TesterStatistics(STAT_CUSTOM_ONTESTER);    //   Custom
stat_array[20]= CustomPokazatelf(1);       //   Custom

  }

Hay un fallo en el código, o tal vez no en el código - a veces el último cuadro no viene de todos, pero no es siempre, y a veces la numeración puede coincidir. En general, creo que se trata de un fallo del programa, pero si ves un error en el código, ¡dímelo!


Y en que EAs - sí, se puede, y en todos los que están sujetos a la optimización.

 

Hmmm...

¿Guarda cada prueba realizada no sólo en el archivo de estadísticas, sino también en los marcos del archivo MQD? ¿Lo he entendido bien?

Además, me pregunto cómo funcionará esa salida a un archivo en OnTesterPass(), si el pase del probador está en la nube. En un marco se escribirá, pero en un archivo, sospecho, no.

Alexey, te ahogarás en el flujo de datos.


Pero, si es tan importante para ti - puedo poner tu código en la Liga TC.

Tu código es bastante transparente e inteligente, por lo que encajará casi sin cambios, sólo necesitaré alguna ligera modificación, para que todas las estructuras estén dentro de mis clases OOP.

Bueno... Lo haré, hoy o mañana pondré tu código en la Liga... Sin embargo, no veo que eso sirva de mucho. Hay muchos números y no podemos ver el bosque por los árboles.

 
Georgiy Merts:

Hmmm...

¿Guarda cada prueba realizada no sólo en el archivo de estadísticas, sino también en los marcos del archivo MQD? ¿Lo he entendido bien?

Alexey, te ahogarás en el flujo de datos.


Pero, si es tan importante para ti - puedo poner tu código en la Liga TC.

Su código es bastante transparente e inteligente, por lo que se ajustará casi sin cambios, sólo necesitaré algunos ajustes, para que todas las estructuras estén dentro de mis clases OOP.

Bueno... Lo haré, hoy o mañana pondré tu código en la Liga... Sin embargo, no le veo mucha utilidad. Hay muchos números y no podemos ver el bosque por los árboles.

Se necesitan fotogramas para que todo se reúna desde la red - optimizadores (agentes), no estoy usando un ordenador. El código no es mío desde cero, lo he destripado parcialmente del artículo sobre optimización y lo he adaptado a mis necesidades.

En el Asesor Experto, usted puede hacer una variable externa, según la cual las estadísticas serán escritas o no.

Y, usted tiene pocas variables externas en su EA, a diferencia de mi monstruo, por lo que puede (necesita) escribir el valor de las variables de una vez - añadirá algunas líneas en el archivo final, pero permitirá trabajar con él en un nivel diferente. Ahora simplemente añado estos valores al archivo a mano, es decir, lo que he optimizado en fragmentos.

Razón de la queja: