优化一个EA,获得优化后的最佳效果。 - 页 41

 

免费信号--经过重新优化。

目前有6个联盟TS在运行,在我看来是最理想的。

目前中大联赛最受欢迎的结果在前几页

目前的TC为过度优化。

符号 系统 缘由
1 EURCHF 趋势DTS 新的
2 EURCHF 趋势SAR 新的
3 EURCHF 趋势 新的
4 EURCHF ChnFlatSP 新的
5 EURCHF ChnFlatSAR 新的
6 EURCHF ChnFlatRTS 新的
7 EURCHF 趋势RTS 新的
8 EURCHF ChnFlatDTS 新的
9 英镑兑美元 趋势SAR 不容许SL
10 加德满都(CADJPY ChnFlatSAR 不容许SL
11 CHFJPY 淘宝网 大DD
12 美元兑日元 EMAFlatDTS 长时间的最大等待


我把USDJPY EMAFlatDTS

优化期17年5月4日至18年5月15日,从17年10月4日开始向前推进

(由于我过度优化--我将纠正这个帖子,并重新优化TC,从最后一个开始,到第一个)

 
Georgiy Merts:

免费信号- 重新开放。

目前有6个联盟TC在运行,在我看来,这是最理想的。

也许你仍然可以让它将优化结果写入文件?只是标准指标没有给我,我想其他人也没有给多少。

这是我的数据集,它给出了优化器,但我也计划扩大它。

 
Aleksey Vyazmikin:

也许你仍然可以使它能够将优化结果写入文件?只是我和我认为其他人都没有从标准指标中得到什么。

这里是我的一组由优化器提供的数据,但我也计划扩大它。


当然,我的专家顾问里面有所有这些数据。你是否建议我在每次通过后都生成这样一个文件并将其放在文件区?

但我相信,很多人都会看着它?


但是,说,在你的文件 - 我个人不认为这个数字 - 只是 "不能看到森林的树木"。我只看 "恢复系数 "和 "失败 "两栏。

所有其他数据对我来说都是多余的,它们没有告诉我任何新东西。我认为有必要在专家中设置尽可能少的参数,以及尽可能少的评价指标。我想把所有东西都放在一个参数 "质量 "中,但我看到需要另一个参数 "可持续性"。


你说 "这些是我所输出的参数,我打算扩大这组参数"--目标是什么?

给我看一个更具体的例子--你会在哪里使用至少三分之一的这些列,你的输出?你就像邻近话题的参与者一样,写了一个美妙的画布引擎,在图表上显示美妙的视觉效果......但他没有考虑到这些功能的实际用途。获得任何数据都应该有某种特定的用途,应该是选择或TC运作的特定方法的一部分。而 "只是为了拥有"...这些资源最好用在外部系统或新系统的额外再优化上。

当然,在想法中,有可能会打扰到输出文件。好吧,如果至少会有几张票认为这三个参数--质量、缩减和SL队列是不够的--好吧,制作这样一个文件,并将在报告中显示其数据。

 

目前的TC为过度优化。

符号 系统 缘由
1 EURCHF 趋势搜索(ChnTrendSAR 新的
2 EURCHF 趋势 新的
3 EURCHF ChnFlatSP 新的
4 EURCHF ChnFlatSAR 新的
5 EURCHF ChnFlatRTS 新的
6 EURCHF 趋势RTS 新的
7 EURCHF ChnFlatDTS 新的
8 英镑兑美元 趋势搜索(ChnTrendSAR 不容许SL
9 EURCHF EMATrendSP 许多SL
10 GBPAUD 淘宝网 大DD
11 加德满都(CADJPY ChnFlatSAR 不容许SL
12 CHFJPY 淘宝网 大DD
13 GBPNZD EMAFlatSAR 长时间的最大等待


我有一个GBPNZD EMAFlatSAR

17年5月5日至18年5月5日期间,从17年10月5日开始向前推进。

 

受宠的现况

(所有的TC都是在没有MM的情况下,以最小的批量进行演示工作)

按质量划分的最佳20名。

质量前十名的图表。

最好的20个通过平衡。

按平衡度计算的最佳10个图表。

提醒一下,交易系统联盟专家(MT4和MT5的版本)是在Yandex-disk 上。档案中还附有一份关于该联盟原则的简要说明和在该联盟工作的TS名单。

默认情况下,该联盟与一个TS(EURUSD ChnTrendSAR, magik 220141)合作,没有任何限制。

其他TS只在策略测试器中工作。对于他们在模拟或真实账户上的工作,需要注册码。注册码,有效期为3个月,并与账号相连接,用于优化个别联盟系统(在四核Core i5上使用2-5小时)。

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


当然,我在专家顾问里面有所有这些数据。你是否建议在每次通过后生成这样一个文件,并把它扔到文件区?

但我相信,很多人都会看的?

你说,"这些是我显示的参数,而且我仍然打算扩大这套参数"--目的是什么?

给我看一个更具体的例子--你会在哪里使用你输出的至少三分之一的列?

当然,在理论上,文件的输出是可能的。好吧,如果至少会有几张票认为这三个参数--质量、下沉和SL队列是不够的--好吧,制作这样一个文件,并将在报告中显示其数据。

让我这样说吧:我突然很想知道我在优化什么样的专家顾问,但不知道他们的具体算法,我决定关注他们的表现,突然发现由于统计指标的贫乏,我无法评估结果。

你说项目参与者应该自己进行选择,但根据现有的数据,这是不现实的。

现在我正在研究一个机械评估系统--主要想法是平衡所有的指标,而不仅仅是它们的绝对值,当然绝对值 也同样重要。

例如,我经常使用 "收入"-"最大连续利润 "*3-"支出"-"最大连续亏损 "*3的公式来估计利润,如果我们仍然处于加法,我们就进一步看,但在这个阶段我们也可以筛选出很多。

而且,缩水我只在自然条件下感知,因为百分比取决于缩水时的累计利润,但这不能说明什么,因为不能保证下一次这种缩水也会发生,只是在累计利润之后。例如,在启动资金为1000的情况下,缩减10%是10个单位,如果10%,利润为2000,就已经是30个单位了,同意这个数字没有可比性。百分比的意义只在于如果每天提取资金,但如果你实施它,那么其他的指标就会蠕动,这些指标是自动计算的,那么你自己就有每个数字,这很麻烦。

如果你以前没有做过,我可以给你我的代码,用于将数据写入文件。

 
Aleksey Vyazmikin:

如果你以前没有做过,我可以给你我的代码,用于将数据写入文件。

你不应该放弃Skype。你可以看一下代码,并找出最好的方法来做。

来吧,你需要什么指标?

我的理解是,在OnTester()函数 中,专家顾问应该在什么时候输出? 我将为您提供这样的功能。它将输出一个CSV文件,可以很容易地在Excel中打开。


我们谈论的是什么专家顾问,是联盟的主要专家顾问,还是针对不同TS的单独专家顾问?

 
Georgiy Merts:

你不应该放弃Skype。你可以看一下代码,研究一下如何最好地做到这一点。

来吧,你需要什么指标?

在什么时候应该由专家顾问输出? 据我所知--在函数OnTester() 中? 我将为您提供这样一个功能。


哦,我们在这里谈论的是什么EA--联盟的主要专家顾问,还是针对不同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联盟中。

你的代码很透明,也很聪明,所以几乎不需要改动就能适应,我只需要稍作修改,让所有的结构都在我的OOP-classes里面。

嗯...我会做的,今天或明天我会把你的代码放在联盟中...不过,我看不出这有什么用。有很多数字,而我们不能从树上看到森林。

 
Georgiy Merts:

嗯...

你是否不仅在统计文件中保存每个测试运行,而且还在MQD文件的框架中保存?我说对了吗?

阿列克谢,你将淹没在数据流中。


但是,如果这对你来说非常重要--我可以把你的代码放在TC联盟中。

你的代码相当透明和聪明,所以它几乎不需要改动就能适应,我只需要进行一些微调,使所有的结构都在我的OOP-classes里面。

嗯...我会做的,今天或明天我会把你的代码放在联盟中...不过我看不出它有什么用处。有很多数字,而我们不能从树上看到森林。

需要帧来使它全部从网络中收集--优化器(代理),我不是用一台电脑。因此,这些代码不是我从头开始的--我从关于优化的文章中部分地挖出了它,并根据我的需要进行了调整。

在专家顾问中,你可以制作一个外部变量,根据这个变量来写出统计数据或不写。

而且,你的EA中的外部变量很少,不像我的怪物,所以你可以(需要)一次性写出变量的值--这将在最终文件中增加几行,但将允许在不同层面上工作。现在我只是用手将这些值添加到文件中,即我在片段中优化的内容。