MetaTrader 5 Strategy Tester! - страница 73

 

Не знаю, не могу понять код Dr.Trader'а...

Может кто нибудь, кто разбирается в R, определить объективное соответствие логик ФФ? Может быть кто из MQ? И Бурнаков чего то не кстати пропал... 

 
Оригинальный код MQL от Андрея - 
double FF (double &param []) export
{
  countRuns++;
  
  int sizeArray = ArraySize (param);
  if(sizeArray != TextLen)
    return (0.0);
  
  int ffVolue = 0;
  
  for(int i = 0; i < TextLen; i++)
  {
    if(GetCode (param [i]) == StringSubstr (Text, i, 1))
      ffVolue++;
  }
  
  // сохранение результатов
  if(CompareBests (ffVolue))
    SaveResults (BestResults, ffVolue);
  SaveResults (AllResults, ffVolue);
  
  return (double(ffVolue));
}

Этот-же код портированный на R - 

FF <- cmpfun(function(param)
{
  countRuns <<- countRuns + 1;
  
  
sizeArray <- length(param);
  if(sizeArray != TextLen)
    
return (0.0)
  
  
ffVolue <- 0
  
  
for(i in 1:TextLen)
  
{
    if(GetCode(param [i]) == substr(Text, i, i))
      ffVolue <- ffVolue + 1
  
}
  
  #сохранение результатов
  if(CompareBests(ffVolue))
    BestResults <<- SaveResults (BestResults, ffVolue);
  AllResults <<- SaveResults (AllResults, ffVolue);
  
  return(ffVolue);
})

  

В две колонки. по-моему очевидно что различия минимальны.
Зелёненькое - R.
Серенькое -  R, совпадающий 100% с MQL (я не учитываю указания типов, этого просто нету в R).
"<-" или "<<-" в R это тоже самое что и "=" в mql. Я подставлю такую подмену тут в R коде для удобства. Андрей, можете писать мне в приват, я объясню какие-то другие мелкие отличия если они интуитивно не понятны.

double FF (double &param []) export     FF <- cmpfun(function(param)
{
  countRuns++;                          countRuns = countRuns + 1;
  
  int sizeArray = ArraySize (param);    sizeArray = length(param);
  if(sizeArray != TextLen)              if(sizeArray != TextLen)
    return (0.0);                         return (0.0) 
  
  int ffVolue = 0;                      ffVolue = 0 
  
  for(int i = 0; i < TextLen; i++)      for(i in 1:TextLen) 
  {
    if(GetCode (param [i]) == StringSubstr (Text, i, 1))        if(GetCode(param [i]) == substr(Text, i, i))
      ffVolue++;                                                     ffVolue <- ffVolue + 1 
  }
  
  // сохранение результатов
  if(CompareBests (ffVolue))                 if(CompareBests(ffVolue))
    SaveResults (BestResults, ffVolue);        BestResults = SaveResults (BestResults, ffVolue); 
  SaveResults (AllResults, ffVolue);         AllResults = SaveResults (AllResults, ffVolue);
  
  return (double(ffVolue));                  return(ffVolue);
}

Вот ещё пара отличий
mql: ArraySize()                      R:  length()
mql: i++                                   R: i <- i+1
mql: for(int i=1; i<x; i++)          R: for(i in 1:x)
индексация массивов начинается в mql с 0, а в R с 1

 

 А mql код вы сами писали, или взяли откуда-то? Если вы не можете сравнить две функции которые совпадают синтаксисом на 90%, то я подозреваю вы и mql код тоже не понимаете.

 

 

 

А вот это что - фитнес функция для генетического оптимизатора?

double FF (double &param []) export
{
  countRuns++;
  
  int sizeArray = ArraySize (param);
  if(sizeArray != TextLen)
    return (0.0);
  
  int ffVolue = 0;
  
  for(int i = 0; i < TextLen; i++)
  {
    if(GetCode (param [i]) == StringSubstr (Text, i, 1))
      ffVolue++;
  }
  
  // сохранение результатов
  if(CompareBests (ffVolue))
    SaveResults (BestResults, ffVolue);
  SaveResults (AllResults, ffVolue);
  
  return (double(ffVolue));
}

Ну это никуда не годится.

Примитивный расчет ffVolue - это сплошное введение в заблуждение тестера.

 
Renat Fatkhullin:

А вот это что - фитнес функция для генетического оптимизатора?

Да, фитнесс функция, или то что будет выполнятся в OnTester() 

Я портировал код Андрея с mql на R, это его требование. Совпадения синтаксиса около 90%, посмотрите пожалуйста мой пост выше, я указал отличия.

 
Dr.Trader:

Да, фитнесс функция, или то что будет выполнятся в OnTester() 

Я портировал код Андрея с mql на R, это его требование. Совпадения синтаксиса около 90%, посмотрите пожалуйста мой пост выше, я указал отличия.

Вы в упор не видите, что вы глупостью занимаетесь - как такой фитнес функцией вы собрались что-то оптимизировать?

  for(int i = 0; i < TextLen; i++)
  {
    if(GetCode (param [i]) == StringSubstr (Text, i, 1))
      ffVolue++;
  }

Она же совершенно вредительская и занимается убийством генетического механизма.

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

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

Возможно, фитнес функцию лучше переписать как зависимость веса результата от угаданной позиции. Это выпрямит ситуацию, избавит от жестких границ [0, 1, 2, 3, ...] без полутонов и даст непрекращающую линию улучшения результата вместо лимита [0, TextLen].

 
Renat Fatkhullin:

Вы в упор не видите, что вы глупостью занимаетесь - как такой фитнес функцией вы собрались что-то оптимизировать?

  for(int i = 0; i < TextLen; i++)
  {
    if(GetCode (param [i]) == StringSubstr (Text, i, 1))
      ffVolue++;
  }

Она же совершенно вредительская и занимается убийством генетического механизма.

Я тоже высказывал подобные мысли. На мой взгляд функция будет иметь множество плоских поверхностей, которые генетике сложно преодолеть. В советниках функции должны быть более гладкими.

Андрей (Andrew Dik) предложил померяться алгоритмами на конкретно такой функции - я вообщем-то не против, почемубы и нет. 

 
Dr.Trader:

Я тоже высказывал подобные мысли. На мой взгляд функция будет иметь множество плоских поверхностей, которые генетике сложно преодолеть. В советниках функции должны быть более гладкими.

Возможно, фитнес функцию лучше переписать как зависимость веса результата от угаданной позиции. Это выпрямит ситуацию, избавит от жестких границ [0, 1, 2, 3, ...] без полутонов и даст непрекращающую линию улучшения результата вместо лимита [0, TextLen].

Например: это грубая идея, надо лучше подумать и подобрать формулу

for(int i = 0; i < TextLen; i++)
  {
    if(GetCode (param [i]) == StringSubstr (Text, i, 1))
      ffVolue += 1 + i*0.01;
  }


А текущая функция - чистое вредительство.

Андрей (Andrew Dik) предложил померяться алгоритмами на конкретно такой функции - я вообщем-то не против, почемубы и нет. 

Я ему не зря писал про самообман.

Достаточно было взглянуть на его код, чтобы сразу увидеть проблемы.

 
Renat Fatkhullin:

Вы в упор не видите, что вы глупостью занимаетесь - как такой фитнес функцией вы собрались что-то оптимизировать?

  for(int i = 0; i < TextLen; i++)
  {
    if(GetCode (param [i]) == StringSubstr (Text, i, 1))
      ffVolue++;
  }

Она же совершенно вредительская и занимается убийством генетического механизма.

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

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

Возможно, фитнес функцию лучше переписать как зависимость веса результата от угаданной позиции. Это выпрямит ситуацию, избавит от жестких границ [0, 1, 2, 3, ...] без полутонов и даст непрекращающую линию улучшения результата вместо лимита [0, TextLen].

Так и задумана ФФ. Что бы быть максимально трудной для алгоритмов оптимизации. Для любых алгоритмов. Понимаете, она специально задумана так, что бы сделать поиск максимально сложным, она возвращает количество совпадений параметров, но не указывает в каких переменных совпадения - в этом и сложность.

Но сейчас вопрос в другом, аналогична ли ФФ написанная на MQL той что написана на R (при одинаковых входных параметрах они должны возвращать одинаковые результаты) и одинаково ли к ним обращаются алгоритмы.

 
Dr.Trader:

Я тоже высказывал подобные мысли. На мой взгляд функция будет иметь множество плоских поверхностей, которые генетике сложно преодолеть. В советниках функции должны быть более гладкими.

Андрей (Andrew Dik) предложил померяться алгоритмами на конкретно такой функции - я вообщем-то не против, почемубы и нет. 

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

И задалбали уже коверкать то мою фамилию, то имя. Пишите просто - Joo, или научитесь уже наконец пользоваться копипастом. 

 
Renat Fatkhullin:

Возможно, фитнес функцию лучше переписать как зависимость веса результата от угаданной позиции. Это выпрямит ситуацию, избавит от жестких границ [0, 1, 2, 3, ...] без полутонов и даст непрекращающую линию улучшения результата вместо лимита [0, TextLen].

Например: это грубая идея, надо лучше подумать и подобрать формулу

for(int i = 0; i < TextLen; i++)
  {
    if(GetCode (param [i]) == StringSubstr (Text, i, 1))
      ffVolue += 1 + i*0.01;
  }


А текущая функция - чистое вредительство.

Я ему не зря писал про самообман.

Достаточно было взглянуть на его код, чтобы сразу увидеть проблемы.

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

Погодите, это не последняя тестовая ФФ. Будут и другие, не менее интересные. Но в данном тесте алгоритм от Dr.Trader претендует на первенство, нужно проверить его код (что объективно я не в состоянии) на соответствие обращений его алгоритма к ФФ нашим алгоритмам, моего и Вашего в МТ. Даннаа идентичнось условий гарантирована единой библиотекой ФФ к которой обращается и мой алгоритм и советника для оптимизатора МТ, а вот для кода на R это остаётся под большим вопросом ещё.