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

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

MetaTrader 5 Strategy Tester!

Andrey Dik, 2016.11.22 23:37

Ну и, собственно, сама ФФ, красавица, собственной персоной:

string Key [60] = { "A", "a", "B", "b", "C", "c", "D", "d", "E", "e", "F", "f", "G", "g", "H", "h", "I", "i", "J", "j", "K", "k", "L", "l", "M", "m", "N", "n", "O", "o", "P", "p", "Q", "q", "R", "r", "S", "s", "T", "t", "U", "u", "V", "v", "W", "w", "X", "x", "Y", "y", "Z", "z", " ", "—", ",", ".", "\"", "/", "\"", "'" };
Дубль.
 
fxsaber:
Не знаю, нужно обращает ли MT5 при ГА на размер шага. Если нет - имеет резон.
Конечно обращает. Штатный тестер рассчитывает число вариантов параметров исходя из диапазона и шага и работает с выбранным шагом. Кроме того, для тестов нужно соблюдать идентичность условий испытания если мы хотим достоверное сравнение. 
 
fxsaber:
Дубль.

Дубль значит дубль. Тем хуже для алгоритмов.)))

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

 
Andrey Dik:
Конечно обращает. Штатный тестер рассчитывает число вариантов параметров исходя из диапазона и шага и работает с выбранным шагом.
Ну так это для полного перебора нужен расчет. Для ГА, как и в Вашем алгоритме, задание шага по боку.
 
fxsaber:
Ну так это для полного перебора нужен расчет. Для ГА, как и в Вашем алгоритме, задание шага по боку.

Нет, не побоку. Очень не побоку. Я не постесняюсь даже сказать - чудовищно не побоку.

Если в тестере указать старт 0 шаг 59 и конечное значение 59 то оптимизатор будет пробовать только два числа 0 и 59. Равенство условий проведения теста соблюдено не будет в этом случае. 

Мой алго может работать с 0-м шагом, но мало ли что он может, когда для конкретной задачи имеет смысл только шаг 1?

Например, зачем оптимизировать период машек с дробным шагом? Так и тут. 

 
Andrey Dik:

для конкретной задачи имеет смысл только шаг 1?

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

Так же у Вас

max = keyLen; // Должен быть keyLen - 1
 
fxsaber:
FF - черный ящик. Так что никаких подсказок быть не должно. Если Вы своему алгоритму подсказали шаг, то это некорректно.

Хорошая постановка вопроса, новичков даже можно поставить в тупик и заставить надолго задуматься...

Но всё объясняется очень просто. Хоть ФФ и черный ящик, но диапазон параметров мы знаем, а раз так, то имеем право выбирать, насколько точно нам делать поиск. Пользователь имеет право выбирать между точностью и скоростью, но это в повседневной жизни пользователь выбирает шаг.

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

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

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

 

Пост отредактирован. 

 
fxsaber:

Так же у Вас

max = keyLen; // Должен быть keyLen - 1

И что? Это внутри ФФ и никого волновать не должно.

Советник вызывает GetParamCount () из ФФ что бы узнать, сколько параметров оптимизировать.

Кроме того, посмотрите внимательно ФФ, она сама сообщает сколько и чего и с каким шагом оптимизировать. Отсюда, вообще то,  и шаг 1, одинаковый для всех конкретно для этой ФФ.

 
Andrey Dik:

И что? Это внутри ФФ и никого волновать не должно.

Советник вызывает GetParamCount () из ФФ что бы узнать, сколько параметров оптимизировать.

Кроме того, посмотрите внимательно ФФ, она сама сообщает сколько и чего и с каким шагом оптимизировать. Отсюда, вообще то,  и шаг 1, одинаковый для всех конкретно для этой ФФ.

Это все верно, если запускать исключительно из MQL. А на R человек задаст для этой задачи диапазон (на единицу меньше), соответствующий длине алфавита.

Вы бы немного подправили для полной корректности и делов то. Сам я не правил это дело, только ускорил FF, чтобы ждать не так долго нужно было.

#property library
#property strict

int  countRuns    = 0;

const int Key[] = { 'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z', ' ', '—', ',', '.', '\"', '/', '\"', ''' };
const int keyLen  = ArraySize(Key);

string Text     = "President-elect Donald Trump and the Republican-controlled Congress are drawing up plans to take on the government bureaucracy they have long railed against, by eroding job protections and grinding down benefits that federal workers have received for a generation. Hiring freezes, an end to automatic raises, a green light to fire poor performers, a ban on union business on the government’s dime and less generous pensions — these are the contours of the blueprint emerging under Republican control of Washington in January. These changes were once unthinkable to federal employees, their unions and their supporters in Congress. But Trump’s election as an outsider promising to shake up a system he told";
const int    textLen  = StringLen(Text);

int TextINT[];

int GetPos( const int Char )
{
  for (int i = 0; i < keyLen; i++)
    if (Char == Key[i])
      return(i);
      
  return(-1);
}

void SetTextINT( void )
{
  ArrayResize(TextINT, textLen);
  
  for (int i = 0; i < textLen; i++)
    TextINT[i] = GetPos(Text[i]);
}

int GetCodeINT (double param)
{
  int p = (int)MathRound (param);
  if(p < 0)
    p = 0;
  else if(p > keyLen - 1)
    p = keyLen - 1;
  
  return (p);
}

//+------------------------------------------------------------------+
int GetParamCount () export
{
  SetTextINT();
  return (textLen);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void GetParamProperties (double &min, double &max, double &step) export
{
  min = 0.0;
  max = keyLen;
  step = 1.0;
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
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(GetCodeINT(param[i]) == TextINT[i])
      ffVolue++;
  }
  
  return (double(ffVolue));
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
int GetCountRunsFF () export
{
  return (countRuns);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void PrintCodeToFile (double &param []) export
{
  int sizeArray = ArraySize (param);
  if(sizeArray != textLen)
  {
    Print ("Неверное количество параметров, печать в файл производится не будет!");
    return;
  }
  
  string code = "";
  
  for(int i = 0; i < textLen; i++)
  {
    code += GetCode (param [i]);
  }
  
  int handle = FileOpen ("decodeFF.csv", FILE_READ | FILE_WRITE | FILE_ANSI | FILE_CSV);
  
  if(handle == INVALID_HANDLE)
  {
    Print ("Ошибка записи в файл востановленного текста ФФ. Ошибка: " + (string)GetLastError ());
    return;
  }
  FileWriteString (handle, code);
  FileClose (handle);
}
//+------------------------------------------------------------------+

string GetCode (double param)
{
  int p = (int)MathRound (param);
  if(p < 0)
    p = 0;
  if(p > keyLen - 1)
    p = keyLen - 1;
  
  return (CharToString((uchar)Key[p]));
}
 
Кстати, просто показать, что Облако при ГА тормозит даже за рамками оверхеда. Для этого нужно сделать искусственно тормозную FF.