Expert Advisor를 최적화하고 최적화된 조언을 최대한 활용하십시오. - 페이지 41

 

자유로운 신호 - 재발견.

현재 6개의 TS 리그가 운영 중이며 가장 최적인 것 같습니다.

TS 리그 즐겨찾기 작업의 현재 결과 는 이전 페이지에 있습니다.

재최적화를 위한 현재 차량:

아니요. 상징 체계 원인
하나 EURCHF ChnTrendDTS 새로운
2 EURCHF ChnTrendSAR 새로운
EURCHF ChnTrendSP 새로운
4 EURCHF ChnFlatSP 새로운
5 EURCHF ChnFlatSAR 새로운
6 EURCHF ChnFlatRTS 새로운
7 EURCHF ChnTrendRTS 새로운
여덟 EURCHF ChnFlatDTS 새로운
아홉 GBPUSD ChnTrendSAR 허용되지 않는 SL
CADJPY ChnFlatSAR 허용되지 않는 SL
열하나 CHFJPY EMAFlatRTS 빅 D.D.
12 USD/JPY EMAFlatDTS 긴 최대 대기


나는 USDJPY EMAFlatDTS를 걸었습니다

최적화 기간 4.05.17 - 4.15.18, 4.10.17부터

(재최적화하면서 이 메시지를 수정하고 마지막 차량부터 첫 번째 차량까지 차량을 재최적화합니다.)

 
Georgiy Merts :

자유로운 신호 - 재발견.

현재 6개의 TS 리그가 운영 중이며 가장 최적인 것 같습니다.

여전히 최적화 결과를 파일에 기록할 수 있습니까? 표준 지표가 나에게 거의 제공하지 않는 것일 뿐이며 다른 사람들도 생각합니다.

여기 옵티마이저가 제공하는 데이터 세트가 있지만 확장할 계획입니다.

 
Aleksey Vyazmikin :

여전히 최적화 결과를 파일에 기록할 수 있습니까? 표준 지표가 나에게 거의 제공하지 않는 것일 뿐이며 다른 사람들도 생각합니다.

여기 옵티마이저가 제공하는 데이터 세트가 있지만 확장할 계획입니다.


물론, 나는 Expert Advisor 안에 이 모든 데이터를 가지고 있습니다. 각 패스 후에 그러한 파일을 형성하고 파일 영역에 던지겠다고 제안합니까?

그러나 많은 사람들이 그를 볼 것이라고 확신합니까?


자, 예를 들어, 귀하의 파일에서 - 저는 개인적으로 이 숫자를 인식하지 못합니다. 여기 "나무 대신 숲을 볼 수 없습니다". "복구 계수" 및 "Prosad" 열만 보고 있습니다.

다른 모든 데이터는 나에게 불필요하며 새로운 것을 보고하지 않습니다. Expert Advisors에는 가능한 한 적은 매개 변수와 평가를 위한 가능한 적은 지표가 필요하다고 생각합니다. 하나의 "품질" 매개변수로 모든 작업을 수행할 것이지만 "안정성" 매개변수도 필요하다는 것을 알 수 있습니다.


"여기에 표시되는 매개변수가 있으며 나는 여전히 이 세트를 확장할 계획입니다"라고 말합니다. 목표는 무엇입니까?

좀 더 구체적인 예를 들어 보여주세요. 표시하는 열의 1/3 이상을 어디에 사용하시겠습니까? 그렇지 않으면 다음 주제에서 캔버스 작업을 위한 멋진 엔진을 작성한 참가자와 같으며 멋진 시각 효과가 차트에 표시되지만 이러한 기능의 실질적인 이점에 대해서는 생각하지 않습니다. 데이터를 얻는 것은 특정 이점이 있어야 하며 TS 선택 또는 운영을 위한 특정 방법론의 일부여야 합니다. 그리고 "그냥" ... 외부 시스템 또는 새로운 시스템의 추가 재최적화에 이러한 리소스를 사용하는 것이 좋습니다.

물론 이론상 파일의 출력과 혼동될 수 있습니다. 글쎄, 품질, 드로다운 및 라인 대기열의 세 가지 매개변수가 충분하지 않다는 사실에 대해 적어도 몇 표 더 투표가 있으면 글쎄, 그런 파일을 만들고 보고서에 데이터를 표시할 것입니다.

 

재최적화를 위한 현재 차량:

아니요. 상징 체계 원인
하나 EURCHF ChnTrendSAR 새로운
2 EURCHF ChnTrendSP 새로운
EURCHF ChnFlatSP 새로운
4 EURCHF ChnFlatSAR 새로운
5 EURCHF ChnFlatRTS 새로운
6 EURCHF ChnTrendRTS 새로운
7 EURCHF ChnFlatDTS 새로운
여덟 GBPUSD ChnTrendSAR 허용되지 않는 SL
아홉 EURCHF EMATrendSP 많은 SL
GBPAUD EMAFlatRTS 빅 D.D.
열하나 CADJPY ChnFlatSAR 허용되지 않는 SL
12 CHFJPY EMAFlatRTS 빅 D.D.
열셋 GBPNZD EMAFlatSAR 긴 최대 대기


나는 GBPNZD EMAFlatSAR를 설정했다

기간 05/05/17 - 05/05/18, 10/5/17부터

 

즐겨찾기별 현황

(모든 차량은 MM 없이 데모에서 작동하며 최소 로트가 있습니다)

품질 상위 20위:

상위 10개 품질 차트:

잔액 기준 상위 20위:

잔액별 상위 10개 차트:

Expert League of Trading Systems(MT4 및 MT5용 버전)은 Yandex 디스크 에 있습니다. 아카이브에는 리그 TS의 작동 원리에 대한 간략한 설명과 리그에서 작동하는 TS 목록도 포함되어 있습니다.

기본적으로 리그는 제한 없이 하나의 TS(EURUSD ChnTrendSAR, magic 220141)에서 작동합니다.

다른 TS는 전략 테스터에서만 작동합니다. 데모 또는 실제 작업에는 등록 코드가 필요합니다. 개별 리그 시스템 최적화(쿼드 코어 Core i5의 경우 2~5시간)를 위해 계정 번호를 기준으로 3개월 동안 유효한 등록 코드가 발급됩니다.

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


물론, 나는 Expert Advisor 안에 이 모든 데이터를 가지고 있습니다. 각 패스 후에 그러한 파일을 형성하고 파일 영역에 던지겠다고 제안합니까?

그러나 많은 사람들이 그를 볼 것이라고 확신합니까?

"여기에 표시되는 매개변수가 있으며 나는 여전히 이 세트를 확장할 계획입니다"라고 말합니다. 목표는 무엇입니까?

좀 더 구체적인 예를 들어 보여주세요. 표시하는 열의 1/3 이상을 어디에 사용하시겠습니까?

물론 이론상 파일의 출력과 혼동될 수 있습니다. 글쎄, 품질, 드로다운 및 라인 대기열의 세 가지 매개변수가 충분하지 않다는 사실에 대해 적어도 몇 표 더 투표가 있으면 글쎄, 그런 파일을 만들고 보고서에 데이터를 표시할 것입니다.

내가 어떤 어드바이저를 최적화하고 있는지 보는 것이 갑자기 흥미로워졌지만 정확한 알고리즘을 알지 못하고 그들의 작업 결과에 집중하기로 결정하고 갑자기 결과를 평가할 수 없다는 것을 깨달았습니다. 통계 지표의 부족으로 인한 작업.

프로젝트 참여자들이 스스로 선택해야 한다고 말하지만, 이는 사용 가능한 데이터를 기반으로 했을 때 현실적이지 않습니다.

이제 저는 기계적 평가 시스템을 연구하고 있습니다. 주요 아이디어는 모든 지표의 균형이며 절대값 뿐만 아니라 물론 그만큼 중요합니다.

예를 들어, 나는 종종 "수입" - "최대 연속 이익" * 3 - "비용" - "최대 연속 손실" * 3 공식을 사용하여 이익을 평가하고, 여전히 흑자 상태에 있으면 더 멀리 바라보지만 이 단계에서도 많이자를 수 있습니다.

그리고 하락시 누적이익에 따라 비율이 달라지기 때문에 물리적으로만 하락을 인지하지만, 다음에도 같은 방식으로 하락이 일어난다는 보장이 없기에 뭐라 말할 수는 없습니다. 누적 이익 후 . 예를 들어, 시작 자본이 1000이고 10%의 손실이 발생했습니다. 이것은 10단위이고, 10%가 2000의 이익을 낸다면 이것은 이미 30단위이며, 지표가 비교할 수 없다는 데 동의합니다. 퍼센티지의 의미는 매일 자금을 인출하는 경우에만 해당되지만 이를 구현하면 자동으로 계산되는 다른 지표가 사라지고 각 지표를 직접 계산해야 하는 번거로움이 있습니다.

이전에 이 작업을 수행하지 않은 경우 파일에 데이터를 쓰는 코드를 제공할 수 있습니다.

 
Aleksey Vyazmikin :

이전에 이 작업을 수행하지 않은 경우 파일에 데이터를 쓰는 코드를 제공할 수 있습니다.

Skype를 거부한 것은 헛된 일입니다. 거기에 있는 코드를 보고 가장 좋은 방법을 알아내는 것이 가능할 것입니다.

자, 어떤 지표가 필요합니까?

그리고 고문은 어느 시점에 그것을 표시해야 합니까? 내가 이해하는 것처럼 - OnTester() 함수 에서? 내가 당신을 위해 이와 같은 일을 할 것입니다. Excel에서 쉽게 열 수 있는 CSV 파일이 출력됩니다.


예, 그리고 우리는 리그의 주요 전문가 또는 개별 TS에 대한 별도의 전문가에 대해 어떤 고문에 대해 이야기하고 있습니까?

 
Georgiy Merts :

Skype를 거부한 것은 헛된 일입니다. 거기에 있는 코드를 보고 가장 좋은 방법을 알아내는 것이 가능할 것입니다.

자, 어떤 지표가 필요합니까?

그리고 고문은 어느 시점에 그것을 표시해야 합니까? 내가 이해하는 것처럼 - OnTester() 함수 에서? 내가 당신을 위해 이와 같은 일을 할 것입니다.


예, 그리고 우리는 리그의 주요 전문가 또는 개별 TS에 대한 별도의 전문가에 대해 어떤 고문에 대해 이야기하고 있습니까?

이렇게 정리했어요

 //--- Кол-во показателей для записи в файл
#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()의 파일에 대한 이러한 출력이 어떻게 작동하는지 궁금합니다. 프레임에는 쓰지만 파일에는 아닐 거라 생각합니다.

Alexey, 당신은 데이터 스트림에 빠져 죽을 것입니다.


그러나 그것이 당신에게 그렇게 중요하다면 TS 리그에 당신의 코드를 넣을 수 있습니다.

모든 것이 당신에게 충분히 투명하고 합리적이므로 코드는 거의 변경 없이 맞을 것이며 모든 구조가 내 OOP 클래스 안에 있도록 약간의 개선만 필요할 것입니다.

글쎄... 내가 할거야, 오늘이나 내일 나는 리그에서 당신의 코드를 채점할거야... 하지만, 나는 이것에서 많은 이점을 보지 못합니다. 많은 숫자가 있고 우리는 나무 때문에 숲을 보지 못할 것입니다.

 
Georgiy Merts :

흠...

그래서 통계 파일뿐만 아니라 MQD 파일의 프레임에도 테스트의 각 패스를 저장합니까? 제가 제대로 이해한건가요?

Alexey, 당신은 데이터 스트림에 빠져 죽을 것입니다.


그러나 그것이 당신에게 그렇게 중요하다면 TS 리그에 당신의 코드를 넣을 수 있습니다.

모든 것이 당신에게 충분히 투명하고 합리적이므로 코드는 거의 변경 없이 맞을 것이며 모든 구조가 내 OOP 클래스 안에 있도록 약간의 개선만 필요할 것입니다.

글쎄... 내가 할거야, 오늘이나 내일 나는 리그에서 당신의 코드를 채점할거야... 하지만, 나는 이것에서 많은 이점을 보지 못합니다. 많은 숫자가 있고 우리는 나무 때문에 숲을 보지 못할 것입니다.

이 모든 것을 네트워크에서 수집하려면 프레임이 필요합니다. 최적화 프로그램(에이전트)이지만 저는 두 대 이상의 컴퓨터를 사용합니다. 따라서 코드는 처음부터 내 것이 아닙니다. 최적화에 대한 기사에서 부분적으로 발췌하여 필요에 맞게 조정했습니다.

통계 작성 여부에 따라 Expert Advisor에서 외부 변수를 만들 수 있습니다.

그리고 내 괴물과 달리 Expert Advisor에는 외부 변수가 거의 없으므로 변수 값을 즉시 쓸 수 있습니다. 이렇게 하면 최종 파일에 몇 줄이 추가되지만 작업을 할 수 있습니다 다른 수준에서. 이제 이 값을 내 손으로 파일에 추가합니다. 프래그먼트에서 최적화할 때 최적화한 것입니다.

사유: