Разные результаты. Как? Почему? Чему верить?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сергей Таболин
2651
Сергей Таболин  

Запускаю полный перебор. Файл записывается. И всё время разной длины. Может из-за ТФ, но ТФ никаким боком не должен влиять на результат! Ибо дальше инит ничего не идёт!

Как, почему? Или это глюк тестера?


//+------------------------------------------------------------------+
//|                                               KrL_write_func.mq5 |
//|                                     Copyright 2018, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Tabolin S.N."
#property link      "https://www.mql5.com/ru/users/vip.avos"
#property version   "1.00"
//+------------------------------------------------------------------+
typedef void(*TFunc)(void);
TFunc entry_func[7];
//+------------------------------------------------------------------+
enum f_entry
{
   no_f,             // не использовать
   reb,              // отскок
   brd1,             // пробой 1
   brd2,             // пробой 2
   lim,              // лимитный
   lw,               // недельный
   cust,             // пользовательский
};

input    f_entry  func_entry_1         = reb;            // 1-я функция условий входа
input    f_entry  func_entry_2         = brd1;           // 2-я функция условий входа
input    f_entry  func_entry_3         = brd2;           // 3-я функция условий входа
input    f_entry  func_entry_4         = lim;            // 4-я функция условий входа
input    f_entry  func_entry_5         = lw;             // 5-я функция условий входа
input    f_entry  func_entry_6         = cust;           // 6-я функция условий входа

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if(paramIncorrect()) return(INIT_PARAMETERS_INCORRECT);
   else
   {
      string   filename    = "KR\\func.txt";
      int      filehandle  = FileOpen(filename,FILE_WRITE|FILE_READ|FILE_TXT|FILE_ANSI|FILE_COMMON);
      if(filehandle != INVALID_HANDLE)
      {
         FileSeek(filehandle,0,SEEK_END);
         string str = string(func_entry_1)+","+string(func_entry_2)+","+string(func_entry_3)+","+string(func_entry_4)+","+string(func_entry_5)+","+string(func_entry_6)+"\n";
         
         if(FileWriteString(filehandle,str) == 0) Print("Ошибка записи файла");
         FileClose(filehandle);
      }
      
      return(INIT_FAILED);
   }

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   
}
//+------------------------------------------------------------------+
bool paramIncorrect()
{
   bool     ret_func = false;
   
   if(func_entry_1 == no_f && func_entry_2 == no_f && func_entry_3 == no_f && func_entry_4 == no_f && 
      func_entry_5 == no_f && func_entry_6 == no_f) return(true);
//--- Порядок следования
   if(func_entry_1 == no_f)                                                                                       ret_func = true;
   else if(func_entry_2 == no_f && (func_entry_3 != no_f || func_entry_4 != no_f || func_entry_5 != no_f || 
                                    func_entry_6 != no_f))                                                        ret_func = true;
   else if(func_entry_3 == no_f && (func_entry_4 != no_f || func_entry_5 != no_f || func_entry_6 != no_f))        ret_func = true;
   else if(func_entry_4 == no_f && (func_entry_5 != no_f || func_entry_6 != no_f))                                ret_func = true;
   else if(func_entry_5 == no_f &&  func_entry_6 != no_f)                                                         ret_func = true;
//--- Повторяемость
   if(func_entry_1 == reb  && (func_entry_2 == reb    || func_entry_3 == reb  || func_entry_4 == reb  || 
                               func_entry_5 == reb    || func_entry_6 == reb))                                    ret_func = true;
   if(func_entry_1 == brd1 && (func_entry_2 == brd1   || func_entry_3 == brd1 || func_entry_4 == brd1 || 
                               func_entry_5 == brd1   || func_entry_6 == brd1))                                   ret_func = true;
   if(func_entry_1 == brd2 && (func_entry_2 == brd2   || func_entry_3 == brd2 || func_entry_4 == brd2 || 
                               func_entry_5 == brd2   || func_entry_6 == brd2))                                   ret_func = true;
   if(func_entry_1 == lim  && (func_entry_2 == lim    || func_entry_3 == lim  || func_entry_4 == lim  || 
                               func_entry_5 == lim    || func_entry_6 == lim))                                    ret_func = true;
   if(func_entry_1 == lw   && (func_entry_2 == lw     || func_entry_3 == lw   || func_entry_4 == lw   || 
                               func_entry_5 == lw     || func_entry_6 == lw))                                     ret_func = true;
   if(func_entry_1 == cust && (func_entry_2 == cust   || func_entry_3 == cust || func_entry_4 == cust || 
                               func_entry_5 == cust   || func_entry_6 == cust))                                   ret_func = true;
   
   if(func_entry_2 == reb  && (func_entry_3 == reb    || func_entry_4 == reb  || 
                               func_entry_5 == reb    || func_entry_6 == reb))                                    ret_func = true;
   if(func_entry_2 == brd1 && (func_entry_3 == brd1   || func_entry_4 == brd1 || 
                               func_entry_5 == brd1   || func_entry_6 == brd1))                                   ret_func = true;
   if(func_entry_2 == brd2 && (func_entry_3 == brd2   || func_entry_4 == brd2 || 
                               func_entry_5 == brd2   || func_entry_6 == brd2))                                   ret_func = true;
   if(func_entry_2 == lim  && (func_entry_3 == lim    || func_entry_4 == lim  || 
                               func_entry_5 == lim    || func_entry_6 == lim))                                    ret_func = true;
   if(func_entry_2 == lw   && (func_entry_3 == lw     || func_entry_4 == lw   || 
                               func_entry_5 == lw     || func_entry_6 == lw))                                     ret_func = true;
   if(func_entry_2 == cust && (func_entry_3 == cust   || func_entry_4 == cust || 
                               func_entry_5 == cust   || func_entry_6 == cust))                                   ret_func = true;
   
   if(func_entry_3 == reb  && (func_entry_4 == reb    || 
                               func_entry_5 == reb    || func_entry_6 == reb))                                    ret_func = true;
   if(func_entry_3 == brd1 && (func_entry_4 == brd1   || 
                               func_entry_5 == brd1   || func_entry_6 == brd1))                                   ret_func = true;
   if(func_entry_3 == brd2 && (func_entry_4 == brd2   || 
                               func_entry_5 == brd2   || func_entry_6 == brd2))                                   ret_func = true;
   if(func_entry_3 == lim  && (func_entry_4 == lim    || 
                               func_entry_5 == lim    || func_entry_6 == lim))                                    ret_func = true;
   if(func_entry_3 == lw   && (func_entry_4 == lw     || 
                               func_entry_5 == lw     || func_entry_6 == lw))                                     ret_func = true;
   if(func_entry_3 == cust && (func_entry_4 == cust   || 
                               func_entry_5 == cust   || func_entry_6 == cust))                                   ret_func = true;
   
   if(func_entry_4 == reb  && (func_entry_5 == reb    || func_entry_6 == reb))                                    ret_func = true;
   if(func_entry_4 == brd1 && (func_entry_5 == brd1   || func_entry_6 == brd1))                                   ret_func = true;
   if(func_entry_4 == brd2 && (func_entry_5 == brd2   || func_entry_6 == brd2))                                   ret_func = true;
   if(func_entry_4 == lim  && (func_entry_5 == lim    || func_entry_6 == lim))                                    ret_func = true;
   if(func_entry_4 == lw   && (func_entry_5 == lw     || func_entry_6 == lw))                                     ret_func = true;
   if(func_entry_4 == cust && (func_entry_5 == cust   || func_entry_6 == cust))                                   ret_func = true;
   
   if(func_entry_5 == reb  && func_entry_6 == reb)                                                                ret_func = true;
   if(func_entry_5 == brd1 && func_entry_6 == brd1)                                                               ret_func = true;
   if(func_entry_5 == brd2 && func_entry_6 == brd2)                                                               ret_func = true;
   if(func_entry_5 == lim  && func_entry_6 == lim)                                                                ret_func = true;
   if(func_entry_5 == lw   && func_entry_6 == lw)                                                                 ret_func = true;
   if(func_entry_5 == cust && func_entry_6 == cust)                                                               ret_func = true;
   
   if(ret_func) return(true);
   
   return(false);
}
Файлы:
Сергей Таболин
2651
Сергей Таболин  

Переписал рассчёт допустимых вариантов:

//+------------------------------------------------------------------+
//|                                          KrL_write_func_tick.mq5 |
//|                                     Copyright 2018, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Tabolin S.N."
#property link      "https://www.mql5.com/ru/users/vip.avos"
#property version   "1.00"
//+------------------------------------------------------------------+
enum f_entry
{
   no_f,             // не использовать
   reb,              // отскок
   brd1,             // пробой 1
   brd2,             // пробой 2
   lim,              // лимитный
   lw,               // недельный
   cust,             // пользовательский
};

int  func_entry_1         = 0;            // 1-я функция условий входа
int  func_entry_2         = 0;           // 2-я функция условий входа
int  func_entry_3         = 0;           // 3-я функция условий входа
int  func_entry_4         = 0;            // 4-я функция условий входа
int  func_entry_5         = 0;             // 5-я функция условий входа
int  func_entry_6         = 0;           // 6-я функция условий входа

int      num_entry[][6];
string   str = "";
int      num_entry_size = 1;
int      num_entry_vars = 0;
//---
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
   ResetLastError();
   string   filename    = "KR\\func.bin";
   int      filehandle  = FileOpen(filename,FILE_WRITE|FILE_READ|FILE_BIN|FILE_COMMON);
   if(filehandle != INVALID_HANDLE)
   {
      FileSeek(filehandle,0,SEEK_END);
      //string str = string(func_entry_1)+","+string(func_entry_2)+","+string(func_entry_3)+","+string(func_entry_4)+","+string(func_entry_5)+","+string(func_entry_6)+"\n";
      
      if(FileWriteArray(filehandle,num_entry) == 0) Print("Ошибка записи файла "+string(GetLastError()));
      FileClose(filehandle);
   }
   
   ResetLastError();
   filename    = "KR\\func.txt";
   filehandle  = FileOpen(filename,FILE_WRITE|FILE_READ|FILE_TXT|FILE_COMMON);
   if(filehandle != INVALID_HANDLE)
   {
      FileSeek(filehandle,0,SEEK_END);
      //string str = string(func_entry_1)+","+string(func_entry_2)+","+string(func_entry_3)+","+string(func_entry_4)+","+string(func_entry_5)+","+string(func_entry_6)+"\n";
      
      if(FileWriteString(filehandle,str) == 0) Print("Ошибка записи файла "+string(GetLastError()));
      FileClose(filehandle);
   }
   
   Print("Всего проходов "+string(num_entry_vars));
   Print("Всего допустимых вариантов "+string(num_entry_size-1));
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   int   var1,
         var2,
         var3,
         var4,
         var5,
         var6;
   
   for(var1 = 0; var1 < 7; var1++)
   {
      for(var2 = 0; var2 < 7; var2++)
      {
         for(var3 = 0; var3 < 7; var3++)
         {
            for(var4 = 0; var4 < 7; var4++)
            {
               for(var5 = 0; var5 < 7; var5++)
               {
                  for(var6 = 0; var6 < 7; var6++)
                  {
                     func_entry_1 = var1;
                     func_entry_2 = var2;
                     func_entry_3 = var3;
                     func_entry_4 = var4;
                     func_entry_5 = var5;
                     func_entry_6 = var6;
                     
                     if(!paramIncorrect())
                     {
                        ArrayResize(num_entry,num_entry_size);
                        
                        str += string(func_entry_1)+","+string(func_entry_2)+","+string(func_entry_3)+","+string(func_entry_4)+","+string(func_entry_5)+","+string(func_entry_6)+"\n";
                        
                        num_entry[num_entry_size-1][0] = func_entry_1;
                        num_entry[num_entry_size-1][1] = func_entry_2;
                        num_entry[num_entry_size-1][2] = func_entry_3;
                        num_entry[num_entry_size-1][3] = func_entry_4;
                        num_entry[num_entry_size-1][4] = func_entry_5;
                        num_entry[num_entry_size-1][5] = func_entry_6;
                        
                        num_entry_size += 1;
                     }
                     num_entry_vars += 1;
                  }
               }
            }
         }
      }
   }
   
   ExpertRemove();
}
//+------------------------------------------------------------------+
bool paramIncorrect()
{
   bool     ret_func = false;
   
   if(func_entry_1 == no_f && func_entry_2 == no_f && func_entry_3 == no_f && func_entry_4 == no_f && 
      func_entry_5 == no_f && func_entry_6 == no_f) return(true);
//--- Порядок следования
   if(func_entry_1 == no_f)                                                                                       ret_func = true;
   else if(func_entry_2 == no_f && (func_entry_3 != no_f || func_entry_4 != no_f || func_entry_5 != no_f || 
                                    func_entry_6 != no_f))                                                        ret_func = true;
   else if(func_entry_3 == no_f && (func_entry_4 != no_f || func_entry_5 != no_f || func_entry_6 != no_f))        ret_func = true;
   else if(func_entry_4 == no_f && (func_entry_5 != no_f || func_entry_6 != no_f))                                ret_func = true;
   else if(func_entry_5 == no_f &&  func_entry_6 != no_f)                                                         ret_func = true;
//--- Повторяемость
   if(func_entry_1 == reb  && (func_entry_2 == reb    || func_entry_3 == reb  || func_entry_4 == reb  || 
                               func_entry_5 == reb    || func_entry_6 == reb))                                    ret_func = true;
   if(func_entry_1 == brd1 && (func_entry_2 == brd1   || func_entry_3 == brd1 || func_entry_4 == brd1 || 
                               func_entry_5 == brd1   || func_entry_6 == brd1))                                   ret_func = true;
   if(func_entry_1 == brd2 && (func_entry_2 == brd2   || func_entry_3 == brd2 || func_entry_4 == brd2 || 
                               func_entry_5 == brd2   || func_entry_6 == brd2))                                   ret_func = true;
   if(func_entry_1 == lim  && (func_entry_2 == lim    || func_entry_3 == lim  || func_entry_4 == lim  || 
                               func_entry_5 == lim    || func_entry_6 == lim))                                    ret_func = true;
   if(func_entry_1 == lw   && (func_entry_2 == lw     || func_entry_3 == lw   || func_entry_4 == lw   || 
                               func_entry_5 == lw     || func_entry_6 == lw))                                     ret_func = true;
   if(func_entry_1 == cust && (func_entry_2 == cust   || func_entry_3 == cust || func_entry_4 == cust || 
                               func_entry_5 == cust   || func_entry_6 == cust))                                   ret_func = true;
   
   if(func_entry_2 == reb  && (func_entry_3 == reb    || func_entry_4 == reb  || 
                               func_entry_5 == reb    || func_entry_6 == reb))                                    ret_func = true;
   if(func_entry_2 == brd1 && (func_entry_3 == brd1   || func_entry_4 == brd1 || 
                               func_entry_5 == brd1   || func_entry_6 == brd1))                                   ret_func = true;
   if(func_entry_2 == brd2 && (func_entry_3 == brd2   || func_entry_4 == brd2 || 
                               func_entry_5 == brd2   || func_entry_6 == brd2))                                   ret_func = true;
   if(func_entry_2 == lim  && (func_entry_3 == lim    || func_entry_4 == lim  || 
                               func_entry_5 == lim    || func_entry_6 == lim))                                    ret_func = true;
   if(func_entry_2 == lw   && (func_entry_3 == lw     || func_entry_4 == lw   || 
                               func_entry_5 == lw     || func_entry_6 == lw))                                     ret_func = true;
   if(func_entry_2 == cust && (func_entry_3 == cust   || func_entry_4 == cust || 
                               func_entry_5 == cust   || func_entry_6 == cust))                                   ret_func = true;
   
   if(func_entry_3 == reb  && (func_entry_4 == reb    || 
                               func_entry_5 == reb    || func_entry_6 == reb))                                    ret_func = true;
   if(func_entry_3 == brd1 && (func_entry_4 == brd1   || 
                               func_entry_5 == brd1   || func_entry_6 == brd1))                                   ret_func = true;
   if(func_entry_3 == brd2 && (func_entry_4 == brd2   || 
                               func_entry_5 == brd2   || func_entry_6 == brd2))                                   ret_func = true;
   if(func_entry_3 == lim  && (func_entry_4 == lim    || 
                               func_entry_5 == lim    || func_entry_6 == lim))                                    ret_func = true;
   if(func_entry_3 == lw   && (func_entry_4 == lw     || 
                               func_entry_5 == lw     || func_entry_6 == lw))                                     ret_func = true;
   if(func_entry_3 == cust && (func_entry_4 == cust   || 
                               func_entry_5 == cust   || func_entry_6 == cust))                                   ret_func = true;
   
   if(func_entry_4 == reb  && (func_entry_5 == reb    || func_entry_6 == reb))                                    ret_func = true;
   if(func_entry_4 == brd1 && (func_entry_5 == brd1   || func_entry_6 == brd1))                                   ret_func = true;
   if(func_entry_4 == brd2 && (func_entry_5 == brd2   || func_entry_6 == brd2))                                   ret_func = true;
   if(func_entry_4 == lim  && (func_entry_5 == lim    || func_entry_6 == lim))                                    ret_func = true;
   if(func_entry_4 == lw   && (func_entry_5 == lw     || func_entry_6 == lw))                                     ret_func = true;
   if(func_entry_4 == cust && (func_entry_5 == cust   || func_entry_6 == cust))                                   ret_func = true;
   
   if(func_entry_5 == reb  && func_entry_6 == reb)                                                                ret_func = true;
   if(func_entry_5 == brd1 && func_entry_6 == brd1)                                                               ret_func = true;
   if(func_entry_5 == brd2 && func_entry_6 == brd2)                                                               ret_func = true;
   if(func_entry_5 == lim  && func_entry_6 == lim)                                                                ret_func = true;
   if(func_entry_5 == lw   && func_entry_6 == lw)                                                                 ret_func = true;
   if(func_entry_5 == cust && func_entry_6 == cust)                                                               ret_func = true;
   
   if(ret_func) return(true);
   
   return(false);
}

и получил нормальный результат:

2018.11.10 22:13:46.339 Core 1  2018.04.02 00:00:00   Всего проходов 117649
2018.11.10 22:13:46.339 Core 1  2018.04.02 00:00:00   Всего допустимых вариантов 1956

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

Иного объяснения я не вижу...

Файлы:
Ihor Herasko
21179
Ihor Herasko  
Отключите генетический алгоритм и будет Вам счастье.
Сергей Таболин
2651
Сергей Таболин  
Ihor Herasko:
Отключите генетический алгоритм и будет Вам счастье.

Первые три слова в первом посте.

Andrey Khatimlianskii
56054
Andrey Khatimlianskii  

Про флаги доступа уже fxsaber подсказал.

В логи агентов смотрели? "Ошибка записи файла" там нет?

На одном агенте попробуйте прогнать.

Сергей Таболин
2651
Сергей Таболин  
Andrey Khatimlianskii:

Про флаги доступа уже fxsaber подсказал.

В логи агентов смотрели? "Ошибка записи файла" там нет?

На одном агенте попробуйте прогнать.

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

Ошибки, баги, вопросы

Сергей Таболин, 2018.11.11 09:23

Изменил.

int      filehandle  = FileOpen(filename,FILE_WRITE|FILE_READ|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_BIN|FILE_COMMON);

Не помогло. 1 - М30, 2 - H4

И в обоих случаях найдено меньше допустимых вариантов. (1956)

А вот на одном агенте всё хорошо прошло и от ТФ результат не меняется.

А "Ошибка записи файла" в логах отсутствует (((
Andrey Khatimlianskii
56054
Andrey Khatimlianskii  
Сергей Таболин:

А вот на одном агенте всё хорошо прошло и от ТФ результат не меняется.

А "Ошибка записи файла" в логах отсутствует (((

Сбросить кэши, запустить оптимизацию на двух ядрах, и проверить их логи?

Записывать после каждого прогона свой файл (имя генерировать уникальное) и проверить кол-во файлов?

Slava
Модератор
13455
Slava  
Сергей Таболин:

А вот на одном агенте всё хорошо прошло и от ТФ результат не меняется.

А "Ошибка записи файла" в логах отсутствует (((

Почему Вы не пишете в лог ошибку открытия файла?

Сергей Таболин
2651
Сергей Таболин  
Slava:

Почему Вы не пишете в лог ошибку открытия файла?

Косяк...

Сча исправлю.

if(paramIncorrect()) return(INIT_PARAMETERS_INCORRECT);
   else
   {
      string   filename    = "KR\\func.txt";
      ResetLastError();
      int      filehandle  = FileOpen(filename,FILE_WRITE|FILE_READ|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_BIN|FILE_COMMON);
      if(filehandle != INVALID_HANDLE)
      {
         FileSeek(filehandle,0,SEEK_END);
         string str = string(func_entry_1)+","+string(func_entry_2)+","+string(func_entry_3)+","+string(func_entry_4)+","+string(func_entry_5)+","+string(func_entry_6)+"\n";
         
         /*num_entry[0][0] = func_entry_1;
         num_entry[0][1] = func_entry_2;
         num_entry[0][2] = func_entry_3;
         num_entry[0][3] = func_entry_4;
         num_entry[0][4] = func_entry_5;
         num_entry[0][5] = func_entry_6;*/

         if(FileWriteString(filehandle,str) == 0) Print("Ошибка записи файла = "+string(GetLastError()));
         FileClose(filehandle);
      }
      else Print("Ошибка открытия файла = "+string(GetLastError()));
      
      return(INIT_FAILED);
   }
Сергей Таболин
2651
Сергей Таболин  

В логах никаких записей об ошибке открытия/записи файла не встречается.

Зато обратил внимание:

FI      0       16:32:12.494    Tester  optimization finished, total passes 117649 (successful 115693 passes)
JI      0       16:32:12.504    Statistics      optimization done in 3 minutes 53 seconds

???

Файлы:
20181113.zip 745 kb
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий