Работа с фреймами

 

Прошу подсказки у специалистов.

Мучаюсь с функциями обработки результатов тестирования. Не совсем понятен один момент.

В какой момент времени, и каким образом при взаимодействии функций. FrameAdd, FrameNext, FrameInputs, появляются входные параметры эксперта.
Не получается понять, кто, где и по каким условиям, инициирует передачу входных параметров, чтобы потом они были получены в функции FrameInputs.
Галочки в оптимизируемых параметрах советника выставлены, но но выходе я параметры не получаю. Заранее спасибо.  

 

В обработчике OnTester вы можете добавлять собственные фреймы с данными с помощью FrameAdd - важно, что это все выполняется в агенте тестирования, который может быть удаленными (например, в облаке).

OnTesterInit, OnTesterDeinit,  OnTesterPass вызываются на терминале, где запускается процесс тестирования/оптимизации и откуда раздаются задания агентам. Внутри OnTesterPass вы можете получить доступ ко всем тем фреймам, которые были добавлены в агентах тестирования с помощью FrameAdd, примерно так (выкушено из старого эксперта, может не компилиться):

void OnTesterPass()
{
  string  name;
  ulong   pass;
  long    id;
  double  value, data[];
  string  params[];
  uint    par_count;
  string  output = "";
  ushort eq = StringGetCharacter("=", 0);

  while(FrameNext(pass, name, id, value, data)) // data - массив положенный во фрейм с помощью FrameAdd
  {
    output = pass + ";" + (data[0]);
    
    for(int i = 1; i < 10; i++) output += ";" + data[i];
    
    if(FrameInputs(pass, params, par_count))
    {
      for(uint i = 0; i < par_count; i++)
      {
        string pair[];
        int n = StringSplit(params[i], eq, pair);
        if(n == 2)
        {
          long pvalue, pstart, pstep, pstop;
          bool enabled = false;
          if(ParameterGetRange(pair[0], enabled, pvalue, pstart, pstep, pstop))
          {
            if(enabled)
            {
              output += ";" + pair[1];
            }
          }
        }
      }
    }
    
    output += "\n";
    // TODO: FileWriteString(fhandle, output);
  }
}
 
Спасибо, но непонятки остались. :-)

Попробую уточнить.

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

1. Эксперт должен их сформировать и передать через FrameAdd в массиве data? (В примерах на сайте я не нашел такого решения)

2. Или они добавляются автоматически при передаче фрейма?

3. Или каким-либо иным способом? 

По другому говоря. Что или кто и каком месте программы делает некие действия, чтобы потом в функции FrameInputs появились эти значения? Спасибо.


FrameInputs(pass, params, par_count))


 
_anatoly:
Спасибо, но непонятки остались. :-)

Попробую уточнить.

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

1. Эксперт должен их сформировать и передать через FrameAdd в массиве data? (В примерах на сайте я не нашел такого решения)

2. Или они добавляются автоматически при передаче фрейма?

3. Или каким-либо иным способом? 

По другому говоря. Что или кто и каком месте программы делает некие действия, чтобы потом в функции FrameInputs появились эти значения? Спасибо. 

Посмотрите вот эту статью: Рецепты MQL5 - Сохраняем результаты оптимизации торгового эксперта по указанным критериям

 

Да.. уже штудировал.

Раскрыто все, кроме моего вопроса. Спасибо...

 
_anatoly:

Да.. уже штудировал.

Раскрыто все, кроме моего вопроса. Спасибо...

Попробуйте ещё раз внимательно прочитать. Желательно последовательно всё повторить. Там есть ответы и на Ваши вопросы.
 
_anatoly:
Спасибо, но непонятки остались. :-)

Попробую уточнить.

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

1. Эксперт должен их сформировать и передать через FrameAdd в массиве data? (В примерах на сайте я не нашел такого решения)

2. Или они добавляются автоматически при передаче фрейма?

3. Или каким-либо иным способом? 

По другому говоря. Что или кто и каком месте программы делает некие действия, чтобы потом в функции FrameInputs появились эти значения? Спасибо.


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

int fhandle = -1;

void OnTesterInit()
{
  // готовим каким-то образом файл, как нам нужно
  fhandle = FileOpen("tester-" + _Symbol + GetTickCount() + ".csv", FILE_WRITE|FILE_CSV|FILE_ANSI);
  FileWriteString(fhandle, "Pass;First;LR;Profit;Expected Payoff;Profit Factor;Recovery Factor;Sharpe Ratio;Custom;Equity DD %;Trades\n");
}

void OnTesterDeinit()
{
  FileClose(fhandle);
}

double OnTester()
{
  // собираем данные по эквити
  double LR = CountChannels(Equity);
  
  // конструируем собственный критерий оптимизации
  double result = MathAbs(LR) * TesterStatistics(STAT_PROFIT) * TesterStatistics(STAT_PROFIT_FACTOR) * TesterStatistics(STAT_TRADES) * (100 - TesterStatistics(STAT_EQUITY_DDREL_PERCENT));

  // рассчитываем еще какие-то данные
  //...

  // складываем все в массив
  double data[10];
  // data[0] = first;
  // data[1] = LR;
  // data[2] = TesterStatistics(STAT_PROFIT);
  // ...
  // data[7] = result;
  // ...
  // data[9] = ...

  // отправляем данные в терминал
  if(!FrameAdd(MQL5InfoString(MQL5_PROGRAM_NAME), 1, LR, data))
    Print("Frame add error: ", GetLastError());
  else
    Print("Frame added, Ok");

  return(result);
}
 
marketeer:

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

Ситуация такова. Я все делал правильно. Просто после Вашей подсказки начал копать в другом направлении. 

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

Если общее количество шагов становится в какой то степени,  типа 2,1234567786 e+019, то они передаваться перестают.    

Решение своего вопроса я нашел. Немного убавить количество параметров - не проблема. А вот теоретически объяснить проблему прошу Вас. Может это глюк, а может свойство тестера? Кажется я где то читал, что алгоритм тестирования может меняться в зависимости от числа оптимизируемых параметров.  Входные параметры  действительно включаются во фрейм автоматом.     

Спасибо, уважаемый marketeer.

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

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

Хотя, плюс минус всего одна галочка.  Не понятно.

В сервис деск напишу. :-) 

 
_anatoly:

Хотя, плюс минус всего одна галочка.  Не понятно. 

В сервис деск напишу. :-) 

Напишите нам сюда потом о результате.
Причина обращения: