Оптимизируй советника - и получи лучшего из оптимизированных. - страница 41

 

Бесплатный сигнал - переоткрыл заново.

В настоящее время там работает 6 ТС Лиги, которые представляются мне наиболее оптимальными.

Текущие результаты работы фаворитов Лиги ТС - на предыдущих страницах.

Текущие ТС на переоптимизацию:

Символ Система Причина
1 EURCHF ChnTrendDTS New
2 EURCHF ChnTrendSAR New
3 EURCHF ChnTrendSP New
4 EURCHF ChnFlatSP New
5 EURCHF ChnFlatSAR New
6 EURCHF ChnFlatRTS New
7 EURCHF ChnTrendRTS New
8 EURCHF ChnFlatDTS New
9 GBPUSD ChnTrendSAR Not allowed SL
10 CADJPY ChnFlatSAR Not allowed SL
11 CHFJPY EMAFlatRTS Big DD
12 USDJPY EMAFlatDTS Long Max Wait


Ставлю USDJPY EMAFlatDTS

Период оптимизации 4.05.17 - 4.15.18, форвард с 4.10.17

(По мере переоптимизации - исправляю данное сообщение, и переоптимизирую ТС, начиная с последних - к первым)

 
Georgiy Merts:

Бесплатный сигнал - переоткрыл заново.

В настоящее время там работает 6 ТС Лиги, которые представляются мне наиболее оптимальными.

Может всё ж таки сделаешь возможность писать в файл результаты оптимизации? Просто стандартные показатели мне, да и думаю другим, мало чего дают.

Вот мой набор данных, которые даёт оптимизатор, но я и его планирую расширять.

 
Aleksey Vyazmikin:

Может всё ж таки сделаешь возможность писать в файл результаты оптимизации? Просто стандартные показатели мне, да и думаю другим, мало чего дают.

Вот мой набор данных, которые даёт оптимизатор, но я и его планирую расширять.


Разумеется, все эти данные у меня внутри эксперта есть. Предлагаешь после каждого прохода формировать такой файл, и кидать его в файловую область  ? 

Но уверен, что многие на него будут глядеть ?


Вот, скажем, в твоем файле - лично я эту цифирь - просто не воспринимаю, тут "за деревьями леса не видно". Я гляжу лишь на колонки "Фактор восстановления", и "Просад".

Все остальные данные - для меня лишние, ничего нового они не сообщают. Считаю, необходимо иметь как можно меньше и параметров в экспертах, и как можно меньше показателей для оценки. Я бы вобще все вложил в один параметр "качества", но вижу, что нужен еще параметр "устойчивость".


Ты говоришь "вот какие параметры выводятся у меня, и я еще намерен этот набор расширить" - цель какая ?

Покажи на более конкретном примере - где бы ты использовал хотя бы треть из тех колонок, которые ты выводишь ? А то ведь ты уподобляешься участнику, который в соседней теме - написал замечательный движок работы с канвасом, на график выводятся чудные визуальные эффекты... но только не подумал о практической пользе данных возможностей. Получение любых данных должно нести какую-то конкретную пользу, входить в конкретную методика отбора или работы ТС. А "просто, чтобы было"... Лучше эти ресурсы потратить на дополнительную переоптимизацию систем-аутсайдеров, либо новых систем.

По идее, конечно, заморочиться с выводом файла можно. Ну, если будет хотя бы еще пара голосов за то, что трех параметров - качества, просада и очереди СЛ не хватает - ну, сделаю такой файл, и буду в отчетах выводить его данные.

 

Текущие ТС на переоптимизацию:

Символ Система Причина
1 EURCHF ChnTrendSAR New
2 EURCHF ChnTrendSP New
3 EURCHF ChnFlatSP New
4 EURCHF ChnFlatSAR New
5 EURCHF ChnFlatRTS New
6 EURCHF ChnTrendRTS New
7 EURCHF ChnFlatDTS New
8 GBPUSD ChnTrendSAR Not allowed SL
9 EURCHF EMATrendSP Many SL
10 GBPAUD EMAFlatRTS Big DD
11 CADJPY ChnFlatSAR Not allowed SL
12 CHFJPY EMAFlatRTS Big DD
13 GBPNZD EMAFlatSAR Long Max Wait


Ставлю у себя GBPNZD EMAFlatSAR

Период 5.05.17 - 5.05.18, форвард с 5.10.17

 

Текущая ситуация по фаворитам

(Все ТС работают на демо без ММ, с минимальными лотами)

Лучшие 20 по качеству:

Чарт лучших 10 по качеству:

Лучшие 20 по балансу:

Чарт лучших 10 по балансу:

Напоминаю, эксперт Лига Торговых Систем (версии как для МТ4 так и для МТ5) находится на Яндекс-диске. В архив также вложено краткое описание принципов работы ТС Лиги и список ТС, работающих в ней.

По умолчанию Лига работает по одной ТС,  (EURUSD ChnTrendSAR, магик 220141) без каких-либо ограничений.

Остальные ТС работают только в тестере стратегий. Для их работы на демо или реале необходимы регистрационные коды. Регистрационные коды, действительные 3 месяца с привязкой к номеру аккаунта выдаются за оптимизацию отдельных систем Лиги (2-5 часов работы четырехъядерного Core i5).

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


Разумеется, все эти данные у меня внутри эксперта есть. Предлагаешь после каждого прохода формировать такой файл, и кидать его в файловую область  ? 

Но уверен, что многие на него будут глядеть ?

Ты говоришь "вот какие параметры выводятся у меня, и я еще намерен этот набор расширить" - цель какая ?

Покажи на более конкретном примере - где бы ты использовал хотя бы треть из тех колонок, которые ты выводишь ?

По идее, конечно, заморочиться с выводом файла можно. Ну, если будет хотя бы еще пара голосов за то, что трех параметров - качества, просада и очереди СЛ не хватает - ну, сделаю такой файл, и буду в отчетах выводить его данные.

Скажу так, мне вдруг стало интересно посмотреть, что за советники я оптимизирую, но не зная их точного алгоритма, я решил упор сделать на результат их работы, и вдруг понял, что результат работы я не могу оценить из-за скудности статистических показателей.

Ты говоришь, что участники проекта должны сами делать отбор, но это не реально исходя из имеющихся данных.

Сейчас я работаю над механической системой оценки - главной идеей является сбалансированность всех показателей, а не только их абсолютное значение, которое, конечно, так же важно.

К примеру я часто использую для оценки прибыль по такой формуле "Доход"-"Максимальная непрерывная прибыль"*3-"Расход"-"Максимальный непрерывный убыток"*3, и если мы ещё в плюсе, то смотрим дальше, но  и на данном этапе можно многое отсеить.

И, просадку я только воспринимаю в натуральных показателях, так как процент зависит от накопленной прибыли к моменту возникновения просадки, но это ни о чём не может говорить так-как нет гарантии, что в следующий раз эта просадка возникнет так же, только после накопленной прибыли. К примеру получил просадку 10% при стартовом капитале 1000 - это 10 единиц, а если 10% при прибыли 2000, то это уже 30 единиц, согласись, что показатели не сопоставимы. Смысл в процентах только если делать вывод средств каждый день, но если это реализовать, то будут съезжать другие показатели, которые автоматически рассчитываются, тогда надо уже каждый показатель самому считать, что хлопотно.

Могу дать свой код для записи данных в файл, если ты ранее этого не делал.

 
Aleksey Vyazmikin:
 

Могу дать свой код для записи данных в файл, если ты ранее этого не делал.

Вот напрасно ты отказался от скайпа. Можно было бы там и код поглядеть, и прикинуть, как лучше сделать.

Давай, какие показатели тебе нужны ?

И в какой момент их должен выводить советник ?  Как я понимаю - в функции OnTester() ?  Сделаю тебе такую фичу. Будет выводиться CSV-файл, который легко открывается в Excel'e.


Да, и о каком советнике речь - об главном эксперте Лиге, или об отдельных экспертах для отдельных ТС ?

 
Georgiy Merts:

Вот напрасно ты отказался от скайпа. Можно было бы там и код поглядеть, и прикинуть, как лучше сделать.

Давай, какие показатели тебе нужны ?

И в какой момент их должен выводить советник ?  Как я понимаю - в функции OnTester() ?  Сделаю тебе такую фичу.


Да, и о каком советнике речь - об главном эксперте Лиге, или об отдельных экспертах для отдельных ТС ?

У меня это организовано так

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

  }

В коде есть глюк, а может и не в коде - иногда не приходит последний фрейм из всех, но это не всегда, а иногда нумерация может совпать. Вообще, думаю, что это глюк программы, но если ты увидешь ошибку в коде, то скажи!


А в какие советники - да можно и во все, что подлежат оптимизации.

 

Хм...

Так у тебя вобще сохраняется каждый проход теста не только в файл статистики, но еще и во фреймы MQD файла ? Я правильно понял ?

Кроме того - интересно, а как будет работать такой вывод в файл на OnTesterPass(), если проход тестера идет в Облаке ? Во фрейм-то запишется, а вот в файл, подозреваю, нет.

Алексей, утонешь в потоке данных.


Но, если для тебя это так важно - я могу твой код уложить в Лигу ТС.

У тебя все достаточно прозрачно и толково, так что код подойдет практически без изменений,  потребуется лишь небольшая доработка, чтобы все структуры были внутри моих ООП-классов.

Ну... Займусь, сегодня-завтра забью твой код в Лигу... Хотя, не вижу в этом особой пользы. Цифири много, и за деревьями леса не увидим.

 
Georgiy Merts:

Хм...

Так у тебя вобще сохраняется каждый проход теста не только в файл статистики, но еще и во фреймы MQD файла ? Я правильно понял ?

Алексей, утонешь в потоке данных.


Но, если для тебя это так важно - я могу твой код уложить в Лигу ТС.

У тебя все достаточно прозрачно и толково, так что код подойдет практически без изменений,  потребуется лишь небольшая доработка, чтобы все структуры были внутри моих ООП-классов.

Ну... Займусь, сегодня-завтра забью твой код в Лигу... Хотя, не вижу в этом особой пользы. Цифири много, и за деревьями леса не увидим.

Фреймы нужны для того, что бы это все собиралось из сети - оптимизаторов(агентов), я же не один компьютер использую. А так, код не с нуля мой - я его частично выпотрошил из статьи про оптимизацию и адаптировал под свои нужды.

В советнике можно сделать внешнюю переменную, согласно которой статистика будет писаться или не будет.

И, у тебя мало внешних переменных в советнике, в отличии от моего монстра, поэтому можно (нужно) значение переменных сразу писать - это добавит несколько строчек в итоговый файл, но позволит с ним работать на другом уровне. Я же сейчас просто руками потом добавляю в файл эти значения, т.е. то, что оптимизировал так-как оптимизирую фрагментами.

Причина обращения: