Ottimizzare un EA e ottenere il meglio di quelli ottimizzati. - pagina 41

 

Segnale gratuito - sovrastimato.

Ci sono attualmente 6 TS di Lega in funzione, che mi sembrano i più ottimali.

I risultati attuali dei favoriti della CU League sono nelle pagine precedenti.

Attuali TC per la sovraottimizzazione:

Simbolo Sistema Motivo
1 EURCHF ChnTrendDTS Nuovo
2 EURCHF ChnTrendSAR Nuovo
3 EURCHF ChnTrendSP Nuovo
4 EURCHF ChnFlatSP Nuovo
5 EURCHF ChnFlatSAR Nuovo
6 EURCHF ChnFlatRTS Nuovo
7 EURCHF ChnTrendRTS Nuovo
8 EURCHF ChnFlatDTS Nuovo
9 GBPUSD ChnTrendSAR Non consentito SL
10 CADJPY ChnFlatSAR Non consentito SL
11 CHFJPY EMAFlatRTS Grande DD
12 USDJPY EMAFlatDTS Lunga attesa massima


Ho messo USDJPY EMAFlatDTS

Periodo di ottimizzazione 4.05.17 - 4.15.18, avanti dal 4.10.17

(Dato che ho sovra-ottimizzato - correggerò questo post, e ri-ottimizzerò i TC, partendo dagli ultimi, fino ai primi)

 
Georgiy Merts:

Segnale libero - riaperto.

Attualmente ci sono 6 TC della Lega che lavorano lì, che mi sembrano i più ottimali.

Forse si può ancora rendere possibile scrivere i risultati dell'ottimizzazione nel file? Solo gli indicatori standard non mi danno, e penso che gli altri non danno molto.

Ecco il mio set di dati, che dà l'ottimizzatore, ma ho anche intenzione di espanderlo.

 
Aleksey Vyazmikin:

Forse si potrebbe ancora rendere possibile scrivere i risultati dell'ottimizzazione in un file? È solo che io, e penso altri, non ottengo molto dagli indicatori standard.

Ecco il mio set di dati fornito dall'ottimizzatore, ma ho intenzione di ampliarlo.


Naturalmente, ho tutti questi dati nel mio Expert Advisor. Suggerisci che dopo ogni passaggio io generi un tale file e lo metta nell'area dei file?

Ma sono sicuro che molte persone lo guarderanno?


Ma, diciamo, nel tuo file - personalmente non percepisco questa figura - solo "non può vedere la foresta per gli alberi". Guardo solo le colonne "Recovery Factor" e "Failure".

Tutti gli altri dati sono superflui per me, non mi dicono nulla di nuovo. Credo che sia necessario avere il minor numero possibile di parametri negli esperti e il minor numero possibile di indicatori di valutazione. Metterei tutto in un parametro "qualità", ma vedo che un altro parametro "sostenibilità" è necessario.


Tu dici "questi sono i parametri che ho in uscita, e ho intenzione di espandere questo insieme" - qual è l'obiettivo?

Mostrami un esempio più concreto - dove useresti almeno un terzo di quelle colonne, che hai emesso? Sei proprio come il partecipante di un topic vicino, che ha scritto un meraviglioso motore canvas, che mostra meravigliosi effetti visivi sul grafico... Ma non ha pensato all'uso pratico di queste caratteristiche. Ottenere qualsiasi dato dovrebbe essere di qualche utilità particolare, dovrebbe essere parte di una particolare metodologia di selezione o operazione di TC. E "solo per avere"... Queste risorse sono meglio spese per un'ulteriore riottimizzazione dei sistemi esterni o per nuovi sistemi.

In idea, naturalmente, è possibile preoccuparsi del file di output. Beh, se ci saranno almeno un paio di voti in più che i tre parametri - qualità, drawdown e coda SL non è sufficiente - beh, fare un tale file, e mostrerà i suoi dati nei rapporti.

 

Attuali TC per la sovraottimizzazione:

Simbolo Sistema Motivo
1 EURCHF ChnTrendSAR Nuovo
2 EURCHF ChnTrendSP Nuovo
3 EURCHF ChnFlatSP Nuovo
4 EURCHF ChnFlatSAR Nuovo
5 EURCHF ChnFlatRTS Nuovo
6 EURCHF ChnTrendRTS Nuovo
7 EURCHF ChnFlatDTS Nuovo
8 GBPUSD ChnTrendSAR Non consentito SL
9 EURCHF EMATrendSP Molti SL
10 GBPAUD EMAFlatRTS Grande DD
11 CADJPY ChnFlatSAR Non consentito SL
12 CHFJPY EMAFlatRTS Grande DD
13 GBPNZD EMAFlatSAR Lunga attesa massima


Ho un EMAFlatSAR GBPNZD

Periodo 5.05.17 - 5.05.18, avanti dal 5.10.17

 

Situazione attuale sui preferiti

(Tutti i TC lavorano su demo senza MM, con lotti minimi)

Top 20 per qualità:

Grafico della top 10 in termini di qualità:

I migliori 20 per equilibrio:

I migliori 10 grafici per equilibrio:

Solo un promemoria, il Trading Systems League Expert (versioni per MT4 e MT5) è su Yandex-disk. Nell'archivio è allegata anche una breve descrizione dei principi della Lega e un elenco di TS, lavorando in esso.

Di default, la Lega lavora con un solo TS (EURUSD ChnTrendSAR, magik 220141) senza alcuna restrizione.

Altri TS funzionano solo nel tester di strategia. Per il loro lavoro su un conto demo o reale sono necessari i codici di registrazione. I codici di registrazione, validi per 3 mesi con un link al vostro numero di conto, sono rilasciati per ottimizzare i sistemi individuali della Lega (2-5 ore su un Core i5 quad-core).

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


Naturalmente, ho tutti questi dati all'interno dell'Expert Advisor. Stai suggerendo di generare un tale file dopo ogni passaggio, e gettarlo nell'area dei file?

Ma sono sicuro che molte persone lo guarderanno?

Tu dici: "questi sono i parametri che mostro, e ho ancora intenzione di espandere questo insieme" - qual è lo scopo?

Mostratemi un esempio più concreto - dove usereste almeno un terzo delle colonne in uscita?

In teoria, naturalmente, l'uscita del file è possibile. Beh, se ci saranno almeno un paio di voti in più che i tre parametri - qualità, subsidenza e coda SL non è sufficiente - beh, fare un tale file, e mostrerà i suoi dati nei rapporti.

Mettiamola così: improvvisamente ero curioso di vedere che tipo di Expert Advisors stavo ottimizzando, ma non conoscendo il loro esatto algoritmo, ho deciso di concentrarmi sulle loro prestazioni e improvvisamente mi sono reso conto che non potevo valutare i risultati a causa della scarsità di indicatori statistici.

Voi dite che i partecipanti al progetto dovrebbero fare la selezione da soli, ma questo non è realistico sulla base dei dati disponibili.

Ora sto lavorando su un sistema di valutazione meccanica - l'idea principale è quella di bilanciare tutti gli indicatori, non solo il loro valore assoluto, che naturalmente è altrettanto importante.

Per esempio, uso spesso la formula "Reddito"-"Profitto massimo continuo "*3-"Spese"-"Perdita massima continua "*3 per stimare il profitto, e se siamo ancora nel più, guardiamo oltre, ma anche in questa fase possiamo vagliare molto.

E, il drawdown lo percepisco solo in termini naturali, in quanto la percentuale dipende dai profitti cumulativi al momento del drawdown, ma questo non può dire nulla in quanto non vi è alcuna garanzia che la prossima volta questo drawdown si verifichi pure, solo dopo i profitti cumulativi. Per esempio, un prelievo del 10% con un capitale iniziale di 1000 è di 10 unità, e se il 10% con un profitto di 2000, è già di 30 unità, d'accordo che le cifre non sono comparabili. Il significato della percentuale solo se il ritiro dei fondi ogni giorno, ma se si implementa, poi altri indicatori sono striscianti, che sono calcolati automaticamente, allora avete ogni figura da soli, che è fastidioso.

Posso darvi il mio codice per scrivere dati su un file, se non l'avete mai fatto prima.

 
Aleksey Vyazmikin:

Posso darvi il mio codice per scrivere dati su un file, se non l'avete mai fatto prima.

Non avresti dovuto rinunciare a Skype. Avresti potuto guardare il codice e trovare il modo migliore per farlo.

Andiamo, di quali indicatori avete bisogno?

E a che punto dovrebbe essere emesso dall'Expert Advisor? Se ho capito bene - nella funzione OnTester()? Ti farò una tale funzione. Produrrà un file CSV, che può essere facilmente aperto in Excel.


E di quale Expert Advisor stiamo parlando, l'Expert Advisor principale della Lega, o EAs separati per diversi TS?

 
Georgiy Merts:

Non avresti dovuto rinunciare a Skype. Avresti potuto guardare il codice e trovare il modo migliore per farlo.

Andiamo, di quali indicatori avete bisogno?

E a che punto dovrebbe essere emesso dall'Expert Advisor? Come ho capito - nella funzione OnTester ()? Ti farò una tale funzione.


Oh, e di quale EA stiamo parlando qui - il principale Expert Advisor della Lega, o EA separati per diversi TS?

L'ho organizzato così

//--- Кол-во показателей для записи в файл
#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

  }

C'è un difetto nel codice, o forse non nel codice - a volte l'ultimo fotogramma non viene del tutto, ma non è sempre, e a volte la numerazione può coincidere. In generale, penso che questo sia un difetto del programma, ma se vedi un bug nel codice, dimmelo!


E in quali EAs - sì, è possibile, e in tutto ciò che sono soggetti a ottimizzazione.

 

Hmmm...

Salvate ogni prova non solo nel file delle statistiche, ma anche nei frame del file MQD? Ho capito bene?

Inoltre - mi chiedo come tale output in un file funzionerà su OnTesterPass(), se il passaggio del tester è in Cloud? In un frame sarà scritto, ma in un file, sospetto, no.

Alexey, annegherai nel flusso di dati.


Ma, se è così importante per voi - posso mettere il vostro codice in TC League.

Il tuo codice è abbastanza trasparente e intelligente, quindi si adatterà quasi senza modifiche, ho solo bisogno di qualche piccola modifica, in modo che tutte le strutture siano all'interno delle mie classi OOP.

Bene... Lo farò, oggi o domani metterò il tuo codice nella Lega... Non vedo come possa essere molto utile, però. Ci sono un sacco di numeri e non riusciamo a vedere la foresta per gli alberi.

 
Georgiy Merts:

Hmmm...

Salvate ogni prova non solo nel file delle statistiche, ma anche nei frame del file MQD? Ho capito bene?

Alexey, annegherai nel flusso di dati.


Ma, se è così importante per voi - posso mettere il vostro codice in TC League.

Il tuo codice è abbastanza trasparente e intelligente, quindi si adatterà quasi senza modifiche, avrò solo bisogno di qualche messa a punto, in modo che tutte le strutture siano all'interno delle mie classi OOP.

Bene... Lo farò, oggi o domani metterò il tuo codice nella Lega... Non ci vedo molto utile, però. Ci sono molti numeri e non riusciamo a vedere la foresta per gli alberi.

I frame sono necessari per far raccogliere tutto dalla rete - ottimizzatori (agenti), non sto usando un solo computer. E quindi il codice non è mio da zero - l'ho parzialmente sventrato dall'articolo sull'ottimizzazione e l'ho adattato alle mie esigenze.

In Expert Advisor, è possibile creare una variabile esterna, secondo la quale le statistiche saranno scritte o meno.

E, tu hai poche variabili esterne nel tuo EA, a differenza del mio mostro, quindi puoi (devi) scrivere il valore delle variabili in una volta sola - aggiungerà alcune righe nel file finale, ma permetterà di lavorare con esso su un livello diverso. Ora sto solo aggiungendo questi valori al file a mano, cioè sto ottimizzando in frammenti.