EAを最適化し、最適化されたものを手に入れる。 - ページ 41

 

フリー信号- 再最適化されました。

現在、6つのリーグTSが稼働していますが、これが最も最適なものと思われます。

現在のCUリーグの優勝候補の結果は前ページの 通りです。

過剰最適化に対する現在のTC。

シンボルマーク システム 理由
1 ユーロスイスフラン ChnTrendDTS 新規
2 ユーロスイスフラン ChnTrendSAR 新規
3 ユーロスイスフラン ChnTrendSP 新規
4 ユーロスイスフラン ChnFlatSP 新規
5 ユーロスイスフラン ChnFlatSAR 新規
6 ユーロスイスフラン ChnFlatRTS 新規
7 ユーロスイスフラン ChnTrendRTS 新規
8 ユーロスイスフラン ChnFlatDTS 新規
9 GBPUSD ChnTrendSAR 不可 SL
10 カナダ円 ChnFlatSAR 不可 SL
11 CHFJPY EMAFlatRTS ビッグDD
12 米ドル円 EMAFlatDTS 最大待ち時間が長い


USDJPY EMAFlatDTS を入れてみました。

最適化期間 17年5月4日~18年4月15日、17年10月4日以降順延

(最適化しすぎたので、この投稿を訂正し、TCを最後のものから最初のものへと最適化し直します)

 
Georgiy Merts:

フリー信号- 再開されました。

現在、6人のリーグTCが働いていますが、これが最も最適な状態だと思われます。

それでも最適化結果をファイルに書き出せるようにすることはできるのでは?ただ、標準的な指標は私に与えてくれないし、他の人もあまり与えてくれないと思う。

これは私のデータセットで、オプティマイザを与えていますが、これも拡張する予定です。

 
Aleksey Vyazmikin:

それでも最適化結果をファイルに書き出せるようにしたらいいのでは?ただ、私や他の人もそうだと思いますが、標準的な指標からはあまり得るものがないんです。

これは、オプティマイザーが提供する私のデータセットですが、これも拡張していく予定です。


もちろん、これらのデータはすべてExpert Advisorの中に入っています。パスが通過するたびに、そのようなファイルを生成してファイルエリアに置くということでしょうか?

でも、きっと多くの人が見てくれるのではないでしょうか?


しかし、あなたのファイルで、言う - 私は個人的にこの図を感知しない - ちょうど "木のために森を見ることができない"。リカバリーファクター」と「失敗」の欄だけを見ています。

それ以外のデータは、私にとって余計なものであり、新しいことを教えてくれるものではありません。エキスパートにおけるパラメータはできるだけ少なく、評価のための指標もできるだけ少なくすることが必要だと思います。私はすべてを「品質」という1つのパラメーターに集約していましたが、もう1つ「持続可能性」というパラメーターが必要なんですね。


これは私が出力したパラメータであり、このセットを拡張していくつもりです」とおっしゃっていますが、何を目指しているのでしょうか?

もっと具体的な例を挙げてください。出力した列のうち、少なくとも3分の1はどこで使うのでしょうか?まるで、隣のトピックの参加者で、チャートに素晴らしい視覚効果を表示する、素晴らしいキャンバスエンジンを書いた人みたいですね...。しかし、その機能を実用化することは考えていなかった。データを取得することは、特定の用途、特定の選択方法、またはTC操作の一部であるべきです。そして、「持つだけ」...。このようなリソースは、外部システムの追加的な最適化や新システムの導入に費やした方がよいでしょう。

アイデアとしては、もちろん、出力ファイルに悩むことも可能です。品質、ドローダウンとSLキューは十分ではありません - - まあ、少なくともカップルより多くの投票がある場合は、そのようなファイルを作成し、レポートにそのデータが表示されます。

 

過剰最適化に対する現在のTC。

シンボルマーク システム 理由
1 ユーロスイスフラン ChnTrendSAR 新規
2 ユーロスイスフラン ChnTrendSP 新規
3 ユーロスイスフラン ChnFlatSP 新規
4 ユーロスイスフラン ChnFlatSAR 新規
5 ユーロスイスフラン ChnFlatRTS 新規
6 ユーロスイスフラン ChnTrendRTS 新規
7 ユーロスイスフラン ChnFlatDTS 新規
8 GBPUSD ChnTrendSAR 不可 SL
9 ユーロスイスフラン EMATrendSP 多くのSL
10 GBPAUD EMAFlatRTS ビッグDD
11 カナダ円 ChnFlatSAR 不可 SL
12 CHFJPY EMAFlatRTS ビッグDD
13 GBPNZD EMAFlatSAR 最大待ち時間が長い


GBPNZD EMAFlatSARを持っています。

期間17.05.00~18.05.00、17.10.00より繰り上げ

 

お気に入りに関する現在の状況

(全てのTCはMMなし、最小ロットでデモに取り組む)。

品質別ベスト20。

品質トップ10のチャート。

バランスによるベスト20。

バランス別チャートベスト10

念のため、Trading Systems League Expert(MT4とMT5の両方のバージョン)はYandex-diskに あります。また、アーカイブには、連盟の原則の簡単な説明と、連盟で活動しているTSのリストが添付されています。

デフォルトでは、リーグは1つのTS(EURUSD ChnTrendSAR、magik 220141)で制限なく機能します。

その他のTSはストラテジーテスターでのみ動作します。デモまたはリアルアカウントでの作業には、登録コードが必要です。アカウント番号と連動して3ヶ月間有効な登録コードが発行され、個々のリーグシステムの最適化を行います(クアッドコアCore i5で2~5時間)。

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


もちろん、これらのデータはすべてExpert Advisorの中に入っています。パス毎にそのようなファイルを生成し、ファイル領域に放り込むということでしょうか?

でも、きっと多くの人が見てくれるのではないでしょうか?

これは私が表示するパラメーターであり、このセットはまだ拡張するつもりです」とおっしゃいますが、目的は何でしょうか?

もっと具体的な例を示してください。出力した列の少なくとも3分の1はどこで使うのでしょうか?

理論的にはもちろん出力可能です。まあ、3つのパラメータ - 品質、沈下、SLキューが十分ではないことを少なくともカップルより多くの投票がある場合は - まあ、そのようなファイルを作成し、レポートにそのデータを表示します。

言ってみれば、最適化しているExpert Advisorがどんなものか急に気になったのですが、その正確なアルゴリズムが分からないまま、パフォーマンスに注目しようと思い、ふと統計指標が少ないため、結果を評価できないことに気がつきました。

選考はプロジェクト参加者が自ら行うべきとおっしゃいますが、入手可能なデータからすると現実的ではありません。

今、私は機械的な評価システムに取り組んでいます。主なアイデアは、すべての指標のバランスをとることで、その絶対値だけ ではありません。

例えば、「収入」-「最大連続利益」*3-「支出」-「最大連続損失」*3という式で利益を推定し、まだプラスであればさらに調べることが多いですが、この段階でもかなりふるい落としができます。

また、ドローダウンは、ドローダウン時の累積利益に依存するため、自然な形でしか認識できないが、累積利益の後だけに、次回もこのドローダウンが発生するという保証はないため、何も言うことはない。例えば、起動資金1000で10%のドローダウンなら10口、2000の利益で10%なら既に30口であり、数値は比較にならないことに同意する。毎日資金を引き出すだけなら割合の意味はあるが、それを実行すると他の指標が忍び寄り、自動計算され、自分でそれぞれの数字を持つことになり、面倒である。

データをファイルに書き込むための私のコードを、もしやったことがなければお教えしますよ。

 
Aleksey Vyazmikin:

データをファイルに書き込むための私のコードを、もしやったことがなければお教えしますよ。

Skypeをあきらめるべきではありませんでした。コードを見て、最適な方法を考えることができたはずです。

さあ、どんな指標が必要なんだ?

また、どの時点でExpert Advisorから出力されるべきでしょうか? 私の理解では、OnTester()関数で? 私はそのような機能を作るでしょう。Excelで簡単に開くことができるCSVファイルが出力されます。


また、Expert Advisorとは、リーグのメインのExpert Advisorなのか、それとも異なるTS用の別々のEAなのか、どのようなものなのでしょうか?

 
Georgiy Merts:

Skypeをあきらめるべきではありませんでした。コードを見て、どうするのがベストなのかを考えてもよかったのでは?

さあ、どんな指標が必要なんだ?

また、どの時点でExpert Advisorから出力されるべきでしょうか。 私の理解では、関数OnTester()で? 私はそのような機能を作るでしょう。


ああ、ここで言うEAとは、リーグのメインのExpert Advisorなのか、それとも異なるTSのための別々のEAなのか?

私はこのように整理しています。

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

  }

コードに不具合があるのか、最後のフレームが全部来ないこともありますが、いつもというわけではなく、ナンバリングが一致することもあります。一般的にはプログラムの不具合だと思うのですが、もしコードのバグを見つけたら教えてください


そして、どのEAで - はい、あなたがすることができ、最適化の対象となるすべてのことである。

 

うーん...。

各テストランは、統計ファイルだけでなく、MQDファイルのフレームにも保存されていますか?ちゃんと理解できたかな?

また、テスターのパスがクラウドにある場合、OnTesterPass()でファイルへの出力はどのように機能するのでしょうか?フレーム内では書き込まれますが、ファイル内では書き込まれないのではないでしょうか。

アレクセイ、君はデータの流れに溺れてしまうよ。


しかし、もしそれがあなたにとってとても重要なことであるなら、私はあなたのコードをTCリーグに入れることができます。

あなたのコードは非常に透明で巧妙なので、ほとんど変更せずにフィットすると思います。

まあ...今日か明日、あなたのコードをリーグに入れるから......。あまり意味がないような気もしますが。数字が多くて、木を見て森を見ずになってしまう。

 
Georgiy Merts:

うーん...。

各テストランは、統計ファイルだけでなく、MQDファイルのフレームにも保存されていますか?ちゃんと理解できたかな?

アレクセイ、君はデータの流れに溺れてしまうよ。


しかし、もしそれがあなたにとってとても重要なことであるなら、私はあなたのコードをTCリーグに入れることができます。

あなたのコードは非常に透明でスマートなので、ほとんど変更せずにフィットすると思います。

まあ...今日か明日、あなたのコードをリーグに入れるから......。あまり使い道がないような気もしますが。数字が多くて、木を見て森を見ずになってしまう。

フレームは、ネットワークからすべて収集させるために必要です。オプティマイザー(エージェント)、私は1台のコンピュータを使っているわけではありません。というわけで、このコードは私が一から書いたものではなく、最適化に関する記事から部分的に腑分けして、私のニーズに合わせてアレンジしたものです。

Expert Advisorでは、外部変数を作成し、その変数に従って統計情報を書き込むかどうかを設定することができます。

また、私のモンスターと違って、あなたのEAでは外部変数が少ないので、変数の値を一度に書くことができます(書く必要があります) - 最終ファイルに数行追加されますが、別のレベルで作業することができます。今は、これらの値を手作業でファイルに追加しているだけで、つまり断片的に最適化しているのです。